双击后防止文本选择

Dav*_*vid 275 javascript selection-object

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

Pao*_*ino 332

function clearSelection() {
    if(document.selection && document.selection.empty) {
        document.selection.empty();
    } else if(window.getSelection) {
        var sel = window.getSelection();
        sel.removeAllRanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以将这些样式应用于所有非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+ */
}
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法真正阻止选择而不是在事后删除选择?另外,如果为了更好的可读性,你的第二个if语句可以在else中. (38认同)
  • 禁用双击选择和完全禁用它之间存在差异.第一个增加了可用性.第二次减少. (12认同)
  • 最好使用-webkit-前缀(这是基于Webkit的浏览器的首选前缀)和-moz-(和-khtml-如果你有一个大的Konqueror受众). (8认同)
  • 这在IE10中现在可用`-ms-user-select:none;`参见http://blogs.msdn.com/b/ie/archive/2012/01/11/controlling-selection-with-css-user -select.aspx @PaoloBergantino (3认同)
  • @dudewad 事实上(此时)它实际上处于标准轨道上([CSS 基本用户界面模块级别 4](https://drafts.c​​sswg.org/css-ui-4/#propdef-user-select ))。我意识到自从您发表评论以来这可能已经发生了变化,但为了完整起见,我认为值得一提。 (2认同)

小智 109

在普通的JavaScript中:

element.addEventListener('mousedown', function(e){ e.preventDefault(); }, false);
Run Code Online (Sandbox Code Playgroud)

或者使用jQuery:

jQuery(element).mousedown(function(e){ e.preventDefault(); });
Run Code Online (Sandbox Code Playgroud)

  • 是的,我用它来解决我遇到的同样的问题(+1),除了使用`return.preventDefault()`而不是`return false`,它不会杀死你在mousedown上可能拥有的任何其他处理程序. (24认同)
  • 期望将此事件处理程序分配给"dblclick" - 但这不起作用,这太奇怪了.使用"mousedown",您当然也无法通过拖动来选择文本. (9认同)
  • 这打破了页面上的textarea元素:( (2认同)

4es*_*n0k 57

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

你可以使用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);
Run Code Online (Sandbox Code Playgroud)

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

  • 使用 `(event.detail === 2)` 来真正防止仅双击(而不是三次单击等) (6认同)
  • 这应该是公认的答案。此处的所有其他内容都会阻止任何鼠标选择(或更糟糕的选择),而不是回答OP的问题“ *防止双击后选择文本*” (5认同)
  • 这太棒了!适用于Firefox 53. (4认同)
  • @Catalin,因为似乎“dblclick”在“mouseup”之后触发,而选择发生在“mousedown”之后 (3认同)

kyw*_*kyw 23

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

像这样:

<div style="user-select: none">
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
  <p>haha</p>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 这就是为什么我们阅读整个主题的原因 (8认同)

小智 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";
  }
}
Run Code Online (Sandbox Code Playgroud)


bvd*_*vdb 6

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

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

<td *ngFor="..."
    (mousedown)="onMouseDown($event)"
    (dblclick) ="onDblClick($event)">
  ...
</td>
Run Code Online (Sandbox Code Playgroud)

并防止如果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 ...
}
Run Code Online (Sandbox Code Playgroud)

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