【发布时间】:2011-11-07 06:29:09
【问题描述】:
我正在查看 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 对象/数组调用prompt() 函数来执行notification.alert() API 方法。我的假设是 prompt() 是 native JavaScript prompt() function (我在他们的 JavaScript 代码中没有发现任何会覆盖这个函数的东西)。如果是这样,那么这段代码是如何工作的?
他们在其他各个地方也对prompt() 进行了类似的使用:
PhoneGap.JSCallbackPort = prompt("getPort", "gap_callbackServer:");
他们调用prompt() 的方式有什么特别之处(特别是通过包含gap.*:.* 形式的第二个参数)来启用一些自定义行为?或者他们是否以某种方式覆盖了 JavaScript 代码外部某处的 prompt() 函数的默认行为?
请注意,这特别适用于 Android 版本的 Phonegap,因为其他版本似乎使用稍微不同的机制来执行 API 调用。
【问题讨论】:
-
提示返回一个字符串。怎么了?
-
问题是
prompt()的标准版本向用户显示了一个对话框。然而,这不是这里发生的事情。这些prompt()调用的结果没有显示对话框,而是调用了Phonegap API 的其他部分。从本质上讲,他们使用prompt()作为他们的主要 API 入口点,我想知道如何/为什么。
标签: javascript android cordova prompt