【问题标题】:Phonegap and prompt()Phonegap 和 prompt()
【发布时间】: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


【解决方案1】:

prompt() 函数已被覆盖。

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

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

【讨论】:

  • 是的,PhoneGap 使用 prompt 在 Android 上实际制作 JavaScript 到 Java 的桥。
  • 有趣。所以基本上Phonegap在webview上定义了一个回调/监听器,每当调用prompt()方法时,在显示实际的JavaScript提示对话框之前都会通知它?在他们的回调方法中,他们基本上检查编码任务的prompt()参数,如果找到就执行它(或者如果没有就返回false),然后通过JsPromptResult将结果传递回JavaScript?而且我想他们不能为此使用onJsAlert()onJsConfirm(),因为只有onJsPrompt() 允许通过结果对象返回字符串?聪明的。而且迂回曲折。
  • 不要从你几年前编写的 JavaScript 中复制旧式的 prompt() 调用,然后粘贴到 phonegap 项目中。到那时它会默默地失败!我认为在仅限开发人员模式下输入一些信息是一种非常简单的方法,但是没有......
【解决方案2】:

JavaScript 到 Java 的桥在 Android 2.3 的模拟器上停止工作。一位聪明的 PhoneGap 贡献者发现,捎带提示是一种解决方法。

这里是Android issue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多