处理 Firefox 扩展中的文本选择事件(防止用户选择文本)

Posted

技术标签:

【中文标题】处理 Firefox 扩展中的文本选择事件(防止用户选择文本)【英文标题】:Handling text selection event in Firefox extension (preventing user from selecting text) 【发布时间】:2011-07-09 20:16:44 【问题描述】:

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

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

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

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

【问题讨论】:

IE 和 Opera 实现了不可选择的属性(btw) 【参考方案1】:

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

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


body 
  user-select: none;

【讨论】:

【参考方案2】:

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

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

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

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


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

【讨论】:

【参考方案3】:

你可以使用css

-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-o-user-select: none;
user-select: none;

【讨论】:

【参考方案4】:

如果没有合适的事件,例如selectselectstart(在 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);

【讨论】:

【参考方案5】:

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

<commandset commandupdater="true" events="select"
            oncommandupdate="setTimeout(selectNone, 0);"/>

【讨论】:

我需要彻底禁用选择元素的功能,而不是禁用复制命令。【参考方案6】:

您可以使用 CSS 来防止用户选择文本。在这里查看我的答案:How to disable text selection highlighting using CSS?

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

document.body.style.MozUserSelect = "-moz-none";

【讨论】:

只禁用文本突出显示的外观:("Controls the appearance (only) of selection. This does not have any affect on actual selection operation.")。我真的需要完全禁用它。 @CAFxX:在这种情况下,您将返回在 Firefox 中检查键和鼠标事件(keydownmousedown 会比 keyupmouseup 更好),这不会t 支持selectselectstart 事件进行一般选择。即使这样还不够,因为可以通过其他方式更改选择,例如编辑和上下文菜单中的“全选”选项。

以上是关于处理 Firefox 扩展中的文本选择事件(防止用户选择文本)的主要内容,如果未能解决你的问题,请参考以下文章

选择文本时防止 onClick 事件

使用 HTML5 拖放防止拖动事件干扰 Firefox 中的输入元素

防止在 Safari 和 Firefox 中选择和复制表格列?

在 Firefox 中单击 HTML5 视频控件时如何防止事件冒泡

防止 Firefox Web 通知自动关闭

如何防止在Javascript中双击选择文本