Как обеспечить привязку к событию hashChange не пузырьков? - PullRequest
5 голосов
/ 25 ноября 2011

Я пытаюсь удержать привязку моего события hashChange от пузырей.

У меня есть это:

$(window).bind('hashchange', function( e ) {
    console.log("hash fired");
    // run hashChange routine
    });

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

Навигация может выглядеть следующим образом:

panel A, start down > page2
panel A, page2 down > page3
panel A, page3 up > page2
panel A, page2 up > start - hashChange fires twice here... 

Все работает хорошо (= hashChange срабатывает один раз), пока я не доберусь до страницы до начальной настройки. На последнем шаге вышеупомянутая привязка hashChange срабатывает дважды. Я пытался навсегда установить флаг где-нибудь, чтобы заблокировать 2-й hashChange, но он не работает, как я надеялся.

Вопрос:
Как можно убедиться, что это не пузыриться? Я пытаюсь что-то вроде этого, но это не работает:

var $blockBubblingHashes = 0;
$(window).bind('hashchange', function( e ) {       
   if ($blockBubblingHashes == 0) {
      // run hashChange routine
      $blockBubblingHashes = 1; 
      } else {
         $blockBubblingHashes = 0;
         }
    });

1 Ответ

3 голосов
/ 25 ноября 2011

Если вы хотите, чтобы обработчик событий запускался только один раз, вам следует рассмотреть возможность использования функции one(), которая удаляет обработчик после его первого выполнения.

$(window).one('hashchange', function( e ) {    
    console.log("hash fired");
    // run hashChange routine
});

Если вы специально хотите остановить всплывающее окно события, вместо удаления обработчика, вам следует проверить stopPropagation() и stopImmediatePropagation() в методах объекта события. К сожалению, у меня сложилось впечатление, что вы связываете все свои обработчики hashchange с window, и jQuery не документирует, в каких обработчиках событий порядка, связанных с одним и тем же элементом, выполняются; так что у вас не будет надежного способа узнать, какой обработчик вызывается первым.

...