Как получить уведомление об изменении истории с помощью метода history.pushState ()?
Задача состоит в том, чтобы обнаруживать изменения в истории браузера при каждом вызове метода history.pushState (). Чтобы обнаруживать изменения в истории браузера всякий раз, когда вызывается метод history.pushState () , нам нужно обезьяно-патчить (изменить поведение существующей функции, аналогично переопределению) объект с именем window.history . Затем мы вставим часть нашей собственной логики, которая будет выполняться всякий раз, когда история браузера изменяется в функции history.pushState .
Синтаксис:
window.onpopstate = history.onpushstate = функция (e) { // Код для срабатывания при изменении истории };
Примеры ниже иллюстрируют вышеуказанный подход:
Пример 1: Здесь мы вызываем history.pushState нажатием кнопки и обнаруживаем его. Нажав кнопку изменения, мы видим в консоли, что история была изменена и новое состояние было добавлено. Мы также видим, что URL-адрес браузера был изменен, и теперь он указывает на test.html вместо index.html.
<!DOCTYPE html> < html > < body > < center > < h1 id = "Geeks" style = "color: green;" > GeeksforGeeks </ h1 > <!-- Button to modify history of browser --> < button id = "mod" >Modify History</ button > </ center > < script src = </ script > < script type = "text/javascript" > // Monkey patching window.history (function(history) { var pushState = history.pushState; history.pushState = function(state) { if (typeof history.onpushstate == "function") { history.onpushstate({ state: state }); } return pushState.apply(history, arguments); } })(window.history); window.onpopstate = history.onpushstate = function(e) { console.log('History has been modified!') console.log(e) }; $('#mod').click(function() { // Adds a gfg state to history and pushes // to test.html window.history.pushState({ gfg: 'Geeks' }, "page 2", "test.html"); }); </ script > </ body > </ html > |
Выход:
History has been modified! {state: {gfg: "Geeks"}}
Пример 2: В этом примере мы изменим историю браузера, как только страница загрузится, и обнаружим ее. По мере загрузки страницы мы видим в консоли, что история была изменена и было добавлено новое состояние. Мы также видим, что URL-адрес браузера был изменен, и теперь он указывает на test.html вместо index.html.
<!DOCTYPE html> < html > < body > < center > < h1 id = "Geeks" style = "color: green;" > GeeksforGeeks </ h1 > </ center > < script src = </ script > < script type = "text/javascript" > // Monkey patching window.history (function(history) { var pushState = history.pushState; history.pushState = function(state) { if (typeof history.onpushstate == "function") { history.onpushstate({ state: state }); } return pushState.apply(history, arguments); } })(window.history); window.onpopstate = history.onpushstate = function(e) { console.log('History has been modified!') console.log(e) }; $(document).ready(function() { // Adds a gfg state to history and pushes // to test.html window.history.pushState({ gfg: 'Geeks' }, "page 2", "test.html"); }); </ script > </ body > </ html > |
Выход:
История изменена! {состояние: {gfg: "Компьютерщики"}}
Примечание. По соображениям безопасности window.history.pushState может не работать в изолированном документе без сервера.