2012-09-15 64 views
6

我有一個Phonegap & jQuery Mobile應用程序可以在Android和web上很好地工作。在iOS上,我得到了意想不到的結果,這似乎是由於我將綁定大多數應用程序進程的處理程序的document.pageinit事件觸發兩次而造成的。文檔pageinit在iOS(jQueryMobile)上不止一次觸發

不,我沒有綁定兩次。不,我沒有使用document.ready。是的,我早在腳本中將它綁定到了文檔中,而不是在任何其他函數中。

$(document).on('pageinit',function(event){ 
    alert(' Pageinit on document'); 
    //Some more code 
}) 

第一次啓動時,啓動畫面仍然顯示。此時,在使用XCode測試MacBook Pro時,控制檯甚至無法使用:當我使用console.log時,以上消息未顯示在控制檯中。

第二次,jQueryMobile創建第一頁後不久就引發了火災。

是什麼導致了這種雙重射擊,我能做些什麼呢?

編輯:我後來發現,pageinit不只是第二次啓動,但每次我打開一個新的數據角色='頁'div。請參閱下面的答案。

回答

15

我很欣賞Zoltans答案,它可能會在某些情況下,相關的,但是這不是原因。

$(document).on('pageinit')將觸發您在jQuery Mobile應用程序中使用的每個頁面轉換。這將在HTML鏈接和使用$.mobile.changePage();時發生。令人驚訝的是,docs並沒有提到這個地方:他們建議你使用它,而不要提到它會在隨後的每一頁中觸發。

我不敢相信他們將這個有問題的例子定義爲$(document).ready()的有效等價物。

他們應該建議您使用.one()而不是.bind()或on()來綁定以避免多次執行代碼。

+0

Thaaaaank你!我在最後幾分鐘尋找解決方案,谷歌沒有提供任何關於「pageinit調用兩次」的信息,您的'.one()'是理想的解決方案。如果可以的話,我會加倍努力:) – PiotrK

+0

有些令人驚訝的是,在桌面瀏覽器(IE10和Chrome/Windows)中使用我的應用代碼時,我看到了這種行爲,而不是在iOS中。這個建議的修復也幫助了這些情況。偉大的建議。謝謝! –

2

它發生,因爲我認爲你一起使用jQuery和jQuery的移動。 但解決方案很簡單。嘗試

$(document:not(.processed)).addClass('processed').on('pageinit',function(event) 

這應該解決它

2

編輯正文到<body data-role="page">應該可以解決問題。

0

我一直在努力解決這個問題太久而無法與他人分享。我認爲這不僅是iOS下的問題,而且也是Android下的問題(在我的情況下導致閃爍)。

每次發出請求時都會調用「pageinit」事件兩次。第一個是爲提供的url獲取數據的正確方法,另一個在將新頁面加載到DOM(jQueryMobile頁面被動態注入到文檔中)之後調用。我認爲有更多的解決方案來解決這個問題,在這裏不用我的:

$(document).ready(function(){ 
    $(this).delegate("#page-selector", "pageinit", function(ev, data){}); 
    // I don't know why the line has to be present, but otherwise does not work 
}); 

而我的HTML文檔的樣子:

<html> 
<head>...here goes scripts...</head> 
<body> 
    <div id="#page-selector"> <!-- just wrapper --> 
     <div data-role="page"> 
     ... content... 
     </div> 
    </div> 
</body> 
</html> 

我希望這將騰出寶貴的時間給別人!

相關問題