Обробляти подію зміни якоря URL-адреси в js


Відповіді:


126

Спеціальні пошукові системи Google використовують таймер для перевірки хешу щодо попереднього значення, тоді як дочірній iframe в окремому домені оновлює хеш батьківського місцезнаходження, щоб містити розмір тіла документа iframe. Коли таймер вловлює зміни, батько може змінити розмір iframe так, щоб він відповідав тілу, щоб смуги прокрутки не відображалися.

Щось на зразок наступного досягає того ж:

var storedHash = window.location.hash;
window.setInterval(function () {
    if (window.location.hash != storedHash) {
        storedHash = window.location.hash;
        hashChanged(storedHash);
    }
}, 100); // Google uses 100ms intervals I think, might be lower

Google Chrome 5, Safari 5, Opera 10.60 , Firefox 3.6 і Internet Explorer 8 все підтримують hashchangeподія:

if ("onhashchange" in window) // does the browser support the hashchange event?
    window.onhashchange = function () {
        hashChanged(window.location.hash);
    }

і скласти його разом:

if ("onhashchange" in window) { // event supported?
    window.onhashchange = function () {
        hashChanged(window.location.hash);
    }
}
else { // event not supported:
    var storedHash = window.location.hash;
    window.setInterval(function () {
        if (window.location.hash != storedHash) {
            storedHash = window.location.hash;
            hashChanged(storedHash);
        }
    }, 100);
}

jQuery також має плагін, який перевірятиме подію хеш-обміну та надаватиме свій власний при необхідності - http://benalman.com/projects/jquery-hashchange-plugin/ .

EDIT : оновлена ​​підтримка браузера (знову).


для повноти додайте var storedHash = window.location.hash;до підсумкового блоку складання. До речі: в наш час це, як мені здається, називається поліфіл.
Frank Nocke

1
В даний час ви можете слухати hashChangeна window stackoverflow.com/questions/6390341/how-to-detect-url-change
Тімо Huovinen

@AndyE Я прочитав відповідь, пропустив невеличку нотатку і ніколи не бачив подій, які виглядають такhashChanged(storedHash);
Тимо Хуовінен

1
@TimoHuovinen: hashChangedу цьому випадку призначена функція, реалізована розробником із використанням цього коду. Відповідь тут лише демонструє, як можна відстежувати хеш для змін там, де onhashchangeподія недоступна, і поєднує підходи, засновані на подіях та таймері, для забезпечення універсального рішення. Я хочу сказати, що відповідь, на яку ви посилаєтесь, абсолютно нічого не додає до відповіді тут ;-). Вони надають однакову основну інформацію, навіть посилання на плагін jQuery Бена Альмана. Єдина відмінність полягає в тому, що я запропонував чисте рішення JS у своїй відповіді.
Andy E

1
Я шукав якийсь легкий JS-маршрутизатор, але це добре зробило роботу. Також усунув усі залежності :)
gskema

4

Я б рекомендував використовувати addEventListenerзамість перезапису window.onhashchange, інакше ви заблокуєте подію для інших плагінів.

window.addEventListener('hashchange', function() {
...
})

Дивлячись на глобальне використання браузера сьогодні, резервний варіант вже не потрібен.



2

З того, що я бачу в інших запитаннях щодо SO, єдиним ефективним крос-браузерним рішенням є таймер. Ознайомтеся з цим запитанням, наприклад.


1

(Тільки для запису.) Синтетична подія YUI3 "hashchange" робить більш-менш те саме, що і прийнята відповідь

YUI().use('history-hash', function (Y) {
  Y.on('hashchange', function (e) {
    // Handle hashchange events on the current window.
  }, Y.config.win);
});

0

Ви можете отримати більше інформації з цього

Типи подій мутації

Модуль події мутації призначений для повідомлення про будь-які зміни в структурі документа, включаючи attr та текстові зміни.


Мова йде про зміни DOM.
Радж
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.