重现此问题的步骤:
注意:
在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