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

时间:2013-10-31 07:20:32

标签: javascript jquery html 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);
    });
}

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

2 个答案:

答案 0 :(得分:15)

好问题!

这是可能的,而且非常简单。

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

JSFiddle

或者在香草JS中:

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

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

答案 1 :(得分:0)

执行此操作的一种稍微肮脏的方法可能是在采取行动之前使用setTimeout()

var windowFocus;

$(window).focus(function() {
    windowFocus = true;
});

$(window).blur(function() {
    windowFocus = false;
});

function clicked() {
    // generate a child element
    ...

    field = $(this).children(":first");

    field.blur(function () {
        setTimeout(function() {
            if (windowFocus) {
                save(this);
            }
        }, 50);
    });
}