如何在初始mousedown事件后取消文本选择?

时间:2008-09-22 08:10:57

标签: javascript jquery html

我正在尝试实现一个基于点击并按住的弹出式菜单,其位置使得(实际)慢点击仍会触发默认操作,并设置延迟以便进行文本选择手势通常不会触发菜单。

我似乎无法做的是以一种不会阻止文本选择的方式取消文本选择:从事件处理程序返回false(或调用$(this).preventDefault())可以防止用户根本没有选择,显而易见的$().trigger('mouseup')根本没有对选择做任何事情。

  • 这是在页面的一般上下文中,而不是特定于textarea或其他文本字段。
  • e.stopPropogation()不会取消文字选择。
  • 我不打算阻止文本选择,而是在短时间内否决,如果满足某些条件。

6 个答案:

答案 0 :(得分:5)

试试这个:

var input = document.getElementById('myInputField');
if (input) {
    input.onmousedown = function(e) {

        if (!e) e = window.event;
        e.cancelBubble = true;
        if (e.stopPropagation) e.stopPropagation();

    }
}

如果没有,请阅读:

http://www.quirksmode.org/js/introevents.html

答案 1 :(得分:4)

除了顶级帖子之外,还有一种官方方式可以实现我认为你想要的DOM。您可以用来代替事件的东西称为范围对象。

考虑,(最终在FF3上运作)

window.onclick = function(evt)
{
   // retrieves the selection and displays its content
   var selectObj = window.getSelection();
   alert(selectObj);

   // now collapse the selection to the initial point of the selection
   var rangeObj = selectObj.getRangeAt(0);
   rangeObj.collapse(true);
}

不幸的是,这与IE,Opera,Chrome或Safari不太相关;不确定原因,因为在Opera,Chrome或Safari中,有一些与collapse和getRangeAt方法相关的东西。如果我知道更多,我会告诉你的。


我以前的答案更新,一个更普遍的工作是选择对象和折叠,collapseToStart,collapseToEnd方法。 (link text

现在考虑上面的2.0:


window.onmouseup = function(evt)
{
   var selectObj = window.getSelection();
   alert(selectObj); // to get a flavor of what you selected

   // works in FF3, Safari, Opera, and Chrome
   selectObj.collapseToStart();

   // works in FF3, Safari, Chrome (but not opera)
   /* selectObj.collapse(document.body, 0); */

   // and as the code is native, I have no idea why...
   // ...and it makes me sad
}

答案 2 :(得分:2)

我不确定这是否会有所帮助,但是这里有一些取消选择文字的代码:

// onselectstart is IE-only
if ('undefined' !== typeof this.onselectstart) {
    this.onselectstart = function () { return false; };
} else {
    this.onmousedown   = function () { return false; };
    this.onclick       = function () { return true;  };
}

此上下文中的“this”将是您要阻止文本选择的元素。

答案 3 :(得分:0)

$(this).focus()(或类似document.body.focus()的任何内容)似乎都可以解决这个问题,尽管我没有对ff3进行过多次测试。

答案 4 :(得分:0)

这个问题的答案对我有用:   How to disable text selection using jquery?

(它不仅禁用,而且取消,任何文字选择 至少在FF和Chrome的计算机上。)

以下是答案:

    .attr('unselectable', 'on')

    '-ms-user-select': 'none',
    '-moz-user-select': 'none',
    '-webkit-user-select': 'none',
    'user-select': 'none'

    .each(function() {  // for IE
      this.onselectstart = function() { return false; };
    });

答案 5 :(得分:0)

感谢骑士开始普遍解决方案。这种轻微的修改还包括对IE 7-10(可能是6)的支持。

我遇到类似于cwillu-gmail的问题..需要附加到shift-click事件(按住shift键时单击标签)以在特定的“设计”模式下执行某些备用功能。 (是的,听起来很奇怪,但它是客户想要的。)这部分很容易,但是有选择文本的烦人效果。这对我有用:(我用onclick但你可以使用onmouseup ..取决于你想要做什么以及什么时候)

var element = document.getElementById("myElementId");
element.onclick = function (event)
{
    // if (event.shiftKey) // uncomment this line to only deselect text when clicking while holding shift key
    {
        if (document.selection)
        {
            document.selection.empty(); // works in IE (7/8/9/10)
        }
        else if (window.getSelection)
        {
            window.getSelection().collapseToStart(); // works in chrome/safari/opera/FF
        }
    }
}