Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在页面加载时忽略window.onpopstate?_Javascript_Jquery_Html - Fatal编程技术网

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);