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

时间:2014-09-19 13:55:54

标签: javascript ajax google-chrome

注意这个问题可能太专业了。解决方案(如果我找到一个)不太可能帮助除了我自己以外的任何人。尽管如此,我相信下面描述的解决方法适用于几个临界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上观察它。

JSFiddle - 展示行为,从而提供线索

我做了一个fiddle,然后......它有效。因此,在计时器中调用的函数似乎更多的问题,它是w2ui grid.reload()。我仍然不理解为什么焦点不会使用focus() 返回,因为它应该如此。

可接受的解决方法

受到amphetamachine评论的启发,我尝试将上述帖子中的几个技巧结合起来。我想出了一个有用的组合......等等。

所需的元素(无论我删除哪个,技巧停止工作)都是:

  • 手动重新设置焦点
  • 在setInterval计时器
  • 中执行此操作
  • 在重新设置之前模糊焦点
  • 取消设置并将焦点重置为短的但不是零,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()的第二部分期间按下的任何键当然会迷路了。

1 个答案:

答案 0 :(得分:0)

已过时:只需更新库。

在最新的Chrome上升级w2ui到1.4.2 时,奇怪的行为消失了(实际上,我没有尝试过以前的Chromes,因为我没有考虑保留以前版本的副本)。