2012-11-26 51 views
2

我一直在使用它,儘管直到最近我還沒有意識到它在ie8中運行不正常。如何判斷IE8窗口何時失去焦點?

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

在firefox或chrome或safari中,當窗口失去焦點時,這會正確顯示警報。但是,在IE8中,警報似乎被放入某種隊列中。僅當窗口重新獲得焦點時才顯示「丟失」警報。更讓人困惑的是,如果再加上一個跟蹤窗口是否獲得焦點的事件,它們就會失序。

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

如果這兩個都與IE8,當窗口失去焦點,使用(不要在Chrome或Firefox試試這個,因爲警報將進入某種週期)

並重新獲得它,IE8警報「獲得」ok「丟失」。這種亂序事件觸發導致我的代碼問題,因爲它是向後的,並報告最後一個事件是瀏覽器失去焦點。

我如何在IE8中跟蹤這個?

回答

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

在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),這隻會激活,當用戶不能再看到窗口(例如切換選項卡,或者最小化瀏覽器,但在更改爲不同的應用程序或監視器時不會)。我個人喜歡這種行爲,因爲考慮到我不希望網站改變,而我仍然在觀看它,但與另一個應用程序進行交互。