javascript - 当浏览器失去焦点时,Chrome(也许是 Safari?)在输入字段上触发 "blur"两次

标签 javascript google-chrome safari dom-events

Here is an interesting jsfiddle.

在火狐浏览器中:

  1. 运行 fiddle
  2. 点击文本输入
  3. 点击其他地方。应该说“1 模糊”。
  4. 再次点击文本输入。
  5. ALT-TAB 到另一个窗口。 Fiddle 现在应该说“2 个模糊”。

在 Chrome 中,第 5 步显示“3 个模糊”。当整个浏览器失去焦点时,会触发两个单独的“模糊”事件。这很有趣,因为这意味着在“模糊”处理程序中假设元素实际上在事件被分派(dispatch)之前获得焦点是不安全的;也就是说,失去焦点——从“焦点清晰”到“焦点不清晰”的转变——是事件发生的原因。当生成两个“模糊”事件时,在处理第二个事件期间不满足该条件,因为该元素已经不在焦点中。

那么这只是一个错误吗?有没有办法判断“模糊”事件是假的?

最佳答案

它触发两次的原因是 window.onblur。作为 javascript 捕获/冒泡过程的一部分,窗口模糊会触发该窗口中所有元素的模糊事件。您所需要做的就是测试事件目标是否为窗口。

var blurCount = 0;
var isTargetWindow = false;
$(window).blur(function(e){
    console.log(e.target);
    isTargetWindow = true;
});
$(window).focus(function(){
    isTargetWindow = false;
});
$('input').blur(function(e) {
    if(!isTargetWindow){         
       $('div').text(++blurCount + ' blurs');
    }
    console.log(e.target);
});

http://jsfiddle.net/pDYsM/4/

关于javascript - 当浏览器失去焦点时,Chrome(也许是 Safari?)在输入字段上触发 "blur"两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9649966/

相关文章:

javascript - Angularjs:如何检查元素的子元素是否包含某个元素(通过 ID)

Javascript Console.log 在 Chrome 或 Firefox 中不工作

javascript - 从特定 Chromecast 上播放的当前轨道中检索媒体信息

Javascript 警告框在 Chrome 中不起作用

javascript - OSX 上的 Safari 6 中的 CSS3 闪烁(但这不是闪烁到白色的问题!)

javascript - 如何找到数组A中空白项的索引并将它们插入数组B中的相同索引?

javascript - 如何获取 popup.js 文件中选项卡的当前 url?

css - Macbook Pro Safari 12.0 rgba 不透明度问题

javascript - 从 ngOnInit 向函数传递值

css - Safari flexbox 文本换行问题