2011-08-31 15 views
9

मैं एंड्रॉइड के लिए Phonegap स्रोतों को देख रहा था, और यह सत्यापित करने की कोशिश कर रहा था कि उनकी notification.alert() विधि मूल जावास्क्रिप्ट alert() फ़ंक्शन पर बस प्रतिनिधि हो। उनके कोड है:फोनगैप और प्रॉम्प्ट()

Notification.prototype.alert = function(message, completeCallback, title, buttonLabel) { 
    var _title = (title || "Alert"); 
    var _buttonLabel = (buttonLabel || "OK"); 
    PhoneGap.exec(completeCallback, null, "Notification", "alert", [message,_title,_buttonLabel]); 
}; 

कौन सा "अलर्ट" की तरह मुझे लग रहा है exec() में आह्वान करने के लिए समारोह के नाम के रूप में व्याख्या की जाएगी, लेकिन exec() कर रही है:

PhoneGap.exec = function(success, fail, service, action, args) { 
    try { 
     var callbackId = service + PhoneGap.callbackId++; 
     if (success || fail) { 
      PhoneGap.callbacks[callbackId] = {success:success, fail:fail}; 
     } 

     //using: ["Notification", "alert", callbackId, true] 
     var r = prompt(PhoneGap.stringify(args), 
         "gap:"+PhoneGap.stringify([service, action, callbackId, true])); 

     //... 
    } catch (e2) { 
     console.log("Error: "+e2); 
    } 
}; 

अब PhoneGap.stringify() बस ले कर जाता है JSON.stringify(), इसलिए फोनगैप कोड एपीआई विधि को prompt() फ़ंक्शन को दो JSON ऑब्जेक्ट/सरणी के साथ निष्पादित कर रहा है। मेरी धारणा यह है कि prompt()native JavaScript prompt() function है (मुझे अपने जावास्क्रिप्ट कोड में कुछ भी नहीं मिला है जो इस फ़ंक्शन को ओवरराइड करेगा)। यदि ऐसा है, तो यह कोड कैसे काम कर रहा है?

वे विभिन्न अन्य स्थानों में prompt() के समान इस्तेमाल करते हैं, साथ ही:

PhoneGap.JSCallbackPort = prompt("getPort", "gap_callbackServer:"); 

वहाँ कुछ खास तरह वे prompt() बुला रहे हैं के बारे में (प्रपत्र gap.*:.* का एक दूसरा पैरामीटर शामिल करके विशेष रूप से) कि है कुछ कस्टम व्यवहार सक्षम करने? या क्या उन्होंने किसी भी तरह से prompt() फ़ंक्शन के डिफ़ॉल्ट व्यवहार को उनके जावास्क्रिप्ट कोड के बाहर कहीं भी ओवरराइड किया है?

ध्यान दें कि यह विशेष रूप से फोनगैप के एंड्रॉइड संस्करण पर लागू होता है, क्योंकि अन्य संस्करण एपीआई कॉल निष्पादित करने के लिए थोड़ा अलग तंत्र का उपयोग करते हैं।

+0

प्रॉम्प्ट एक स्ट्रिंग लौटाता है। गलत क्या है? – xdazz

+1

क्या गलत है कि 'prompt()' का मानक संस्करण उपयोगकर्ता को एक संवाद प्रदर्शित करता है। हालांकि यह नहीं हो रहा है कि यहां क्या हो रहा है। इन 'प्रॉम्प्ट()' कॉल के परिणामस्वरूप कोई संवाद प्रदर्शित नहीं होता है, इसके बजाय फोनगैप एपीआई के कुछ अन्य हिस्से को बुलाया जाता है। संक्षेप में, वे 'प्रॉम्प्ट()' का उपयोग अपने प्राथमिक एपीआई एंट्री पॉइंट के रूप में कर रहे हैं, और मैं जानना चाहता हूं कि कैसे/क्यों। – aroth

उत्तर

7

prompt() फ़ंक्शन को ओवरराइड कर दिया गया है।

आप इसे DroidGap.java में देख सकते हैं।

@Override 
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) { 
...... 
} 
+0

हाँ, फोनगैप वास्तव में एंड्रॉइड पर जावा पुल पर जावास्क्रिप्ट बनाने के लिए संकेत का उपयोग करता है। –

+1

दिलचस्प। तो मूल रूप से फोनगैप में वेबबैक पर परिभाषित कॉलबैक/श्रोता है जिसे वास्तविक जावास्क्रिप्ट प्रॉम्प्ट संवाद दिखाए जाने से पहले 'प्रॉम्प्ट()' विधि कहा जाता है, जब अधिसूचित किया जाता है? और उनकी कॉलबैक विधि में वे मूल रूप से एन्कोड किए गए कार्य के लिए 'प्रॉम्प्ट()' पैरामीटर की जांच करते हैं, अगर पाया जाता है तो इसे निष्पादित करें (या अगर झूठ वापस आते हैं), और फिर परिणाम को 'जेएसप्रोप्ट रीसेट' के माध्यम से जावास्क्रिप्ट पर वापस पास करें? और मुझे लगता है कि वे इसके लिए 'onJsAlert() 'या' onJsConfirm()' का उपयोग नहीं कर सके क्योंकि केवल 'onJsPrompt()' परिणाम ऑब्जेक्ट के माध्यम से एक स्ट्रिंग को वापस करने की अनुमति देता है? चतुर। और सर्किट। – aroth

+1

@रोथ हाँ, मुझे ऐसा लगता है। – xdazz

4

जावा पुल जावास्क्रिप्ट जावा एंड्रॉइड 2.3 में एमुलेटर पर काम करना बंद कर दिया। एक चालाक फोनगैप योगदानकर्ता ने पाया कि प्रॉम्प्ट पर पिग्गी बैकिंग एक कामकाज था।

यहां Android issue है।