我尝试了一些方法,看看是否可以创建一个跨浏览器的解决方案来延迟popstate事件,但没有成功。
有人有什么想法吗?
下面显然不起作用,但效果如下:
$(window).on('popstate', function(e) {
// something here to delay the history pageload
console.log('a wild console has appeared!');
});
因此流程将遵循以下顺序:
- 点击浏览器"后退"或"前进"按钮
- 运行初始代码
- 页面更改前的延迟
- 页面更改
根据文档,popstate事件为
仅通过执行浏览器操作(如单击后退按钮)触发
所以我不相信当用户点击"转发"时会触发它(在某些浏览器中会有所不同)
供参考,全文如下:
当活动历史记录条目发生更改时,将触发popstate事件。如果正在激活的历史条目是由对history.pushState()的调用创建的,或者受到对histors.replaceState()调用的影响,则popstate事件的state属性包含历史条目的state对象的副本。
请注意,仅调用history.pushState()或history.replaceState()不会触发popstate事件popstate事件仅通过执行浏览器操作触发,例如单击后退按钮(或在JavaScript中调用history.back())。
浏览器在页面加载时倾向于以不同的方式处理popstate事件。Chrome(v34之前)和Safari在页面加载时总是会发出popstate事件,但Firefox不会。
更新了上面的答案
不过,在使用jQuery库之前,请确保它包含在HTML中。
$(window).on('popstate', function(e) {
console.log('fired instantly!');
var timer = setTimeout(function() {
console.log('delayed popstate!');
clearTimeout(timer);
}, 1000);
});
$(window).trigger( 'popstate') ;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>