重现此问题的步骤:

注意:
在focusin和blur事件中为每个输入创建两个名称分别为console.log("Test Focus In" + element.getAttribute("name"))console.log("Test Blur" + element.getAttribute("name"))的输入。


单击第一个元素
单击第二个元素
单击第一个元素
单击外部镀铬
点击chrome中的第二个元素。


预期的行为是什么?

日志:


在FirstElement中测试重点
测试模糊FirstElement
在SecondElement中测试重点
测试模糊SecondElement
在FirstElement中测试重点
测试模糊FirstElement
在SecondElement中测试重点


什么地方出了错?

但是发生了
日志:


在FirstElement中测试重点
测试模糊FirstElement
在SecondElement中测试重点
测试模糊SecondElement
在FirstElement中测试重点
测试模糊FirstElement
在FirstElement中测试重点
进入窗口时,立即触发Focusin并在离开窗口之前模糊最后一个元素。
测试模糊FirstElement
在SecondElement中测试重点

最佳答案

我不确定100%,但是输入元素和一般html元素作为整个UI系统的一部分受到威胁。简单地说,如果您更改浏览器选项卡,则意味着您已将焦点元素从窗口更改为其他应用程序或系统控件。我可能完全错了,但是即使我错了,这也意味着不仅Google chrome有此问题。

对我来说,这就像您想一直将选定的文件保留在Windows资源管理器中一样,即使您在其他资源管理器中选择其他文件也是如此-实际上,当您切换窗口时,行为类似于上面的答案。



防止这种情况可能是不可能的,但是根据您的用例,您可能可以采用另一种方法。您可以执行以下几项操作:

检查activeElement

这可以解决您的问题。您可以检查元素是否为activeElement,然后确保在用户单击外部时未调用事件。 Here is very the same question (as yours) and explained solution

field.blur(function() {
    if(document.activeElement !== this) {
         // this is a blur that isn't a window blur
    }
});


我没有尝试,但是也许您可以将其与document.hasFocus()结合使用

页面可见性API

您可以通过页面可见性api explained in this question检查浏览器选项卡是否聚焦。不幸的是,这不允许检查浏览器窗口是否失去焦点,而是检查用户是否更改了选项卡或切换到另一个应用程序。

模糊文件

在文档聚焦或模糊的情况下,可能需要做一些事情:

    $( document ).on("focus", function(e){
        console.log("focus");
    });
    $( document ).on("blur", function(e){
        console.log("blur");
    });


这非常适合选项卡或应用程序更改以及外部单击,但是即使将bubbling更改为capturing,也无法防止输入模糊。

文档具有焦点

这使您可以检查文档是否聚焦于文档blur事件。您可以看到example here

10-06 11:59