如何判断IE8窗口何时失去焦点?

时间:2012-11-26 23:53:15

标签: javascript jquery internet-explorer-8

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

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

在firefox或chrome或safari中,这会在窗口失去焦点时正确显示警报。但是,在IE8中,警报似乎被置于某种队列中。警报“丢失”仅显示窗口重新获得焦点的时间。更令人困惑的是,当与追踪窗口获得焦点的事件相结合时,它们就会出现故障。

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

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

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

如何在IE8中跟踪此内容?

2 个答案:

答案 0 :(得分: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");
    });

答案 1 :(得分:1)

在IE8中复制之后,我测试了Mathias Bynens的页面可见性是否有效,它似乎可以解决您的问题。您可以在此处下载: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()$(window).focus()的行为略有不同,而不是在用户点击窗口元素外时激活,在大多数浏览器中(除了IE之外)这只会当用户无法再看到窗口时激活(例如,切换选项卡,或最小化浏览器,但在更改为其他应用程序或监视器时不会)。我个人赞成这种行为,因为我不想让网站改变,而我仍在观看它,但与不同的应用程序进行交互。