2011-08-31 24 views
9

Estaba buscando a través de las fuentes Phonegap para Android, y tratando de verificar que su método notification.alert() simplemente delega en la función nativa JavaScript alert(). Su código hace:Phonegap y prompt()

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

que se parece a mí como "alerta" se interpretará como el nombre de la función que se invocará en exec(), pero exec() está haciendo:

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

Ahora PhoneGap.stringify() simplemente resuelve JSON.stringify(), por lo que el código Phonegap está ejecutando el método notification.alert() API llamando a la función prompt() con dos objetos/matrices JSON. Mi suposición es que prompt() es native JavaScript prompt() function (no he encontrado nada en su código JavaScript que invalide esta función). Si ese es el caso, entonces, ¿cómo está funcionando este código?

hacen uso similar de prompt() en varios otros lugares, así:

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

¿Hay algo especial acerca de la forma en que están llamando prompt() (en concreto mediante la inclusión de un segundo parámetro de la forma gap.*:.*) que es permitiendo algún comportamiento personalizado? ¿O han anulado de alguna manera el comportamiento predeterminado de la función prompt() en algún lugar externo a su código JavaScript?

Tenga en cuenta que esto se aplica específicamente a la versión Android de Phonegap, ya que otras versiones parecen usar mecanismos ligeramente diferentes para ejecutar las llamadas API.

+0

El prompt devuelve una cadena. ¿Qué está mal? – xdazz

+1

Lo que está mal es que la versión estándar de 'prompt()' muestra un diálogo para el usuario. Sin embargo, eso no es lo que está sucediendo aquí. No se muestra ningún diálogo como resultado de estas llamadas 'prompt()', sino que se invoca otra parte de la API de Phonegap. En esencia, están usando 'prompt()' como su punto de entrada principal de API, y me gustaría saber cómo/por qué. – aroth

Respuesta

7

La función prompt() ha sido anulada.

Puede encontrarlo en DroidGap.java.

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

Sí, PhoneGap usa el mensaje para hacer realmente el puente de JavaScript a Java en Android. –

+1

Interesante. Así que, básicamente, Phonegap tiene un callback/listener definido en la vista web que se notifica cada vez que se llama al método 'prompt()', antes de que se muestre el cuadro de diálogo de solicitud de JavaScript real? Y en su método de devolución de llamada básicamente verifican los parámetros 'prompt()' para una tarea codificada, la ejecutan si se encuentran (o simplemente devuelven false si no), y luego pasan el resultado de vuelta al JavaScript a través del 'JsPromptResult'? Y supongo que no podrían usar 'onJsAlert()' o 'onJsConfirm()' para esto porque solo 'onJsPrompt()' permite que una cadena sea devuelta a través del objeto resultante? Inteligente. Y tortuoso. – aroth

+1

@aroth Sí, creo que sí. – xdazz

4

El puente JavaScript to Java dejó de funcionar en el emulador en Android 2.3. Un astuto colaborador de PhoneGap descubrió que la ejecución de piggy backing era una solución alternativa.

Aquí está el Android issue.