2 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
為了能夠運(yùn)行一些 JavaScript,例如移動(dòng)歷史記錄或播放聲音或彈出窗口,用戶首先必須在網(wǎng)站上進(jìn)行交互(單擊)。

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
我在 MDN 上找到了一個(gè)注釋。它說(shuō):
注意:調(diào)用history.pushState()或history.replaceState()不會(huì)觸發(fā)popstate事件。popstate 事件僅通過(guò)執(zhí)行瀏覽器操作來(lái)觸發(fā),例如在同一文檔的兩個(gè)歷史記錄條目之間導(dǎo)航時(shí)單擊后退按鈕(或在 JavaScript 中調(diào)用history.back())。
我建議您將事件處理程序注冊(cè)到WindowEventHandlers 的 onpopstate 屬性addEventListener()
,而不是注冊(cè)到WindowEventHandlers的onpopstate屬性。
例子:
<html>
? ? <head>
? ? ? ? <meta charset="utf-8" />
? ? ? ? <script>
? ? ? ? ? ? // ref: https://developer.mozilla.org/en-US/docs/Web/API/Window/popstate_event
? ? ? ? ? ? window.addEventListener('popstate', function(e) {
? ? ? ? ? ? ? ? alert('onpopstate');
? ? ? ? ? ? }
? ? ? ? ? ? setTimeout(function () {
? ? ? ? ? ? ? ? history.pushState(1, 'Hello John', '/hello/john');
? ? ? ? ? ? }, 2000);
? ? ? ? ? ? setTimeout(function () {
? ? ? ? ? ? ? ? history.pushState(2, 'Hello Emily', '/hello/emily');
? ? ? ? ? ? }, 3000);
? ? ? ? </script>
? ? </head>
? ? <body></body>
</html>

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊
使用 anObject
表示state
。
狀態(tài)對(duì)象是一個(gè) JavaScript 對(duì)象,與 PushState() 創(chuàng)建的新歷史記錄條目相關(guān)聯(lián)。每當(dāng)用戶導(dǎo)航到新?tīng)顟B(tài)時(shí),都會(huì)觸發(fā) popstate 事件,并且該事件的 state 屬性包含歷史記錄條目的狀態(tài)對(duì)象的副本。
const log = Logger();
// create 3 'history pages'
history.pushState({page: 1, greet: "Hello John"}, '', "#John");
history.pushState({page: 2, greet: "Hello Emily"}, '', "#Emily");
history.pushState({page: 3, greet: "Hello James"}, '', "#James");
log(`current history state: ${JSON.stringify(history.state)}`);
// on popstate log the history state if applicable
window.addEventListener("popstate", () =>
? history && history.state && log(`${history.state.greet || ""} @page ${
? ? history.state.page} (location: ${location.hash})`)
);
// listener for the buttons
document.addEventListener("click", evt => {
? if (evt.target.nodeName === "BUTTON") {
? ? return evt.target.id === "back" ? history.back() : history.forward();
? }
});
// helper function for logging in the document
function Logger() {
? let logEl;
? if (typeof window === "object") {
? ? logEl = document.querySelector("#log") || (() => {
? ? ? document.body.append(
? ? ? ? Object.assign(document.createElement('pre'),?
? ? ? ? {id: "log"}));
? ? ? return document.querySelector("#log");
? ? })();
? ? return (...logLines) =>?
? ? ? logLines.forEach(s => logEl.textContent += `${s}\n`);
? } else {
? ? return (...logLines) =>?
? ? ? logLines.forEach(ll => console.log(`* `, ll));
? }
}
<button id="back"><< 1 back</button>
<button id="forward">1 forward >></button>
添加回答
舉報(bào)