双击后防止文本选择

时间:2009-05-19 00:55:52

标签: javascript selection-object

我在我的网络应用中处理跨度上的dblclick事件。副作用是双击选择页面上的文本。如何防止这种选择发生?

13 个答案:

答案 0 :(得分:315)

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

答案 1 :(得分:105)

简单的javascript:

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

或者使用jQuery:

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

答案 2 :(得分:42)

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

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

答案 3 :(得分:12)

一个简单的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 :(得分:10)

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

类似:

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

答案 5 :(得分:4)

或者,在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

答案 6 :(得分:2)

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

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

防止文档上的文本选择

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

答案 7 :(得分:2)

旧线程,但我提出了一个我认为更清晰的解决方案,因为它不会禁用每个绑定到对象的偶数,并且只能阻止页面上随机和不需要的文本选择。它很简单,对我来说效果很好。 这是一个例子;当我用“arrow-right”类在对象上点击几次时,我想阻止文本选择:

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

HTH!

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

对于那些正在寻找 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) event.preventDefault();
}

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

dblclick输出继续按预期工作。

答案 10 :(得分:0)

我知道这是一个老问题,但它在 2021 年仍然完全有效。但是,我在答案方面缺少任何提及 Event.stopPropagation() 的内容。

OP 要求 dblclick 事件,但从我看来,pointerdown 事件发生了同样的问题。在我的代码中,我注册了一个监听器,如下所示:

this.addEventListener("pointerdown", this._pointerDownHandler.bind(this));

监听器代码如下:

_pointerDownHandler(event) {
  // Stuff that needs to be done whenever a click occurs on the element
}

在我的元素上多次快速点击会被浏览器解释为双击。根据您的元素在页面上的位置,双击将选择文本,因为这是给定的行为。

可以通过在侦听器中调用 Event.preventDefault() 来禁用该默认操作,它确实解决了问题,至少在某种程度上是这样。

但是,如果您在元素上注册一个侦听器并编写相应的“处理”代码,您最好吞下该事件,而这正是 Event.stopPropagation() 所确保的。因此,处理程序将如下所示:

_pointerDownHandler(event) {
  event.stopPropagation();
  // Stuff that needs to be done whenever a click occurs on the element
}

因为我的元素已经消耗了该事件,层次结构更靠上的元素不知道该事件,也不会执行它们的处理代码。

如果您让事件冒泡,层次结构中较高的元素都执行其处理代码,但会被 Event.preventDefault() 告知不要这样做,这对我来说没有意义首先防止事件冒泡。

答案 11 :(得分:-1)

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

答案 12 :(得分:-1)

如果您使用的是Vue JS,只需将@mousedown.prevent=""附加到您的元素上,它就会神奇地消失!