javascript - 在 window.onpopstate 或 window.onload 上执行某些操作,但不要执行两次

标签 javascript onload onload-event popstate

我想编写一个能够在 window.onpopstate 或 window.onload 上执行某些操作但不会执行两次的 JavaScript 代码(请注意,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链接,因此页面不会刷新,但url会改变,因此他可能会点击后退按钮。这意味着变量必须在某个时刻设置回 false/但我不知道什么时候..

最佳答案

问题在于,在 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;

fiddle :http://jsfiddle.net/ER8zC/2/

在这里找到了history.state技巧:Popstate on page's load in Chrome

关于javascript - 在 window.onpopstate 或 window.onload 上执行某些操作,但不要执行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18494825/

相关文章:

javascript - Three.js - 对象出现在屏幕上的时间

javascript - 获取脚本标签评估的进度?

javascript - 使用 if/else if 函数根据选择中选择的选项执行不同的操作

javascript - Chrome 扩展窗口 onload jquery

html - 如何在页面加载时使用淡入文本/图像

jquery - 页面加载时隐藏所有 jScrollpane 滚动条

javascript - 在 Vue Client 3 中使用 webpack 插件

javascript - 悬停时jquery addclass

javascript - 如何在 Angular 示例中使用 $valid

Javascript - onload 事件