2011-08-31 16 views
9

Stavo cercando tra le origini Phonegap per Android e cercando di verificare che il loro metodo notification.alert() delegasse semplicemente alla funzione nativa di JavaScript alert(). Il loro codice fa:Phoneegap e 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]); 
}; 

Il che mi sembra "alert" viene interpretato come il nome della funzione per richiamare in exec(), ma exec() sta facendo:

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

Ora PhoneGap.stringify() risolve semplicemente JSON.stringify(), quindi il codice PhoneGap sta eseguendo il metodo API notification.alert() chiamando la funzione prompt() con due oggetti/matrici JSON. La mia ipotesi è che prompt() sia il native JavaScript prompt() function (non ho trovato nulla nel loro codice JavaScript che sovrascriverebbe questa funzione). Se questo è il caso, allora come funziona questo codice?

fanno uso simile di prompt() in diversi altri luoghi, come pure:

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

C'è qualcosa di speciale nel modo in cui stanno chiamando prompt() (in particolare includendo un secondo parametro della forma gap.*:.*) che è abilitare un comportamento personalizzato? Oppure hanno in qualche modo sovrascritto il comportamento predefinito della funzione prompt() da qualche parte esterna al loro codice JavaScript?

Si noti che questo si applica specificamente alla versione Android di PhoneGap, poiché le altre versioni sembrano utilizzare meccanismi leggermente diversi per l'esecuzione delle chiamate API.

+0

Il prompt restituisce una stringa. Che c'è? – xdazz

+1

Ciò che è sbagliato è che la versione standard di 'prompt()' visualizza una finestra di dialogo per l'utente. Comunque non è quello che sta succedendo qui. Non vi è alcuna finestra di dialogo visualizzata come risultato di queste chiamate 'prompt()', ma viene invocata un'altra parte dell'API di Phonegap. In sostanza, usano 'prompt()' come loro principale punto di ingresso API, e mi piacerebbe sapere come/perché. – aroth

risposta

7

La funzione prompt() è stata ignorata.

È possibile trovarlo in DroidGap.java.

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

Sì, PhoneGap utilizza il prompt per rendere effettivamente il ponte JavaScript su Java su Android. –

+1

Interessante. Quindi, in pratica, Phonegap ha un callback/listener definito sulla webview che viene notificato ogni volta che viene chiamato il metodo 'prompt()', prima che venga visualizzata la finestra di dialogo del prompt JavaScript reale? E nel loro metodo di callback controllano fondamentalmente i parametri 'prompt()' per un'attività codificata, la eseguono se vengono trovati (o restituiscono semplicemente false se non lo sono), e poi restituiscono il risultato al JavaScript tramite 'JsPromptResult'? E suppongo che non potrebbero usare 'onJsAlert()' o 'onJsConfirm()' per questo, perché solo 'onJsPrompt()' consente di restituire una stringa tramite l'oggetto risultato? Intelligente. E tortuoso. – aroth

+1

@aroth Sì, penso di si. – xdazz

4

Il bridge JavaScript to Java ha smesso di funzionare sull'emulatore in Android 2.3. Un collaboratore di PhoneGap ha scoperto che il backup dei porcellini su prompt era una soluzione.

Questo è il Android issue.