У меня есть следующий код
console.info('checking if url contains hash');
if (!location.hash) {
console.warn('if-block replacing hash to empty!');
location.href = '#';
// Running route() to trigger Router.otherwise()
console.info('running route() from if-block(hash doesn\'t exist)');
route(location.hash.slice(1));
} else {
// URL contains a hash. Running Router.when() to load template
console.info('running route() from else-block(hash already present in url)');
route(location.hash.slice(1));
}
// Bind hashchange-event to window-object... duh
console.info('binding hashchange event');
$(window).on('hashchange', function () {
console.info('running route() from hashchange');
route(location.hash.slice(1));
});
Ясно, что прослушиватель событий присоединен после блока else-if. Вывод моей консоли подтверждает это
2015-02-13 12:51:14.281 main.js:69 checking if url contains hash
2015-02-13 12:51:14.284 main.js:71 if-block replacing hash to empty!
2015-02-13 12:51:14.290 main.js:75 running route() from if-block(hash doesn\'t exist)
2015-02-13 12:51:16.677 main.js:84 binding hashchange event
2015-02-13 12:51:16.678 main.js:86 running route() from hashchange
Похоже, что прослушиватель событий каким-то образом улавливает ранее инициированное событие hashchange.
Это происходит только в том случае, если URL имеет значение example.com
, а не example.com/#
. Если /
или /#
отсутствуют в URL-адресе при входе на сайт, возникает это явление.
Изменить: проблема, с которой я сталкиваюсь, заключается в том, что прослушиватель событий hashchange
срабатывает еще до того, как он прослушивает изменения хэша. Мне интересно, нормально ли это.
Другое редактирование: еще более наглядный пример, показывающий, что когда я впервые запускаю getEventListeners(window)
, к событию hashchange
не подключаются слушатели. Несмотря на это, когда я добавляю прослушиватель событий, он получает ранее запущенный hashchange
Я что-то упустил или что происходит?
Есть ли способ обойти это?
hashchange
. Но я еще не прикрепил прослушиватель событий кhashchange
, что видно в строке 84 в журналах консоли. - person mhrvatin   schedule 13.02.2015hashchange
при изменении хэша. Тем не менее, когда я добавляю прослушиватель, он срабатывает сразу же, поскольку я изменил хэш до его добавления. Не могли бы вы объяснить это в ответ? Я посмотрю, смогу ли я воспроизвести проблему на скрипке. - person mhrvatin   schedule 13.02.2015