处理 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+A
和 STRG+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】:如果没有合适的事件,例如select
和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);
【讨论】:
【参考方案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 中检查键和鼠标事件(keydown
和 mousedown
会比 keyup
和 mouseup
更好),这不会t 支持select
或selectstart
事件进行一般选择。即使这样还不够,因为可以通过其他方式更改选择,例如编辑和上下文菜单中的“全选”选项。以上是关于处理 Firefox 扩展中的文本选择事件(防止用户选择文本)的主要内容,如果未能解决你的问题,请参考以下文章
使用 HTML5 拖放防止拖动事件干扰 Firefox 中的输入元素
防止在 Safari 和 Firefox 中选择和复制表格列?