如何从事件处理程序触发事件触发函数而不创建无限循环?

时间:2012-03-19 15:17:45

标签: javascript jquery events jquery-mobile

我正试图在此事件绑定中触发我的函数 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事件,所以我正在创建一个inifinte循环。我试图用inifite循环选项阻止它。然而,这似乎并没有阻止“快”,因为我仍然得到几个“迭代/循环”=控制台正在记录3-5“被解雇”。如果我将preventDefault移到if语句之外,它会阻止所有内容,这也无效。

问题:
有没有更好的方法来处理这个?我需要在Jquery Mobile之前拦截changePage,然后转换为覆盖changePage选项并触发我修改的changePage以便Jquery Mobile执行。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

什么是self以及panelTrans做了什么?

当然,您可能会获得多个“已解雇”的记录,因为它不在条件限制内。特别是当循环被阻止时,它仍然会记录新事件。

您是否尝试过记录panelTrans()的执行情况?

答案 1 :(得分:0)

您应该检查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')

    }
});