【问题标题】:Google chrome, infinite loops and selecting text谷歌浏览器,无限循环和选择文本
【发布时间】:2011-07-29 07:03:46
【问题描述】:

这个问题有一点背景。请查看我最近发布的另外两个相关问题:

How to select text in a textbox cross-browser
Infinite loops created in google chrome

警告词:第二个链接可能是红鲱鱼。

好的,所以我的问题是我试图拥有它,所以当用户第一次点击或进入文本框时,所有文本都应该被选中。如果文本框有焦点,随后点击文本框内的文本应该正常(即不会重新选择所有文本)。我在上面第一个链接中选择的答案是我发现在所有浏览器中都有效的答案。为方便起见,将代码贴在下面:

$('input[type="text"]').live('focus', function (event) {
    var inp = this;
    setTimeout(function () {
        inp.select();
    }, 1);

    event.stopPropagation();
    event.preventDefault();
    return false;    
});

现在我上面的第二个链接是我似乎正在使用这种方法。似乎间歇性地,谷歌浏览器卡在某个地方并开始快速改变文本框之间的焦点。你可以在这里看到我认为正在发生的事情:http://jsfiddle.net/ajbeaven/XppG9/14/

就像我说的那样,这似乎是一个间歇性问题,因此您可能必须尝试重新加载页面几次才能查看我认为可能导致焦点变化的原因。请记住,它似乎只发生在 chrome 中。

感谢任何可以阐明的人!

【问题讨论】:

  • 似乎 chrome 一次只能聚焦到一个对象,因此每次发生事件时它都会切换到对象。
  • 在 Chrome 中的 jsFiddle 中很容易看到。我不知道为什么会这样。删除计时器会使问题消失,但选择不会坚持。我很想知道答案是什么。

标签: javascript jquery google-chrome


【解决方案1】:

setTimeout 函数中添加任何额外的工作。并在setTimeout() 之前添加clearTimeout()

var focusTimeout = 0;
$('input[type="text"]').live('focus', function(event) {
    var inp = this;
    clearTimeout(focusTimeout);
    focusTimeout = setTimeout(function() {
        $('#message-container').html($('#message-container').html() + "*\u200b");
        inp.select();
    }, 1);
});

http://jsfiddle.net/XppG9/19/

在 Chrome 中,将 html 写入页面(显然)导致字段失去焦点,select() 导致其在 1ms 后接收焦点,从而触发焦点事件并导致无限循环。将 write html 调用移到选择文本的函数中似乎可以解决问题。

【讨论】:

  • 就是这样,除了选择文本框之外,我实际上并没有做任何事情。我的问题是,有时 chrome 会陷入在多个文本框之间切换焦点的无限循环中。它似乎只有在我快速完成时才会发生,比如在点击的同时点击标签。
  • @ajbeaven - 好的,同时点击和点击,我明白你在说什么。尝试在致电setTimeout() 之前添加clearTimeout()jsfiddle.net/XppG9/19
【解决方案2】:

哦,伙计,我刚刚想通了。在真实的网站上,这个错误可能不会发生在您身上。发生这种情况是因为您正在更新 DOM,将“*”添加到消息 div。当你这样做时,它会将页面的内容向下推。这会将顶部文本框移动到鼠标所在的位置,并且在顶部文本框上触发 mouseup 事件,导致两个文本框触发 setTimeout 并进入无限循环。报告此问题的总次数。

编辑:它可能不是 mouseup 事件。看起来 chrome 认为你在这两者上都是合法的。这是 Chrome 的错误测试用例:http://jsfiddle.net/delvarworld/AnBE8/

edit2:这也发生在 Safari 中。很可能是 webkit 问题。

tldr 简单的解决方法是不要以导致焦点事件重排的方式更新 dom,如摆脱 html() 行

你也可以试试:

$('input[type="text"]').live('mouseup', function (event) {

这适用于我的 Chrome

【讨论】:

  • 如果用户使用tab键来浏览文本框怎么办?那就不行了。
  • 也不允许您使用鼠标在字段中移动插入点而不选择所有文本或使用鼠标选择部分文本。
  • Here 是我刚刚打开的相关 Chrome 错误的链接。很想看看他们说了什么,或者它是否遇到了 webkit 错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
相关资源
最近更新 更多