2011-08-31 64 views
9

我正在查看Android的Phonegap资源,并试图验证它们的notification.alert()方法是否简单地委托给原生JavaScript alert()函数。他们的代码做:Phonegap和提示()

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]); 
}; 

这在我看来就像“警报”将被解释为函数的名称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()函数来执行API方法notification.alert()。我的假设是,prompt()native JavaScript prompt() function(我没有发现任何可以覆盖此功能的JavaScript代码)。如果是这种情况,那么这个代码是如何工作的?

他们做各种其他地方类似用途的prompt(),以及:

PhoneGap.JSCallbackPort = prompt("getPort", "gap_callbackServer:"); 

是不是有什么特别的地方,他们都呼吁prompt()的方式(特别是通过包括形式gap.*:.*的第二个参数)是启用一些自定义行为?或者让它们以某种方式覆盖了在其代码外部的prompt()函数的默认行为?

请注意,这特别适用于Android版的Phonegap,因为其他版本似乎使用稍微不同的机制来执行API调用。

+0

提示符返回一个字符串。哪里不对? – xdazz

+1

问题是'prompt()'的标准版本向用户显示一个对话框。但是,这不是这里发生的事情。这些'prompt()'调用的结果没有显示对话框,而是调用了Phonegap API的其他部分。实质上,他们使用'prompt()'作为他们的主要API入口点,并且我想知道如何/为什么。 – aroth

回答

7

prompt()函数已被覆盖。

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

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

是的,PhoneGap使用提示在Android上实际制作Java到Java的桥梁。 –

+1

有趣。所以基本上,Phonegap在webview上定义了一个回调/监听器,在实际的JavaScript提示对话框显示之前,每当调用'prompt()'方法时都会收到通知。在回调方法中,它们基本上检查编码任务的'prompt()'参数,如果找到则执行它(或者只是返回false),然后通过'JsPromptResult'将结果传回给JavaScript。我想他们不能使用'onJsAlert()'或'onJsConfirm()',因为只有'onJsPrompt()'允许通过结果对象返回字符串?聪明。迂回。 – aroth

+1

@aroth是的,我认为是。 – xdazz

4

中的JavaScript到Java桥停在Android 2.3的模拟器工作。一位聪明的PhoneGap撰稿人发现,对提示的小猪支持是一种解决方法。

这里是Android issue