Как запустить функцию запуска события из обработчика событий, не создавая бесконечный цикл? - PullRequest
1 голос
/ 19 марта 2012

Я пытаюсь запустить свою функцию panelTrans из этой привязки события:

$(document).on( "pagebeforechange", function( e, data ) {           
    console.log("fired");
    // cond
    if ( data.options.pageContainer != $.mobile.pageContainer ) {

       if ( self.options.$infinity != "block" )  {
           // set a blocker to avoid infinite loop
           self.options.$infinity = "block"

           // stop JQM
           e.preventDefault();      
           e.stopPropagation();

           // fire panel transition
           self.panelTrans(e, data);
           }
      }  
  });   

Проблема в том, что функция panelTrans запускает changePage, который вызывает другое событие pagebeforechange,поэтому я создаю начальный цикл.Я пытаюсь заблокировать это с помощью опции inifite loop.Однако, это, кажется, не блокирует "быстро" достаточно, потому что я все еще получаю несколько "итераций / циклов" = консоль регистрирует 3-5 "запущенных".Если я переместил warnDefault за пределы операторов if, это предотвратит все, что также не работает.

Вопрос:
Есть ли лучший способ справиться с этим?Мне нужно перехватить changePage до того, как Jquery Mobile приступит к перезаписи параметров changePage и запустить измененный changePage для выполнения Jquery Mobile.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 20 марта 2012

Вы должны проверить тип на data.toPage и отменить событие, только когда toPage является строкой.

Вызов $.mobile.changePage() должен быть объектом страницы.

Вот пример, который я сделал для другого вопроса. http://jsfiddle.net/kiliman/zMnUM/

$(document).bind('pagebeforechange', function(e, data) {
    var to = data.toPage;

    if (typeof to  === 'string') {
        var u = $.mobile.path.parseUrl(to);
        to = u.hash || '#' + u.pathname;

        e.preventDefault();
        e.stopPropagation();

        // call $.mobileChangePage() here,
        // make sure it's a page object like $('#page')

    }
});
0 голосов
/ 19 марта 2012

Что такое self и что делает panelTrans?

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

Вы пробовали регистрировать выполнение panelTrans() вместо этого?

...