Временно отключите событие JS и узнайте, как работает обработка события JS - PullRequest
4 голосов
/ 30 июня 2011

Я предполагал, что могу просто установить для обработчика события onhashchange значение null, изменить хэш, а затем установить для обработчика события onhashchange что-то другое, но рассмотрим следующий код:

window.onhashchange = null;
window.location.hash = "this_should_not_concern_you";
window.onhashchange = function() {alert('chunky bacon')};
doOtherStuff();

Поэтому, когда значение изменилось, обработчик событий для изменения хэша не существует, но я все еще получаю оповещения для "короткого сала".


Обновление Я выбрал решение setInterval от Jed. И хотя это работает (спасибо Джеду), оно уродливо и хрупко. Если бы произошло ( несколько парадоксальное ) onAllEventsHandled событие, то я мог бы поместить туда свою подписку onhashchange и быть уверенным, что я не случайно предупреждаю о "толстом беконе" только потому, что doOtherStuff() занимает 2 секунды для завершения.

Ответы [ 3 ]

2 голосов
/ 30 июня 2011

Ваш код является частью одного цикла событий, и поэтому, когда событие запускает следующий цикл, ваш обработчик находится на своем месте. Упрощенный пример цикла событий будет:

  1. Обработка событий
  2. Очистить стек вызовов
  3. Ожидание событий (возврат к первому шагу)

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

window.location.hash = 'test1';

window.onhashchange = function() {
    console.log(window.location.hash);
};

window.location.hash = 'test2';

Этот код будет регистрировать #test2 дважды. Обработчик срабатывает дважды, но значение после запуска обработчика - test2, оба раза.

2 голосов
/ 30 июня 2011

Он работает асинхронно. Попробуйте это:

window.onhashchange = null;
window.location.hash = "this_should_not_concern_you";
setTimeout( function() { window.onhashchange = function() {alert('chunky bacon')};}, 500 );

Задержка в 500 мс дает достаточно времени для установки обработчика после изменения хэша. (Даже 0 мс, вероятно, будет достаточно для суммирования событий.)

0 голосов
/ 30 июня 2011
window.onhashchange = null;

window.location.hash = "this_should_not_concern_you";

window.onhashchange = function() {
    window.onhashchange = function() {alert('chunky bacon')};
};

window.location.hash = "this_should";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...