$(window).focus()为每个焦点运行两次

时间:2011-10-31 12:36:04

标签: javascript jquery

我不确定为什么会这样,我很想得到解释。

使用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>

当浏览器重新获得焦点时,该功能会运行两次,并且“焦点”会在控制台中打印两次。 知道为什么会这样吗?

最终目标btw是在用户离开浏览器到应用程序或其他标签时停止计时器运行。

更新

运行最新的(dev)版本的chrome。我会在firefox上测试它并写一下它是否有所不同。

更新2 有趣的事实 - 在Firefox上不会发生。也许它是铬的一个错误。

5 个答案:

答案 0 :(得分:1)

live()已被弃用。请改用()代替。

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

您可以尝试使用live()函数。

$(window).live(“focus”,function(){alert(“focus!”);});

答案 1 :(得分:1)

我有同样的问题。我对此的解决方法是使用lodash&#39; //map the data delPD = delPageData.PageNum.map((x,i) => ({ pageNum: x, rowNum: delPageData["RowNum"][i], cName: delPageData["CustomerName"][i], fName: delPageData["FacilityName"][i], })); //sort the data delPD.sort(function(a,b) { if(a.pageNum == b.pageNum) { return (a.rowNum - b.rowNum); } else { return (a.pageNum - b.pageNum); } }); //give the data an index number for ordering purposes later for(var i=0; i<delPD.length; i++) { delPD[i].index = i; } 函数(https://lodash.com/docs/#debounce)。这是我的修复:

debounce()

答案 2 :(得分:0)

也许load()被叫两次?您可以在没有.load()的情况下注册这些活动。试试这个:

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

答案 3 :(得分: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>

答案 4 :(得分:0)

如果您同时使用下划线,则可以使用_.debounce()方法将重复事件限制为单个事件。