Phonegap和prompt()是什么?

9

我正在查看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调用。


提示返回了一个字符串。有什么问题吗? - xdazz
1
问题在于标准版本的 prompt() 会向用户显示一个对话框。但是这里并没有发生这种情况。这些 prompt() 调用不会显示任何对话框,而是调用了 Phonegap API 的其他部分。实质上,他们将 prompt() 用作主要的 API 入口点,我想知道如何/为什么这样做。 - aroth
2个回答

7

prompt()函数已被覆盖。

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

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

是的,PhoneGap使用prompt在Android上实际进行JavaScript到Java桥接。 - Paul Beusterien
1
有趣。所以基本上Phonegap在webview上定义了一个回调/监听器,每当调用prompt()方法时就会通知它,然后才显示实际的JavaScript提示对话框?在他们的回调方法中,他们基本上检查prompt()参数是否包含编码任务,如果找到则执行它(如果没有则返回false),然后通过JsPromptResult将结果传递回JavaScript?我想他们不能使用onJsAlert()onJsConfirm(),因为只有onJsPrompt()允许通过结果对象返回字符串?聪明。迂回。 - aroth
1
不要从几年前编写的某些JavaScript中复制旧样式的prompt()调用,并粘贴到PhoneGap项目中。在那一点上,它将悄悄地失败!我认为这将是一个不错的简单方法,在仅限开发人员模式下输入一些信息,但事实并非如此... - Magnus Smith

4

在Android 2.3模拟器中,JavaScript到Java桥已经停止工作。一个聪明的PhoneGap贡献者发现,利用prompt是一种解决方法。

这里是Android问题链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接