2012-03-19 65 views
1

我想從這個事件中綁定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「被解僱」。如果我在if語句之外移動preventDefault,它會阻止所有內容,這也不起作用。

問題:
有沒有更好的方法來處理這個問題?我需要在Jquery Mobile之前截獲changePage,以便覆蓋changePage選項並激活我的修改的changePage以供Jquery Mobile執行。

感謝您的幫助!

+0

爲什麼你要觸發'changePage'事件?如果你完成你的功能的執行(即改變選項),那麼該事件將被解僱? – ManseUK 2012-03-19 15:25:36

+0

@ManseUK:我在開始時嘗試了這個,但是在panelTrans通過修改選項的時候,JQM pagechange已經被觸發了,所以我需要激活一個新的。 – frequent 2012-03-19 16:33:24

回答

0

什麼是selfpanelTrans是做什麼的?

當然,您可能會得到多個「解僱」的登錄,因爲它不在條件之內。尤其是當循環被阻塞時,它仍然會記錄新的事件。

您是否嘗試過記錄panelTrans()的執行呢?

+0

對不起,刪掉了太多的代碼。 self = this,所以我使用self.pluginFunction1,self.pluginFunction2調用插件函數... PanelTrans修改默認的Jquery Mobile changePage選項(加上其他東西),並最終啓動一個新的changePage。用panelTrans執行的好指針,我會試試看。 – frequent 2012-03-19 16:31:28

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') 

    } 
}); 
+0

哦,這聽起來很不錯。檢出它。 Thx到目前爲止! – frequent 2012-03-19 20:42:40