双击后阻止文本选择

IT技术 javascript selection-object
2021-01-30 00:41:01

我正在我的网络应用程序中处理跨度上的 dblclick 事件。一个副作用是双击会选择页面上的文本。我怎样才能防止这种选择发生?

6个回答
function clearSelection() {
    if(document.selection && document.selection.empty) {
        document.selection.empty();
    } else if(window.getSelection) {
        var sel = window.getSelection();
        sel.removeAllRanges();
    }
}

您还可以将这些样式应用于所有非 IE 浏览器和 IE10 的 span:

span.no_selection {
    user-select: none; /* standard syntax */
    -webkit-user-select: none; /* webkit (safari, chrome) browsers */
    -moz-user-select: none; /* mozilla browsers */
    -khtml-user-select: none; /* webkit (konqueror) browsers */
    -ms-user-select: none; /* IE10+ */
}
双击禁用选择和完全禁用它是有区别的。第一个增加了可用性。二是递减。
2021-03-20 00:41:01
有什么方法可以实际阻止选择而不是事后删除选择?此外,为了更好的可读性,您的第二个 if 语句可以在 else if 内。
2021-03-29 00:41:01
这现在在 IE10 中可用,-ms-user-select: none;请参阅blogs.msdn.com/b/ie/archive/2012/01/11/... @PaoloBergantino
2021-04-07 00:41:01
最好使用 -webkit- 前缀(这是基于 Webkit 的浏览器的首选前缀)以及 -moz-(如果您有大量的 Konqueror 受众,则使用 -khtml-)。
2021-04-11 00:41:01
@TimHarper:就使用库的 Javascript 解决方案而言,当然。不太确定为什么这需要投反对票。
2021-04-11 00:41:01

在普通的javascript中:

element.addEventListener('mousedown', function(e){ e.preventDefault(); }, false);

或者使用 jQuery:

jQuery(element).mousedown(function(e){ e.preventDefault(); });
@johnktejik 仅当element是 textarea 时,是的。
2021-03-20 00:41:01
希望将此事件处理程序分配给“dblclick”——但这不起作用,这太奇怪了。使用“鼠标按下”,您当然也无法通过拖动来选择文本。
2021-03-27 00:41:01
是的,我用它来解决我遇到的相同问题(+1),除了return false使用event.preventDefault()它不会杀死您在鼠标按下时可能拥有的任何其他处理程序。
2021-03-31 00:41:01
这会破坏页面上的 textarea 元素:(
2021-04-11 00:41:01

仅在双击后防止文本选择:

你可以使用MouseEvent#detail财产。对于 mousedown 或 mouseup 事件,它是 1 加上当前的点击次数。

document.addEventListener('mousedown', function (event) {
  if (event.detail > 1) {
    event.preventDefault();
    // of course, you still do not know what you prevent here...
    // You could also check event.ctrlKey/event.shiftKey/event.altKey
    // to not prevent something useful.
  }
}, false);

https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail

这应该是公认的答案。此处的其他所有内容都会阻止任何鼠标选择(或更糟),而不是回答 OP 的问题“双击后阻止文本选择
2021-03-21 00:41:01
使用(event.detail === 2)要真正防止ONLY双击(而不是三击等)
2021-03-23 00:41:01
也适用于 Chrome
2021-03-25 00:41:01
@Catalin,因为似乎dblclick在之后触发mouseup并且在之后发生选择mousedown
2021-04-01 00:41:01
这太棒了!适用于 Firefox 53。
2021-04-10 00:41:01

FWIW,我设置user-select: none父元素的子元素的,我不希望以某种方式选择的父元素上双击的任何地方。它有效!很酷的是contenteditable="true",文本选择等仍然适用于子元素!

所以像:

<div style="user-select: none">
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
</div>
不错的纯 css 解决方案,适用于您基本上从不希望文本可选的情况。谢谢!
2021-03-30 00:41:01
谢谢,style="user-select: note"到处都是我试图解决的问题:)
2021-04-01 00:41:01

一个简单的 Javascript 函数,它使页面元素内的内容无法选择:

function makeUnselectable(elem) {
  if (typeof(elem) == 'string')
    elem = document.getElementById(elem);
  if (elem) {
    elem.onselectstart = function() { return false; };
    elem.style.MozUserSelect = "none";
    elem.style.KhtmlUserSelect = "none";
    elem.unselectable = "on";
  }
}