2011-10-31 37 views
4

我不知道爲什麼會這樣,我很想得到一個解釋。

使用jQuery的focus方法我綁定到窗口焦點事件。 這是一個工作示例(複製粘貼到HTML文件並打開在瀏覽器中的jsfiddle或jsbin不行的,因爲某些原因)

<!DOCTYPE html> 
<html> 

<head><script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript"></script></head> 

<body> 
    <p1>Here:</p1> 
    <div id="here" >Why</div> 
</body> 
<script> 
    $(window).load(function() { 
     $(window).focus(function() {console.log("focus");}); 
     $(window).blur(function() {console.log("blur");}); 
    }); 
</script> 
</html> 

當瀏覽器重新獲得焦點函數運行兩次,「焦點「被打印到控制檯兩次。 任何想法爲什麼發生這種情況?

的最終目標,順便說一句,是從當用戶離開瀏覽器應用程式或其他選項卡停止運行的定時器。

UPDATE

運行在最新的Chrome(開發)版本。我會在Firefox上測試它,如果它不同,請寫。

UPDATE 2 有趣的事實 - 不會發生在Firefox上。也許它是一個Chrome的錯誤。

+2

這對我有用。你正在使用哪種瀏覽器? –

+0

@PhilBooth Chrome(更新了問題) – Ben

+0

@Derek正如我寫的 - 我試圖看看瀏覽器是否焦點不在#here – Ben

回答

0

我有同樣的問題。我的解決方法是使用lodash的debounce()函數(https://lodash.com/docs/#debounce)。這是我的修復:

var debouncedFocus = _.debounce(() => { 
    console.log('focussed'); 
}, 250, {leading: true, trailing: false}); 

$(window).on('focus', debouncedFocus); 
0

也許load()被稱爲兩次?您可以在沒有​​的情況下注冊這些事件。試試這個:

<script> 
    $(window).focus(function() {console.log("focus");}); 
    $(window).blur(function() {console.log("blur");}); 
</script> 
+0

tnx。試過了。不起作用 – Ben

0

哪個瀏覽器?似乎運行良好。

作爲預防措施,您可以使用JavaScript變量,使其只運行一次。

<script> 
    var isFocused = false;  
    $(window).load(function() { 
     $(window).focus(function() { 
      if(isFocused) 
       return; 
      console.log("focus"); 
      isFocused = true; 
     }); 

     $(window).blur(function() { 
     console.log("blur"); 
     isFocused = false; 
     }); 
    }); 
</script> 
1

live()已被棄用。用()代替。

$(window).on("focus", function(){ alert("focus!"); }); 

你可以嘗試使用實況()函數。

$(window).live(「focus」,function(){alert(「focus!」);});

+0

從jQuery 1.7開始,「live()」方法已被棄用。使用''on()''方法代替:''(document).on(「focus」,function(){console.log(「focus!」);});''。請參閱http://api.jquery.com/live/ –

+0

對於它的價值,並不是沒有爲我解決它。 –

+0

但是不是使用v1.6的OP?那麼'活着'應該沒問題吧? – asprin

0

如果您同時使用下劃線,則可以使用_.debounce()方法將重複事件限制爲單個事件。