2012-01-06 62 views
6

我有以下監聽器設置爲「pagebeforechange」(非常類似於jQuery Mobile的文檔自己的代碼),並在主頁上的鏈接,呼籲http://localhost/#product?id=255979jQuery Mobile的「pagebeforechange」被稱爲兩次

//Bind Listener for Product Details 
$(document).bind("pagebeforechange", function(e, data) { 
    //Only Run If Site is Initialized 
    if(ajaxSite.options.initialized) { 
     if (typeof data.toPage === "string") { 
      var u = $.mobile.path.parseUrl(data.toPage), 
       pl = /^#product/; 

      if (u.hash.search(pl) !== -1) { 
       console.log("showProduct being called."); 
       ajaxSite.showProduct(u, data.options); 
       e.preventDefault(); 
      } 
     } 
    } 
}); 

當我打開JavaScript控制檯,然後單擊我看到下面的鏈接:

showProduct being called. 
showProduct being called. 

我似乎無法找到它爲什麼會得到兩次叫什麼。我看到了其他的錯誤,其中由於邊緣點擊而vclicks被註冊了兩次,但這沒有任何意義,因爲它依賴於實際的頁面更改。

+0

您是否正在運行多頁或單頁佈局? http://jquerymobile.com/demos/1.0/docs/pages/index。我想問的原因是你綁定到$(document)而不是pageId – 2012-01-06 17:52:46

+0

多頁面佈局 - 「showProduct()」方法將信息加載到第二頁上,然後轉換。 – Jack 2012-01-06 18:02:45

+0

我想知道,因爲你綁定$(文檔)它被多次調用,你可以使用pageId來代替並測試嗎? – 2012-01-06 18:07:37

回答

6

既然你綁定到$(文件),並使用多頁面佈局

我覺得JQM加載文檔多次(只是一種預感)

切換到使用PAGEID代替,例如:

$(document).bind("pagebeforechange", function(e, data) { ... 

$('#pageId').bind("pagebeforechange", function(e, data) { ... 
+3

對我來說,使用v1.0插入pageId時不會觸發事件...(另請參閱http://stackoverflow.com/questions/8793403/jquery-mobile-cant-bind-pagebeforechange-to-page- id) – Lincoln 2012-01-26 02:01:54

+0

綁定到pageId不會觸發事件 – 2012-03-08 11:03:42

+0

@JihoKang如果您發佈了一些您正在使用的代碼的問題,可能會更容易以這種方式幫助您 – 2012-03-08 12:42:49

4

也許有點晚,但這裏是我的猜測:

任何pagechange事件觸發兩個轉變,一個 「前進」(pagechange)和一個 「落後」(hashchange)。如果你繼續前進,那麼hashChange會被阻止,如果你落後了,這是另一回事。

調查jqm源代碼並檢查ignoreNextHashChange屬性。

這是負責阻止正向轉換的hashChange,否則你會來回。

我想你的函數會觸發兩次,因爲這兩個事件都是從changePage和hashChange內部觸發的。

如果是這種情況,JQM必須在觸發此事件之前阻止hashChange rountine。

+0

我給你一個觀點,因爲這是有益的建議,但我實際上很早以前就想出了這個問題:-)。這個問題必須做preventDefault()沒有運行,同時仍然手動調用頁面更改。我有一個AJAX調用方法在preventDefault()之上,並且AJAX的錯誤沒有得到正確處理,並且preventDefault()從未被調用過。愚蠢的錯誤,但它在盯着它6個小時後讓我瘋狂。真的只需要另一雙眼睛來告訴我我一直在跳過什麼。謝謝! – Jack 2012-02-04 17:06:29

3

它被設計調用兩次。 http://api.jquerymobile.com/pagebeforechange/

如果data.toPage設置爲字符串,則表明導航即將開始。

如果將data.toPage設置爲jQuery對象,則表明目標頁面已加載。

+0

閱讀問題。發佈的代碼顯示過濾(typeof data.toPage ===「string」)。該事件顯示爲通過該條件兩次。這個問題更復雜。 – janoside 2014-04-03 14:37:01

+0

對於那些不知道這一點的人來說,這是非常有用的信息,但是由於它的表達方式,我不會將它恢復爲零 – 2014-04-14 23:40:36