我正在查看Phonegap Android源代码,并尝试验证他们的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 对象/数组调用 prompt()
函数来执行 notification.alert()
API 方法。我的假设是 prompt()
是 本地 JavaScript prompt() 函数(我没有发现任何在他们的 JavaScript 代码中覆盖此函数的内容)。如果是这样,那么这段代码是如何工作的?他们在其他地方也类似地使用了
prompt()
:PhoneGap.JSCallbackPort = prompt("getPort", "gap_callbackServer:");
他们调用prompt()
的方式有什么特殊之处(特别是包括形式为gap.*:.*
的第二个参数),这是否启用了某些自定义行为?还是他们在JavaScript代码外部某处覆盖了prompt()
函数的默认行为?
请注意,这仅适用于Phonegap的Android版本,因为其他版本似乎使用略有不同的机制来执行API调用。
prompt()
会向用户显示一个对话框。但是这里并没有发生这种情况。这些prompt()
调用不会显示任何对话框,而是调用了 Phonegap API 的其他部分。实质上,他们将prompt()
用作主要的 API 入口点,我想知道如何/为什么这样做。 - aroth