12

对问题进行阐述:

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

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

为了实现这个目标,我尝试了几种方法,这是我目前的努力:

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);
    });
}

这行不通。似乎正在发生的是,当浏览器失去焦点时,该字段首先失去焦点。

4

2 回答 2

19

好问题!

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

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 在返回焦点时有异常行为(错误?)。如果您有一个输入焦点,然后取消焦点窗口,则会触发元素的模糊(这就是问题所在)。如果您返回输入以外的其他内容,则会再次触发 blur事件

于 2013-10-31T07:41:22.773 回答
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);
    });
}
于 2013-10-31T07:36:41.973 回答