在window.onpopstate或window.onload上执行某些操作但从不执行两次

时间:2013-08-28 17:48:33

标签: javascript onload onload-event popstate

我想编写一个javascript代码,能够在window.onpopstate或window.onload上执行某些操作但从不执行两次(请注意,chrome会在onload和单击后退导航按钮时触发popstate事件)

我希望它兼容主流现代浏览器(IE10 firefox chrome opera safari)

我宁愿不使用任何库 - 甚至不是jquery。

像这样的东西(但当然有正确的语法):

window.onload || window.onpopstate = function(){
    window.alert("hello world");
}

由于

编辑1

根据你的建议我试过这个:

var ranAlready=false;

window.onload = function(){
if (!ranAlready){
    window.alert("onload was true");
    ranAlready=true;
}
};

window.onpopstate = function(){
if (!ranAlready){
    window.alert("popstate was true");
    ranAlready=true;
}
};

但是现在我不确定如何将变量设置为false ..因为它取决于浏览器等等。

编辑2

我需要它不止一次工作,因为用户可能会点击一些ajax链接,因此页面不会刷新但是网址会改变,因此他可能会点击后退按钮。这意味着变量必须在某个时刻被设置为假/但我不知道什么时候......

1 个答案:

答案 0 :(得分:2)

问题是在Chrome中,“popstate”事件在页面加载时触发,因此处理程序将运行两次。你可以通过在popstate上运行时检查历史状态来检测它是否在初始加载时运行。

function showAlert() {
    window.alert("hello world");
}
function showAlertOnPopState(){
    if (window.history.state == null){ // This means it's page load
        return;
    }
    showAlert();
}

window.onload = showAlert;
window.onpopstate = showAlertOnPopState;

小提琴:http://jsfiddle.net/ER8zC/2/

在此处找到history.state技巧:Popstate on page's load in Chrome