注意:这个问题可能太专业了。解决方案(如果我找到一个)不太可能帮助除了我自己以外的任何人。尽管如此,我相信下面描述的解决方法适用于几个临界Chrome / jQuery焦点丢失情况。
我有输入TEXTAREA来输入一些文字。
同时,计时器对服务器进行定期AJAX调用(每分钟一次)。
在 Firefox 中,一切都很糟糕,用户可以输入他的内容。
在 Chrome 上,当AJAX请求触发时,输入焦点将丢失。显然,它无处可去。 window.activeElement
什么都不返回,光标确实从textarea中消失,直到用户再次用鼠标点击它。
好吧,重点留在那里。
一个 - 我尝试在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相关。
我发现several posts关于如何克服焦点丢失,或者首先how to set the focus,甚至是on newly created fields(我的不是),但是我的情况似乎different enough,他们要么没有提供任何线索,要么只是普通无效。文档说明了
element.focus();
是必要和充分的,但是很明显它不是。有人建议设置焦点using a zero-delay timeout;我试过,但这似乎没有帮助。
这可能与Chrome可能在不同进程中运行XHR请求这一事实有关,因此“焦点”会转到隐藏的XHR窗口吗? (没试过--process-per-site
命令行开关,它刚刚发生在我身上 - 我现在试试看。)
这可能是个错误吗?那里有 之类的东西,但是错误27868与Flash objects有关,而不是TEXTAREAs - 这是一个完全不同的动物AFAIK。
奇怪的是,这个行为(或一个非常相似的)被注意到on Firefox并且bug报告者明确地说,焦点应该保留在相同的输入控件上,如 in其他浏览器,所以他不在Chrome上观察它。
我做了一个fiddle,然后......它有效。因此,在计时器中调用的函数似乎更多的问题,它是w2ui grid.reload()。我仍然不理解为什么焦点不会使用focus()
返回,因为它应该如此。
受到amphetamachine评论的启发,我尝试将上述帖子中的几个技巧结合起来。我想出了一个有用的组合......等等。
所需的元素(无论我删除哪个,技巧停止工作)都是:
取消设置并将焦点重置为短的但不是零,setTimeout延迟。
// 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.
}
});
此解决方案的“con”是光标在视觉上“颤抖”,并且在失去Chrome焦点的未知事件之后,在grid.reload()的第二部分期间按下的任何键当然会迷路了。
答案 0 :(得分:0)
在最新的Chrome上升级w2ui到1.4.2 时,奇怪的行为消失了(实际上,我没有尝试过以前的Chromes,因为我没有考虑保留以前版本的副本)。