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

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

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

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

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

【问题讨论】:

  • IE 和 Opera 实现了不可选择的属性(btw)

标签: javascript firefox firefox-addon dom-events textselection


【解决方案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";
          

          【讨论】:

          猜你喜欢
          • 2015-11-06
          • 2017-04-06
          • 1970-01-01
          • 2017-07-11
          • 2023-02-14
          • 2010-10-27
          • 2015-08-07
          • 1970-01-01
          相关资源
          最近更新 更多