谷歌浏览器,无限循环和选择文本
Google chrome, infinite loops and selecting text
这个问题有一些背景知识。请参阅我最近发布的另外两个相关问题:
如何跨浏览器选择文本框中的文本
在google chrome中创建无限循环
警告:有可能第二个链接是转移注意力的。
好的,所以我的问题是,我试图有它,所以当用户第一次点击或标签在一个文本框,所有的文本应该成为选中。如果文本框有焦点,随后点击文本框内的文本应该表现正常(即。不会重新选择所有文本)。我在上面的第一个链接中选择的答案是我发现适用于所有浏览器的答案。为方便起见,代码如下:
$('input[type="text"]').live('focus', function (event) {
var inp = this;
setTimeout(function () {
inp.select();
}, 1);
event.stopPropagation();
event.preventDefault();
return false;
});
现在我上面的第二个链接似乎是我用这种方法遇到的。似乎断断续续,google chrome在某个地方卡住了,开始在文本框之间快速地改变焦点。你可以在这里看到我认为发生了什么:http://jsfiddle.net/ajbeaven/XppG9/14/
就像我说的,这似乎是一个间歇性的问题,所以你可能不得不尝试重新加载页面几次,以看到我认为可能导致焦点的变化。请记住,这似乎只发生在chrome中。
感谢任何可以提供一些启示的人!
将任何额外的工作放在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调用移到选择文本的函数中似乎可以达到目的。
天哪,我刚想明白了。在一个真实的网站上,这个错误可能不会发生在你身上。发生这种情况是因为您正在更新DOM,向消息div添加"*"。当您这样做时,它会将页面的内容向下推。这会将顶部文本框移动到鼠标所在的位置,并且在顶部文本框上触发mouseup事件,从而导致两个文本框触发setTimeout并进入无限循环。总有权利报告这个
编辑:可能不是mouseup事件。看起来chrome认为你是合法的专注于这两个。以下是Chrome的bug测试用例:http://jsfiddle.net/delvarworld/AnBE8/
edit2:这在Safari中也会发生。很可能是webkit问题。
tldr的简单解决方法是不以导致焦点事件流的方式更新dom,如删除html()行
你也可以试试:
$('input[type="text"]').live('mouseup', function (event) {
- 用于选择/文本框操作的JavaScript
- 以编程方式选择文本Mobile Safari
- Firefox输入可以't在选择文本时滚动
- 如何在javascript中取消选择文本框
- 如何在html中打印选择文本
- SVG元素——处理和选择文本
- 选择文本并添加到本地存储
- 选择“p文本jquery”
- 为什么火狐在我更改 innerHTML 时会选择文本
- 根据换行符选择文本
- 如何按从当前单词到段落中该句子(.)结尾的范围选择文本
- 单击按钮时选择文本
- JavaScript 触发器事件在 Android 上选择文本
- .val() 选择文本而不是值字符串,当网页动态编辑源 html
- 为什么不用特殊字符替换选择文本,以及如何删除此特殊字符
- 使用链接多次选择文本
- 使用jQuery在焦点上选择文本框是't在移动浏览器中工作
- Safari存在文本输入问题,用户输入时会选择文本,导致文本丢失
- Bootstrap下拉菜单-仅复选框不选择文本
- 使用.on的多个下拉菜单选择文本仅适用于第一个下拉菜单