2011-08-31 49 views
9

我正在查看Android的Phonegap資源,並試圖驗證它們的notification.alert()方法是否簡單地委託給原生JavaScript alert()函數。他們的代碼做:Phonegap和提示()

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(),所以Phonegap代碼通過調用帶有兩個JSON對象/數組的prompt()函數來執行API方法notification.alert()。我的假設是,prompt()native JavaScript prompt() function(我沒有發現任何可以覆蓋此功能的JavaScript代碼)。如果是這種情況,那麼這個代碼是如何工作的?

他們做各種其他地方類似用途的prompt(),以及:

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

是不是有什麼特別的地方,他們都呼籲prompt()的方式(特別是通過包括形式gap.*:.*的第二個參數)是啓用一些自定義行爲?或者讓它們以某種方式覆蓋了在其代碼外部的prompt()函數的默認行爲?

請注意,這特別適用於Android版的Phonegap,因爲其他版本似乎使用稍微不同的機制來執行API調用。

+0

提示符返回一個字符串。哪裏不對? – xdazz

+1

問題是'prompt()'的標準版本向用戶顯示一個對話框。但是,這不是這裏發生的事情。這些'prompt()'調用的結果沒有顯示對話框,而是調用了Phonegap API的其他部分。實質上,他們使用'prompt()'作爲他們的主要API入口點,並且我想知道如何/爲什麼。 – aroth

回答

7

prompt()函數已被覆蓋。

你可以在DroidGap.java中找到它。

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

是的,PhoneGap使用提示在Android上實際製作Java到Java的橋樑。 –

+1

有趣。所以基本上,Phonegap在webview上定義了一個回調/監聽器,在實際的JavaScript提示對話框顯示之前,每當調用'prompt()'方法時都會收到通知。在回調方法中,它們基本上檢查編碼任務的'prompt()'參數,如果找到則執行它(或者只是返回false),然後通過'JsPromptResult'將結果傳回給JavaScript。我想他們不能使用'onJsAlert()'或'onJsConfirm()',因爲只有'onJsPrompt()'允許通過結果對象返回字符串?聰明。迂迴。 – aroth

+1

@aroth是的,我認爲是。 – xdazz

4

中的JavaScript到Java橋停在Android 2.3的模擬器工作。一位聰明的PhoneGap撰稿人發現,對提示的小豬支持是一種解決方法。

這裏是Android issue