【问题标题】:Do something on window.onpopstate or window.onload but never twice在 window.onpopstate 或 window.onload 上做一些事情,但从不做两次
【发布时间】:2013-08-31 22:26:55
【问题描述】:

我想编写一个 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 链接,所以页面不会刷新,但 url 会改变,因此他可能会点击后退按钮。这意味着必须在某个时刻将变量设置回 false / 但我不知道何时..

【问题讨论】:

  • 使用变量检查是否已经运行?
  • 那行得通吗?我很困惑,因为我不知道如何控制时间流,例如,该变量会在我检查它之前还是之后或同时取值..?
  • 以及之后如何将其设置回 false ..?

标签: javascript onload onload-event popstate


【解决方案1】:

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

【讨论】:

  • 这是一个语法错误window.onload || window.onpopstate = function(){
  • 更新了答案。我假设您的原始语法是有效的。
  • 谢谢,另请参阅我的编辑,我现在如何将变量设置回 false?
  • 该变量将在页面加载时自动设置为 false。您提到您只想在每次页面加载时运行此函数一次,这将执行此操作。
  • 当我加载页面时它可以工作,但是如果我点击菜单上的几个(ajax)链接然后点击后退按钮(一个popstate事件)它就不会再工作了,因为变量是设置为真..
猜你喜欢
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多