2012-09-15 17 views
6

पर एक से अधिक बार आग लगता है मुझे एक फोनगैप & jQuery मोबाइल ऐप है जो एंड्रॉइड और वेब पर अच्छी तरह से काम करता है। आईओएस पर मुझे अप्रत्याशित परिणाम मिल रहे हैं, जो इस तथ्य के कारण प्रतीत होता है कि दस्तावेज़.पेजिनिट ईवेंट जिस पर मैं ऐप की अधिकांश प्रक्रियाओं के लिए हैंडलर को बांधता हूं उसे दो बार निकाल दिया जाता है।दस्तावेज़ पेजिनिट आईओएस (jQueryMobile)

नहीं, मैंने इसे दो बार बांध नहीं दिया। नहीं, मैंने document.ready का उपयोग नहीं किया था। हां, मैंने इसे दस्तावेज़ में बाध्य किया था, स्क्रिप्ट में जल्दी और किसी भी अन्य समारोह के अंदर नहीं।

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

पहली बार यह आग, स्प्लैश स्क्रीन भी दिखाई दे रहा है। इस बिंदु पर, एक्सकोड के साथ मैकबुक प्रो पर परीक्षण करते समय, कंसोल भी उपलब्ध नहीं है: कंसोल.लॉग का उपयोग करते समय उपर्युक्त संदेश कंसोल में दिखाई नहीं देता था।

दूसरी बार jQueryमोबाइल ने पहला पृष्ठ बनाया है, इसके बाद आग लग गई।

इस डबल फायरिंग का कारण क्या है और मैं इसके बारे में क्या कर सकता हूं?

संपादित करें: मैंने बाद में देखा कि उस पेजिनिट में दूसरी बार आग नहीं होती है, लेकिन हर बार जब मैं एक नई डेटा-भूमिका = 'पेज' div खोलता हूं। नीचे मेरा जवाब देखें।

उत्तर

15

का समाधान करना चाहिए मैं Zoltans जवाब की सराहना करते हैं और यह कुछ मामलों में प्रासंगिक हो सकता है, लेकिन वह कारण नहीं था।

$(document).on('pageinit') आपके jQuery मोबाइल ऐप में उपयोग किए जाने वाले प्रत्येक पृष्ठ संक्रमण के लिए आग लगेगा। यह HTML लिंक के साथ और $.mobile.changePage(); दोनों का उपयोग करते समय होगा।

चौंकाने वाला, docs इसे कहीं भी उल्लेख न करें: वे आपको यह उल्लेख किए बिना इसका उपयोग करने की सलाह देते हैं कि यह प्रत्येक आगामी पृष्ठ के लिए आग लगेगा।

मुझे विश्वास नहीं है कि वे इस समस्याग्रस्त उदाहरण को $(document).ready() के वैध समकक्ष के रूप में तैयार कर रहे हैं।

उन्हें कई कोड निष्पादन से बचने के लिए .bind() या on() के बजाय .one() का उपयोग करके बाध्य करने की सलाह देनी चाहिए।

+0

Thaaaaank आप! मैं पिछले कई मिनटों के लिए समाधान की तलाश में था, Google "पेजिनिट को दो बार बुलाया" के लिए कुछ भी नहीं देता है, और आपका '.one() 'आदर्श समाधान है। अगर मैं कर सकता था तो मैं दस से ऊपर हट जाऊंगा :) – PiotrK

+0

कुछ हद तक आश्चर्यजनक रूप से, मैंने डेस्कटॉप ब्राउज़र (आईई 10 और क्रोम/विंडोज) में अपने ऐप के कोड का उपयोग करते समय यह व्यवहार देखा है और आईओएस में नहीं। इस सुझाए गए फिक्स ने उन मामलों में भी मदद की। महान सुझाव। धन्यवाद! –

2

ऐसा इसलिए होता है क्योंकि मुझे लगता है कि आप jquery और jquery मोबाइल का एक साथ उपयोग करते हैं। लेकिन समाधान सरल है। प्रयास करें

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

यह

2

<body data-role="page"> पर शरीर को संपादित करें समस्या को हल करना चाहिए।

0

मैं उस समस्या के साथ संघर्ष कर रहा था ताकि दूसरों के साथ साझा न हो। और मुझे लगता है कि यह आईओएस के तहत ही समस्या नहीं है बल्कि एंड्रॉइड के तहत भी है (यह मेरे मामले में झटके का कारण बनता है)।

"पेजिनिट" ईवेंट प्रत्येक बार अनुरोध किए जाने पर दो बार बुलाया जाता था। पहला यूआरएल प्रदान किए गए यूआरएल के लिए डेटा प्राप्त करने के लिए उचित था, दूसरे पृष्ठ को डीओएम में लोड किया गया था (jQueryमोबाइल पेज गतिशील रूप से दस्तावेज में इंजेक्शन)।मुझे लगता है कि इस समस्या को हल करने के लिए और अधिक समाधान देखते हैं, यहाँ मेरा है:

$(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> 

मुझे आशा है कि यह दूसरों के लिए कीमती समय को छोड़ देंगे!

संबंधित मुद्दे