【问题标题】:How can I prevent text/element selection with cursor drag如何防止使用光标拖动选择文本/元素
【发布时间】:2011-07-22 17:42:06
【问题描述】:

我做了一个分页控件,我注意到在单击按钮时很容易意外选择单个图像和文本。是否可以防止这种情况发生?

为了澄清选择,我的意思是用鼠标突出显示。 (尝试将鼠标从屏幕的一侧拖动到另一侧。)

如果您尝试突出显示此网格中的文本/控件,则无法选择它。这是怎么做的? Link

【问题讨论】:

标签: javascript jquery


【解决方案1】:

试试这个:

document.onselectstart = function()
{
    window.getSelection().removeAllRanges();
};

【讨论】:

  • 试试这个:$('yourDivSelector').getSelection().removeAllRanges()
  • selectstart 事件在 Firefox 中不存在。
【解决方案2】:

这可以在大多数浏览器中使用 CSS 和 IE 中的 unselectable expando 来实现。在这里查看我的答案:How to disable text selection highlighting using CSS?

【讨论】:

  • 这是一个比接受的更好的答案,完全绕过事件
【解决方案3】:

拖动和选择鼠标按下事件时初始化并在随后的鼠标移动时更新。当您处理开始拖动或跟随鼠标的事件时,取消事件的冒泡并覆盖默认浏览器返回:

在您开始拖动鼠标并移动处理程序时会出现类似的情况-

e=e || window.event;
pauseEvent(e);
function pauseEvent(e){
    if(e.stopPropagation) e.stopPropagation();
    if(e.preventDefault) e.preventDefault();
    e.cancelBubble=true;
    e.returnValue=false;
    return false;
}

【讨论】:

  • 是的 e.preventDefault() 应该是您在现代浏览器中所需要的。其余代码是多余的:window.event 适用于旧版本的 IE,但由于这些事件没有 preventDefault 方法,并且在 pauseEvent 函数调用中不返回 return false ......它没有做任何事情(甚至在 2011 年也没有)。
  • CSS: user-select: none; 是我使用的。应该不用 JS 来解决这个问题了
  • @Drenai 这也使得内容永远无法选择。确保仅在拖动过程中应用它。
  • @Farzad Yousefzadeh 不,拖动不会影响它。无需选择按钮的图标/文本
  • @Drenai 您所说的“拖动不会影响它”是什么意思?拖动仍然会调用类似于文本选择的指针事件。尝试将user-select: none 应用到一个元素并拖动它。当然有些元素不需要选择。我要说的是,如果不小心使用,那一行 CSS 会产生不必要的副作用。
【解决方案4】:

我想发表评论,但我没有足够的声誉。 使用来自@kennebec 的建议函数解决了我在 javascript 拖动库中的问题。 它完美无瑕。

function pauseEvent(e){
    if(e.stopPropagation) e.stopPropagation();
    if(e.preventDefault) e.preventDefault();
    e.cancelBubble=true;
    e.returnValue=false;
    return false;
}

我在我的 mousedown 和 mousemove 自定义函数中调用了它,在我识别出我点击了正确的元素之后。如果我只是在函数顶部调用它,我只会杀死对文档的任何点击。 我的函数在 document.body 上注册为一个事件。

【讨论】:

  • 你现在还有 10 个 :)
【解决方案5】:

对于拖动,您正在捕获 mousedownmousemove 事件。 (希望 touchstarttouchmove 事件也能支持触摸界面。)

您需要在downmove 事件中调用event.preventDefault(),以防止浏览器选择文本。

例如(使用 jQuery):

var mouseDown = false;
$(element).on('mousedown touchstart', function(event) {
  event.preventDefault();
  mouseDown = true;
});
$(element).on('mousemove touchmove', function(event) {
  event.preventDefault();
  if(mouseDown) {
    // Do something here.
  }
});
$(window.document).on('mouseup touchend', function(event) {
  // Capture this event anywhere in the document, since the mouse may leave our element while mouse is down and then the 'up' event will not fire within the element.
  mouseDown = false;
});

【讨论】:

  • 谢谢罗宾,出于好奇,window.documentwindow 或只是 document 之间有区别吗?我很确定documentwindow 的孩子..
  • window 是 Javascript 在浏览器中运行的最外层范围。因此,任何未在函数内声明的变量都是window 的属性。直接引用document其实就是引用window.document
  • 据我所知,仅在“mousedown”事件上取消默认就足够了。
【解决方案6】:

如下选择时调用 blur() 函数来防止它:

 <input Value="test" onSelect="blur();">

【讨论】:

    【解决方案7】:

    如果您需要使用 JavaScript 阻止某个元素的文本选择,那么对我来说最简单的方法是像这样分配 userSelect 样式:

    var myElement = document.createElement('div');
    myElement.style.userSelect = 'none';
    

    【讨论】:

      【解决方案8】:

      这是一个非常古老的帖子。它可能无法完全回答这种情况,但我使用 CSS 作为我的解决方案:

      -webkit-touch-callout: none;
      -webkit-user-select: none;
      -khtml-user-select: none;
      -moz-user-select: none;
      -ms-user-select: none;
      user-select: none;
      

      【讨论】:

      • 这正是我所需要的
      • 这很好用。鼠标拖动时不再选择文本。谢谢
      • 当我想编辑 contenteditable 时这不起作用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 2023-03-23
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      相关资源
      最近更新 更多