正在寻找一种更好的解决方法,以使Chrome选择聚焦错误

问题描述 投票:36回答:9

我与this question中的用户有相同的问题,这是由于Webkit中的this bug。但是,提供的解决方法不适用于我的应用程序。让我重新说明问题,这样您就不必阅读另一个问题:

我试图在文本区域中获得焦点时选择所有文本。以下jQuery代码可在IE / FF / Opera中运行:

$('#out').focus(function(){
  $('#out').select();
});

[但是,在Chrome / Safari中,非常简短地选择了文本,但是随后触发了mouseUp事件,并且取消了选择文本。上述链接提供了以下解决方法:

$('#out').mouseup(function(e){
  e.preventDefault();
});

但是,此解决方法对我没有好处。当用户指定文本区域焦点时,我想选择所有文本only。然后,他必须只能选择部分文本。谁能想到仍然可以满足此要求的解决方法?

javascript jquery webkit
9个回答
29
投票

怎么样?

$('#out').focus(function () {
    $('#out').select().mouseup(function (e) {
        e.preventDefault();
        $(this).unbind("mouseup");
    });
});

25
投票

接受的答案(以及到目前为止我发现的基本上所有其他解决方案)不适用于键盘焦点,即e。按Tab键,至少不在我的Chromium 21中。我改用以下代码段:

$('#out').focus(function () {
  $(this).select().one('mouseup', function (e) {
    $(this).off('keyup');
    e.preventDefault();
  }).one('keyup', function () {
    $(this).select().off('mouseup');
  });
});

e.preventDefault()keyup处理程序中的focus没有帮助,因此键盘焦点后的取消选择似乎不会在其默认处理程序中发生,而是在focuskeyup事件之间。 >

如@BarelyFitz所建议,最好使用命名空间事件,以免意外取消绑定其他事件处理程序。为此,将'keyup'替换为'keyup.selectText',将'mouseup'替换为'mouseup.selectText'


4
投票

为什么不简单:


3
投票

稍微不同的方法是将焦点事件与鼠标序列分开。这对我来说确实非常好-没有状态变量,没有泄漏的处理程序,没有无意中删除了处理程序,并且可以与click,tab或程序焦点一起使用。下面的代码和jsFiddle-


2
投票

制作bool。焦点事件发生后将其设置为true,鼠标悬停事件后将其重置。在鼠标上移期间,如果为true,则表示用户刚刚选择了文本字段;因此,您知道必须防止鼠标向上移动。否则,必须让它通过。


2
投票

将焦点放在输入框之前选择文本。


1
投票
onclick="var self = this;setTimeout(function() {self.select();}, 0);"

0
投票

digitalfresh的解决方案大部分都存在,但是存在一个错误,即如果您使用JS手动触发.focus()(因此不使用单击),或者如果您跳至该字段,则会遇到不必要的mouseup事件绑定-这导致应该取消选择文本的第一次单击被忽略。


0
投票

tpankake的答案已转换为可重用的jQuery函数。((如果您对此表示赞同,请也对他的回答表示赞同)

© www.soinside.com 2019 - 2024. All rights reserved.