2

我一直在使用它,尽管直到最近我才意识到它在 ie8 中运行不正常。

$(window).blur(function () {
 alert("lost");
});

在 Firefox 或 chrome 或 safari 中,这会在窗口失去焦点时正确显示警报。但是,在 IE8 中,警报似乎被放入了某种队列中。“丢失”警报仅在窗口重新获得焦点时显示。更令人困惑的是,当与跟踪窗口是否获得焦点的事件相结合时,它们会出现乱序。

$(window).focus(function () {
 alert("gained");
});

(不要在 chrome 或 firefox 中尝试这个,因为警报会进入某种循环)

如果这两个都与 IE8 一起使用,当窗口失去焦点,然后重新获得它时,IE8 会提示“获得” ok“丢失”。这种乱序事件触发会导致我的代码问题,因为它是向后的,并报告最后一个事件是浏览器失去焦点。

如何在 IE8 中跟踪它?

4

2 回答 2

4

方法的功劳:https ://stackoverflow.com/a/10999831/1026459

我的情况的解决方案:

document.onfocusout = function(){
 alert("lost");
};

这实际上控制了一个间隔,但这不是重点。onfocusout适用于 ie8、chrome、safari 和 ff。我不确定 ie8 有什么问题,blur但我正在逐步淘汰它。

编辑

不幸的是 document.onfocusout 在 chrome 或 safari 中不起作用,所以我不得不做更多的解决方法。这就是我最终得到的。

    //ie workaround
    document.onfocusout = function(e){
        if( e === undefined ){//ie
            var evt = event;//ie uses event
            if( evt.toElement == null ){//check where focus was lost to
             console.log("lost");
            }
        }
    };

    window.onblur = function(e){
     if( e !== undefined ){//ie will have an undefined e here, so this screens them out
      console.log("lost");
     }
    };

    $(window).focus(function () {
     console.log("gained");
    });
于 2012-11-27T00:04:06.130 回答
1

在 IE8 中复制此内容后,我测试了 Mathias Bynens 的页面可见性 shim 是否有效,并且似乎可以解决您的问题。你可以在这里下载:http: //mths.be/visibility

我确实稍微更改了您的测试代码以避免进入警报循环;

$(document).on({
    'show.visibility': function () {
        $(document.body).append(new Date().getTime() + '<br/>');
    },
    'hide.visibility': function () {
        $(document.body).append(new Date().getTime() + '<br/>');
    }
});

$(window).blur()另请注意,这与and的行为确实略有不同$(window).focus(),而不是在用户在窗口元素外单击时激活,在大多数浏览器(IE 除外)中,这只会在用户不再看到窗口时激活(例如开关选项卡,或最小化浏览器,但在更改为不同的应用程序或监视器时不会)。我个人赞成这种行为,因为我不希望网站在我仍在观看但与不同的应用程序交互时发生变化。

于 2012-11-27T00:13:13.387 回答