Javascript 如何在页面加载时忽略window.onpopstate?
我正在玩Javascript 如何在页面加载时忽略window.onpopstate?,javascript,jquery,html,Javascript,Jquery,Html,我正在玩window.onpopstate,有件事让我有点恼火: 浏览器倾向于在页面加载时以不同的方式处理popstate事件。 Chrome和Safari总是在页面加载时发出popstate事件,但是 Firefox没有 我测试了它,是的,在Chrome和Safari 5.1+中,popstate事件是在页面加载时触发的,但在Firefox或IE10中没有 问题是,我只想监听popstate事件,其中用户单击后退或前进按钮(或者历史记录通过javascript更改),但不想在pageload
window.onpopstate
,有件事让我有点恼火:
浏览器倾向于在页面加载时以不同的方式处理popstate事件。
Chrome和Safari总是在页面加载时发出popstate事件,但是
Firefox没有
我测试了它,是的,在Chrome和Safari 5.1+中,popstate事件是在页面加载时触发的,但在Firefox或IE10中没有
问题是,我只想监听popstate
事件,其中用户单击后退或前进按钮(或者历史记录通过javascript更改),但不想在pageload上执行任何操作
换句话说,我想区分popstate
事件和页面加载以及其他popstate
事件
这就是我迄今为止所尝试的(我正在使用jQuery):
基本上,我尝试将我的listener
函数绑定到popstate
足够晚,以便在页面加载时不绑定,只在稍后绑定
这似乎有效,但是,我不喜欢这个解决方案。我的意思是,我如何确保为setTimeout选择的超时足够大,但不会太大(因为我不希望它等待太久)
我希望有一个更聪明的解决方案 我也遇到了类似的问题,我必须验证页面是否已完全加载 我用了这样的方法:
var page_loaded = false;
window.onpopstate = function(event){
if(!page_loaded){
page_loaded = true;
return false;
}
//Continue With Your Code
}
检查
popstate
事件处理程序中的event.state
的布尔真值:
window.addEventListener('popstate', function(event) {
if (event.state) {
alert('!');
}
}, false);
为确保此功能正常运行,在调用
history.pushState()
或history.replaceState()时,始终指定一个非null
状态参数。另外,考虑使用这样的包装库来提供跨浏览器的一致行为。在<代码> POPSTATE < /C>事件中作出反应,您需要将一些状态推到会话历史上。
例如,将此行添加到“文档准备就绪”部分:
history.pushState(null, null, window.location.pathname);
这并不理想,但它也适用于Chrome、Firefox和其他浏览器
然后,当用户单击“后退”或“前进”按钮时,以及当手动调用history.Back()
,history.Forward()
,history.go()
方法时,会正确触发事件。每次调用popstate
时,您必须再次推送另一个状态以使其工作
另见:
到今天为止,似乎没有任何浏览器在页面加载时发出事件:
浏览器过去在页面加载时处理popstate事件的方式不同,但现在它们的行为相同。Firefox从未在页面加载时发出popstate事件。Chrome直到第34版才发布,而Safari直到第10.0版才发布
来源:我也在考虑这样的解决方案。问题是,窗口加载发生在第一个onpopstate之前,因此page\u loaded
将始终为真。(JSBin:)@TamasPap解决方案可能会拒绝第一次执行代码,将page_load更改为true,然后继续执行代码。是的,但是在Fireworks和IE10中,第一个onpopstate将不会发生。@tamaspp会尝试检测浏览器并填充if条件,以便仅在执行该操作的浏览器上执行。我遇到了相同的问题,这是我所做的,不是一个明确的修复,但它99%的时间都有效:var JUST_LOADED=true;setTimeout(函数(){JUST_LOADED=false},399)
是,event.state在pageload上为空,但如果调用pushState时未定义状态,则也可以为空,例如:history.pushState(null,null,url)
;因此,请始终定义一个状态或编写一个包装类(或使用)来隐式地生成这些内容。HTML5历史API的本机实现是不一致的,因此我们不得不进行一些折衷。是的,我将使用包装类,在调用pushState
或replaceState
时,决不会对状态使用null
。请用您的最后评论更新您的答案,以便我可以接受。感谢您的帮助。要澄清:请确保调用历史记录。pushState(state,null,url)
,不要在第一个参数上使用null。当Safari在页面加载时调用popstate
时,事件状态将为零。这是如何区分初始页面加载和显式pushState调用的方法。如果我在第2页中执行了pushState
,则在激发popstate
时,事件的状态将为空。如果我做了两次pushState
我有一个有效的事件。状态
在返回时,但是用户应该按3次back按钮来查看页面1此错误似乎已经在Chrome上修复。请更新您的问题,从今天起只有safari才会出现此问题。Chrome似乎已经解决了这个问题。这个错误的popstate
发生在onload
处理之后,这意味着1ms总是足以延迟popstate
注册(因为JS没有多线程,并且按照注册的顺序处理延迟的函数)。
history.pushState(null, null, window.location.pathname);