双击后阻止文本选择


294

我正在处理Web应用程序中的dblclick事件。副作用是双击可以选择页面上的文本。如何防止这种选择发生?

Answers:


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

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

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+ */
}

44
有什么方法可以实际防止选择,而不是事后删除选择?另外,您的第二个if语句可以放在else if语句中,以提高可读性。
戴维(David)2009年

8
除了-moz-(和-khtml-,如果您有大量Konqueror受众)之外,最好使用-webkit-前缀(这是基于Webkit的浏览器的首选前缀)。
失眼

3
现在可以在IE10中使用它,-ms-user-select: none;请参见blogs.msdn.com/b/ie/archive/2012/01/11/…@PaoloBergantino
柠檬

1
@TimHarper:关于使用库的Javascript解决方案,可以肯定。不太确定为什么需要这样做。
Paolo Bergantino,2012年

14
在双击禁用选择和完全禁用选择之间有区别。第一个增加了可用性。第二个减少。
Robo Robok

112

用简单的javascript:

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

或使用jQuery:

jQuery(element).mousedown(function(e){ e.preventDefault(); });

26
是的,我用它来解决我遇到的(+1)相同的问题,除了return false使用event.preventDefault()不会杀死mousedown时可能拥有的其他任何处理程序之外。
西蒙东

2
这会破坏页面上的textarea元素:(
john ktejik,2015年

1
@johnktejik仅当element是文本区域时才是。
fregante

11
希望将此事件处理程序分配给“ dblclick” –但这不起作用,这很奇怪。使用“ mousedown”,当然还可以阻止您通过拖动来选择文本。
corwin.amber

74

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

您可以使用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


4
这太棒了!在Firefox 53中可以使用
。– Zaroth

6
这应该是公认的答案。这里的其他所有内容都防止了鼠标的任何选择(或更糟糕的情况),而不是回答OP的问题“ 双击后防止文本选择
billynoah

1
在Chrome中也可以使用
KS74,19年

1
在IE 11 Windows 10 =上也可以使用。感谢您分享。
Fernando Vieira

使用(event.detail === 2)要真正防止ONLY双击(而不是三击等)
罗宾·斯图尔特

32

FWIW,我将那些子元素user-select: none父元素设置为在双击父元素的任何位置时都不希望以某种方式选择的子元素。而且有效!很酷的是contenteditable="true",文本选择等仍然可以在子元素上使用!

像这样:

<div style="user-select: none">
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
</div>

谢谢,style="user-select: note"到处都是解决我试图解决的问题:)
esaruoho

一个不错的css-only解决方案,用于您基本上不希望文本为可选内容的情况。谢谢!
伊恩·洛夫乔伊

11

一个简单的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";
  }
}

4

对于那些正在寻找Angular 2+解决方案的人。

您可以使用mousedown表格单元格的输出。

<td *ngFor="..."
    (mousedown)="onMouseDown($event)"
    (dblclick) ="onDblClick($event)">
  ...
</td>

并防止如果detail > 1

public onMouseDown(mouseEvent: MouseEvent) {
  // prevent text selection for dbl clicks.
  if (mouseEvent.detail > 1) mouseEvent.preventDefault();
}

public onDblClick(mouseEvent: MouseEvent) {
 // todo: do what you really want to do ...
}

dblclick产量继续按预期方式工作。


3

或者,在mozilla上:

document.body.onselectstart = function() { return false; } // Or any html object

在IE上,

document.body.onmousedown = function() { return false; } // valid for any html object as well

5
这种解决方案根本不允许选择文本。
jmav

1
@jmav您必须将功能替代应用于比更为具体的元素document.body
Cypher

2

使用旧线程,但我想出了一个解决方案,我认为它是更干净的解决方案,因为它不会禁用与对象的所有偶数绑定,而只能防止在页面上进行随机和不需要的文本选择。它很简单,对我来说效果很好。这是一个例子;在类“ arrow-right”的对象上单击几次时,我想防止文本选择:

$(".arrow-right").hover(function(){$('body').css({userSelect: "none"});}, function(){$('body').css({userSelect: "auto"});});

HTH!


1

如果您试图完全禁止通过任何方法以及仅双击来选择文本,则可以使用user-select: nonecss属性。我已经在Chrome 68中进行了测试,但是根据https://caniuse.com/#search=user-select,它应该可以在其他当前的普通用户浏览器中使用。

从行为上讲,在Chrome 68中,它是由子元素继承的,即使选择了围绕元素(包括元素)的文本,也不允许选择元素包含的文本。


0

为防止IE 8 CTRL和SHIFT单击单个元素上的文本选择

var obj = document.createElement("DIV");
obj.onselectstart = function(){
  return false;
}

防止在文档上选择文本

window.onload = function(){
  document.onselectstart = function(){
    return false;
  }
}

-2

我有同样的问题。我通过切换到<a>并添加来解决它onclick="return false;"(因此单击它不会在浏览器历史记录中添加新条目)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.