我正在浏览Android的Phonegap来源,并尝试验证他们的notification.alert()
方法只是委托给原生JavaScript 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]);
};
在我看来,“alert”将被解释为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对象/数组调用notification.alert()
函数来执行prompt()
API方法。我的假设是prompt()
是native JavaScript prompt() function(我在他们的JavaScript代码中找不到任何会覆盖此函数的内容)。如果是这种情况,那么这段代码是如何工作的呢?
他们在其他各个地方也使用prompt()
:
PhoneGap.JSCallbackPort = prompt("getPort", "gap_callbackServer:");
他们调用prompt()
的方式(特别是通过包含gap.*:.*
形式的第二个参数)是否有一些特殊内容可以启用某些自定义行为?或者他们以某种方式覆盖了JavaScript代码外部某处prompt()
函数的默认行为?
请注意,这特别适用于Android版本的Phonegap,因为其他版本似乎使用稍微不同的机制来执行API调用。
答案 0 :(得分:7)
prompt()
功能已被覆盖。
你可以在DroidGap.java中找到它。
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
......
}
答案 1 :(得分:4)
JavaScript to Java网桥停止在Android 2.3中的模拟器上运行。聪明的PhoneGap贡献者发现,提示小猪支持是一种解决方法。