【问题标题】:Disable text selection but allow cut, copy, and paste禁用文本选择但允许剪切、复制和粘贴
【发布时间】:2018-01-19 12:06:06
【问题描述】:

这是一个列表组件,允许您选择、剪切、复制、粘贴和拖放以重新排列列表项。问题是 Chrome 中的 user-select: none 似乎禁用了剪切、复制和粘贴事件,即使它应用于子级而不是父级。

我创建了以下 JSFiddle 来重现该问题: https://jsfiddle.net/c1n4vv7j/10/

<div tabindex="0" oncut="alert('hello')">
    <li>Click Here and Hit CTRL+X</li>
    <li>Works in Firefox and Edge but not Chrome!</li>
</div>

如果您按照说明操作,您应该会在 Firefox 和 Edge 中看到一个弹出窗口,但不是 Chrome 61。到目前为止,我发现的唯一解决方法是在顶部创建一个高度为 1px 并具有 onclick 事件的

  • 选择它,那么
      仍然可以继续接收剪贴板事件。这种解决方案是不可取的,也不允许选择元素上的文本。

      我开始确信这实际上可能是 Chrome 中的一个错误,并且它不符合 HTML5 剪贴板规范,该规范说即使没有选择任何东西,事件仍然应该触发,只是有一个焦点节点。

      任何人都知道一个很好的解决方法,或者我应该向 Chrome 报告这个吗?

      编辑:

      如果您更改剪切处理程序以向我们显示 activeElement,它会报告 div,而事件目标报告正文:

    $("*").on("cut", function(event){
      console.log(event.target);
      console.log(document.activeElement);
    });
    
  • 【问题讨论】:

      标签: javascript css html google-chrome clipboard


      【解决方案1】:

      不要使用用户选择:无。

      希望对你有帮助

      div > li{
      -webkit-user-select: auto;
      -moz-user-select: auto;
      -ms-user-select: auto;
      user-select: auto;
      }
      
      div > li::selection {
          background: rgba(0,0,0,0); //you can use transparent also
      }
      

      火狐

      div > li::selection {
          background: rgba(0,0,0,0); //you can use transparent also
      } 
      

      【讨论】:

      • 抱歉,D&D 是必需的,并且在 Chrome 中设置 draggable="true" 会自动将 user-select: none 从用户代理样式表添加到
    • 让用户选择在 chrome 中自动
    • 我不喜欢这个解决方案,因为它会干扰默认选择行为,而不是简单地禁用它。理想情况下,我更喜欢使用 user-select: none;而不必担心draggable是否添加它。因此,尽管此解决方案确实有效,但并不理想。
    • 【解决方案2】:

      事件被触发,只是不在您期望的节点上。该事件是在 &lt;body&gt; 而不是在您的 &lt;div&gt; 上触发的:https://jsfiddle.net/DerekL/c1n4vv7j/12/

      规范确实指出:

      要触发 e 类型的剪贴板事件,

      1. 让 clear-was-call 为假
      2. 让 types-to-clear 为空列表
      3. 让 clipboard-entry 为当前剪贴板内容的序号,如果操作系统剪贴板不支持序号,则为 null
      4. 如果事件由用户代理生成,则让trusted为真,否则为假
      5. 如下设置目标:
        • 如果上下文是可编辑的:
          • 让 target 是包含文档顺序中选择的开始的元素,或者如果没有选择或光标,则为 body 元素。
        • 否则,如果上下文不可编辑
          • 让 target 成为焦点节点,如果没有节点有焦点,则为 body 元素。

      我认为这是一个“错误”,因为节点确实收到了 focus 事件但没有收到 cut 事件,但请记住,user-select 属性仍然是草案而不是标准。

      【讨论】:

      • 这正是我所看到的部分,所以是的,我相信这证实了它是一个错误。焦点节点应该是目标,当我们点击它时,我们可以清楚地看到它是焦点节点,因为它是蓝色的轮廓。首先我要报告它......但仍在寻找解决它的方法......
      【解决方案3】:

      就我而言,我需要在表格单元格中添加自定义选择行为,以保持复制和粘贴的能力。由于在 Firefox 中使用 user-select: none 会产生错误行为,因此我使用 selection 伪元素解决了问题,删除了默认文本选择:

          table td::selection {
            background: none;
          }
      

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签