Javascript w2ui.reload()中的jQuery$.post()使TEXTAREA在Chrome中无声地失去焦点
注意:这个问题可能太专业化了。这个解决方案(如果我能找到的话)不太可能对任何人都有帮助,除了我自己。尽管如此,我相信下面描述的解决方法适用于几个临界的Chrome/jQuery焦点丢失场景 脚本: 我有一个输入文本区域来输入一些文本 同时,计时器定期对服务器进行AJAX调用(每分钟一次) 发生了什么: 在Firefox中,一切都很好,用户可以随心所欲地打字 在Chrome上,当AJAX请求触发时,输入焦点丢失。它去了。。。显然,哪儿也没有Javascript w2ui.reload()中的jQuery$.post()使TEXTAREA在Chrome中无声地失去焦点,javascript,ajax,google-chrome,Javascript,Ajax,Google Chrome,注意:这个问题可能太专业化了。这个解决方案(如果我能找到的话)不太可能对任何人都有帮助,除了我自己。尽管如此,我相信下面描述的解决方法适用于几个临界的Chrome/jQuery焦点丢失场景 脚本: 我有一个输入文本区域来输入一些文本 同时,计时器定期对服务器进行AJAX调用(每分钟一次) 发生了什么: 在Firefox中,一切都很好,用户可以随心所欲地打字 在Chrome上,当AJAX请求触发时,输入焦点丢失。它去了。。。显然,哪儿也没有window.activeElement不返回任何内容,光
window.activeElement
不返回任何内容,光标确实会从文本区域消失,直到用户再次用鼠标单击它
我所期望的是:
好吧,让焦点留在那里
尝试:
One-我尝试在textarea的[.focusout()][1]
上设置事件处理程序,结果发现事件没有触发。当用户单击其他地方时,它确实会触发,但这没有帮助
两个-然后我尝试了一种不那么优雅的方法,比如说残酷的方法:
var hasFocus = document.activeElement;
if (hasFocus) {
var focusKeeper = window.setInterval(function(){
hasFocus.focus(); // JUST. STAY. THERE.
$(hasFocus).css("background-color", "red");
}, 10);
}
字段变为红色,因此处理程序至少正在启动。但焦点不会回来。就好像Chrome根本就没有尝试过
同样,在Firefox中,一切都按预期运行。我将在Safari上尝试下一步,以确认这是否与Webkit相关
研究和更多尝试:
我已经找到了如何克服注意力丧失的方法,或者在第一个地方,甚至(我的不是),但我的案例似乎要么没有提供任何线索,要么就是根本不起作用。文件指出:
element.focus();
这是必要和充分的,但很明显,这是不够的。有人建议设置焦点;我试过了,但似乎没用
这是否与Chrome可能在另一个进程中运行XHR请求有关,因此“焦点”将指向隐藏的XHR窗口?(我还没有尝试过--processper-site
命令行开关,我刚刚想到了这一点,现在我将尝试一下)
这可能是一只虫子吗?有类似的东西,但bug 27868与文本区有关,而不是文本区——这是一种完全不同的动物
奇怪的是,这种行为(或惊人的相似)被注意到了,bug报告员明确表示,关注点应该保持在相同的输入控件上,就像其他浏览器中的,因此他没有在Chrome上观察到
JSFiddle-不显示行为,因此提供线索
我发了一封信,然后。。。它起作用了。因此,问题似乎更多地在于计时器中调用的函数,即grid.reload()。我仍然不明白为什么焦点没有像应该的那样使用focus()
返回
可接受的解决方法
受安非他命机器评论的启发,我尝试结合上面帖子中的几个技巧。我想出了一个有效的组合。。。有点
需要的元素(无论我移除哪个,技巧都会停止工作)是:
- 手动将焦点重新设置到原来的位置
- 在设置间隔计时器内执行此操作
- 在重新设置之前,请模糊焦点
- 在短时间内取消设置并重置焦点,但不为零,设置超时延迟
// Save focus. hasFocus = document.activeElement; w2ui.myGrid.reload(function() { // Callback, called after reloading. // If there was no focus, we just return. if (hasFocus) { // We DON'T do anything directly, but use setTimeout. window.setTimeout( function() { // And before setting the focus, we truly remove it. hasFocus.blur(); hasFocus.focus(); }, 5); // A timeout of 0 does not work. } });
通过在最新的Chrome上升级w2ui到1.4.2,这种奇怪的行为消失了(实际上,我没有在以前的Chrome上试用,因为我不想保留以前版本的副本)。Iserni。。你能做些小动作来重现这个问题吗。
我试过在textarea的.focusout()
上设置一个事件处理程序——你试过.blur()
吗?我制作了一个JSFIDLE,但我无法重现你的问题。你能证实这是你想要的吗?输出在控制台中。