2

我想知道在 chrome 代码中,我们是否有更好的方法来检测用户何时选择/突出显示当前页面中的某些内容,而不是监听keyup/mouseup和检查window.getSelection()。有任何想法吗?

编辑:实际上,我想要做的只是阻止用户在 contentDocument 中选择任何文本。实现这一点的东西也会很好。(获得选择事件背后的想法只是为了preventDefault()或以其他方式getSelection().removeAllRanges()

edit2:请注意,我不仅需要防止突出显示,还需要防止选择发生。

edit3:我不需要阻止复制而是选择元素。

4

6 回答 6

4

如果您将以下 scipt 放入正文中,则在 Firefox 中将禁用选择:

<script type="text/javascript">
   document.body.style.MozUserSelect = "none";
   document.body.style.cursor = "default";
</script>

它不仅禁用突出显示,还禁用选择本身。如果您尝试通过鼠标或箭头键(单击一个位置并在SHIFT按下时使用箭头键导航)选择一个区域,然后按STRG+C,则不会发生任何事情。

更改后唯一有效的选择是STRG+A(没有选择可见,但STRG+A&STRG+C复制所有)。可以通过键盘事件来避免这种情况。


编辑:我看到你评论带有Mozilla Doc Center的链接,虽然他们写它只控制外观,但我在 Firefox 3.6 中的所有测试都表明它也会影响选择,而不仅仅是外观。但它可能会在未来的版本中改变......

于 2011-03-22T11:50:11.553 回答
3

如果没有合适的事件,例如selectand selectstart(在 Firefox 中确实不存在,它具有select事件但仅将其应用于表单控件),您所能做的就是使用鼠标和键盘事件,正如您在问题中所建议的那样。阻止文档中所有事件的默认操作mousedown是不好的,因为它会阻止所有交互元素(如链接和表单元素)工作。相反,您可以执行以下操作,在使用鼠标和键盘进行选择时将其删除。

不过,它不会阻止通过上下文和编辑菜单中的“全选”进行选择,因为在 Firefox 中根本无法检测到这些内容。如果您需要处理这个问题,轮询选择是您唯一的希望。

function killSelection() {
    window.getSelection().removeAllRanges();
}

document.addEventListener("mousedown", function(evt) {
    document.addEventListener("mousemove", killSelection, false);
}, false);

document.addEventListener("mouseup", function(evt) {
    document.removeEventListener("mousemove", killSelection, false);
}, false);

document.addEventListener("keydown", killSelection, false);

window.addEventListener("blur", function(evt) {
    document.removeEventListener("mousemove", killSelection, false);
}, false);
于 2011-03-23T11:21:07.037 回答
2

你可以使用 css

-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-o-user-select: none;
user-select: none;
于 2011-06-17T07:38:59.553 回答
1

您可以使用 CSS 来防止用户选择文本。在这里查看我的答案:如何使用 CSS 禁用文本选择突出显示?

要在 Firefox 中通过 JavaScript 进行设置,您可以执行以下操作:

document.body.style.MozUserSelect = "-moz-none";
于 2011-03-06T16:02:50.700 回答
1

复制命令由事件启用和禁用。您可以通过创建命令更新程序来获得有关此事件的通知。

<commandset commandupdater="true" events="select"
            oncommandupdate="setTimeout(selectNone, 0);"/>
于 2011-03-09T00:49:22.370 回答
0

将以下代码添加到 css 文件中,该文件与<link>弹出 html 中的标签链接:

*,
*::before,
*::after {
  user-select: inherit;
}

body {
  user-select: none;
}
于 2021-08-18T13:04:36.400 回答