调用窗口模糊时避免使用元素模糊处理程序(浏览器失去焦点)

Mic*_*tke 11 html javascript jquery focus blur

解释这个问题:

我有一个元素,当点击时会收到一个子元素.该子元素被赋予模糊处理程序.

我想要的是,当浏览器失去焦点时(窗口模糊),不要调用该处理程序.

为了达到这个目标,我尝试了几个方法,这是我目前的努力:

function clicked() {
    // generate a child element
    ...
    field = $(this).children(":first");
    $(window).blur(function () {
        field.unbind("blur");
    });
    $(window).focus(function () {
        field.focus();
        field.blur(function () {
            save(this);
        });
    });
    field.blur(function () {
        save(this);
    });
}
Run Code Online (Sandbox Code Playgroud)

这不起作用.似乎正在发生的事情是,当浏览器失去焦点时,该领域首先失去焦点.

Pau*_*per 17

好问题!

这是可能的,而且相当简单.

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

的jsfiddle

或者在香草JS中:

field.addEventListener('blur', function() {
    if(document.activeElement !== this) {
         // this is a blur that isn't a window blur
    }
});
Run Code Online (Sandbox Code Playgroud)

编辑:虽然你的答案处理浏览器失去焦点,但知道Firefox在返回焦点时有不寻常的行为(错误?).如果您有一个聚焦的输入,然后取消聚焦窗口,则会触发元素的模糊(这就是问题所在).如果返回到输入以外的其他内容,则会再次触发blur事件.

  • 啊,我不知道 activeElement。很高兴这很简单。我相信这是有效的,因为 activeElement 是当前聚焦的元素,所以当发生模糊并且字段仍然聚焦时,我们没有将焦点转移到其他地方。因此我们可以避免调用模糊处理程序。谢谢! (2认同)