在window.oopstate或window.onload上做一些事情,但不要两次
Do something on window.onpopstate or window.onload but never twice
我想写一个javascript代码,能够在window.onpopstate或window.onload上做一些事情,但不会做两次(请注意,chrome在加载和单击后退导航按钮时都会触发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技巧:在页面';Chrome 中的s负载
相关文章:
- Meteor Router数据函数被调用两次
- 从MySQL数据库中获取输入数据需要两次页面刷新
- Module.start()已激发两次
- Jquery点击事件必须点击两次
- Append元素在运行两次函数后不显示
- 防止双击执行两次jQuery post请求
- 我必须点击两次才能激活任何按钮操作(离子/角度)
- 单击jQuery会激发两次
- 如何避免在树上走两次
- button.单击两次删除附加操作后不工作
- 由于$compile,Javascript(Angular)嵌套指令加载了两次
- window.onclick在一个网站中使用两次
- 按钮事件中window.location更改时,IE9 onbeforeunload调用了两次..最小繁殖
- 在window.oopstate或window.onload上做一些事情,但不要两次
- $(document).ready和Window onload导致事件触发两次
- 为什么我不能两次显示新的Ext.Window ?
- $(window).focus()对每个焦点运行两次
- window.onload函数调用了两次
- window.open两次不起作用(第二个窗口没有出现)-Blocker解决方法
- 如何检查 window.open() 打开同一页面两次