Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript w2ui.reload()中的jQuery$.post()使TEXTAREA在Chrome中无声地失去焦点_Javascript_Ajax_Google Chrome - Fatal编程技术网

Javascript w2ui.reload()中的jQuery$.post()使TEXTAREA在Chrome中无声地失去焦点

Javascript w2ui.reload()中的jQuery$.post()使TEXTAREA在Chrome中无声地失去焦点,javascript,ajax,google-chrome,Javascript,Ajax,Google Chrome,注意:这个问题可能太专业化了。这个解决方案(如果我能找到的话)不太可能对任何人都有帮助,除了我自己。尽管如此,我相信下面描述的解决方法适用于几个临界的Chrome/jQuery焦点丢失场景 脚本: 我有一个输入文本区域来输入一些文本 同时,计时器定期对服务器进行AJAX调用(每分钟一次) 发生了什么: 在Firefox中,一切都很好,用户可以随心所欲地打字 在Chrome上,当AJAX请求触发时,输入焦点丢失。它去了。。。显然,哪儿也没有window.activeElement不返回任何内容,光

注意:这个问题可能太专业化了。这个解决方案(如果我能找到的话)不太可能对任何人都有帮助,除了我自己。尽管如此,我相信下面描述的解决方法适用于几个临界的Chrome/jQuery焦点丢失场景

脚本: 我有一个输入文本区域来输入一些文本

同时,计时器定期对服务器进行AJAX调用(每分钟一次)

发生了什么: 在Firefox中,一切都很好,用户可以随心所欲地打字

在Chrome上,当AJAX请求触发时,输入焦点丢失。它去了。。。显然,哪儿也没有
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焦点的未知事件之后,在第二部分中按下的任何键当然都会丢失。

过时:只需更新库即可。
通过在最新的Chrome上升级w2ui到1.4.2,这种奇怪的行为消失了(实际上,我没有在以前的Chrome上试用,因为我不想保留以前版本的副本)。

Iserni。。你能做些小动作来重现这个问题吗。
我试过在textarea的.focusout()
上设置一个事件处理程序——你试过
.blur()
吗?我制作了一个JSFIDLE,但我无法重现你的问题。你能证实这是你想要的吗?输出在控制台中。