Як я можу написати код зворотного виклику JavaScript, який буде виконаний при будь-яких змінах в прив'язці URL-адреси?
Наприклад від http://example.com#a
доhttp://example.com#b
Як я можу написати код зворотного виклику JavaScript, який буде виконаний при будь-яких змінах в прив'язці URL-адреси?
Наприклад від http://example.com#a
доhttp://example.com#b
Відповіді:
Спеціальні пошукові системи 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 : оновлена підтримка браузера (знову).
hashChange
на window
stackoverflow.com/questions/6390341/how-to-detect-url-change
hashChanged(storedHash);
hashChanged
у цьому випадку призначена функція, реалізована розробником із використанням цього коду. Відповідь тут лише демонструє, як можна відстежувати хеш для змін там, де onhashchange
подія недоступна, і поєднує підходи, засновані на подіях та таймері, для забезпечення універсального рішення. Я хочу сказати, що відповідь, на яку ви посилаєтесь, абсолютно нічого не додає до відповіді тут ;-). Вони надають однакову основну інформацію, навіть посилання на плагін jQuery Бена Альмана. Єдина відмінність полягає в тому, що я запропонував чисте рішення JS у своїй відповіді.
Я б рекомендував використовувати addEventListener
замість перезапису window.onhashchange
, інакше ви заблокуєте подію для інших плагінів.
window.addEventListener('hashchange', function() {
...
})
Дивлячись на глобальне використання браузера сьогодні, резервний варіант вже не потрібен.
setInterval()
на сьогодні є єдиним універсальним рішенням. Але в майбутньому є деяке світло у вигляді події хеш-обміну
З того, що я бачу в інших запитаннях щодо SO, єдиним ефективним крос-браузерним рішенням є таймер. Ознайомтеся з цим запитанням, наприклад.
Ви можете отримати більше інформації з цього
Модуль події мутації призначений для повідомлення про будь-які зміни в структурі документа, включаючи attr та текстові зміни.
var storedHash = window.location.hash;
до підсумкового блоку складання. До речі: в наш час це, як мені здається, називається поліфіл.