问题描述
|
我按照规范将所有代码都放在$(document).ready中,但我的\'popstate \'侦听器也应该放在此代码的末尾吗?还是有关系吗?
解决方法
这并不重要,因为这是一个事件,甚至可以在您的“ 0”方法之前完成。唯一需要放在ѭ1里面的是与DOM交互的代码。其他所有内容都不会(可能不应该)放置在文档就绪状态中。
例:
window.onpopstate = function() {
// binding this event can be done anywhere,// but shouldn\'t be inside document ready
};
$(document).ready(function() {
// DOM manipulation and other stuff
});
现在,实际触发popstate的时间与绑定时的状态有很大不同。根据Mozilla的文档:
每当活动历史记录条目更改时,都会将popstate事件调度到窗口。如果要激活的历史记录条目是通过调用history.pushState()创建的,或者受调用history.replaceState()的影响,则popstate事件的state属性包含历史记录条目的state对象的副本。
,我很困惑,因为popstate在每次页面加载时都会触发(我使用chrome)。
从https://developer.mozilla.org/zh-CN/docs/DOM/window.onpopstate:
浏览器在页面加载时倾向于不同地处理popstate事件。
Chrome和Safari总是在页面加载时发出popstate事件,但是
Firefox没有。
因此,在chrome(显然是野生动物园)中,将执行jquery ready方法,然后执行popstate事件。
也就是说,如果您将事件附加到ready(或该事件的body.onload)中,都没有关系,则popstate事件将在您的ready方法完成后发生。
在firefox(16.0.1)中,popstate事件不会在页面加载时触发(我无法测试IE 10)。
,只需在每次推入历史记录或替换该状态时向该状态添加一个键,然后在popstate事件中检查它,如果根本不使用该状态,则只需将{}作为状态并退出弹出窗口即可如果event.state为null,则返回state。
,https://developer.mozilla.org/zh-CN/docs/Web/API/WindowEventHandlers/onpopstate
调用history.pushState()
或history.replaceState()
不会触发popstate事件。当在同一文档的两个历史记录条目之间导航时,仅通过执行浏览器操作(例如单击“后退”按钮(或在JavaScript中调用ѭ5))才能触发popstate事件。