2011-08-31 15 views
9

Przeglądałem źródła Phonegap dla Androida i próbowałem zweryfikować, czy ich metoda notification.alert() po prostu przekazuje funkcję natywnej JavaScript alert(). Ich kodu:Phonegap i monit()

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

Który patrzy na mnie jak „alarm” będzie interpretowany jako nazwa funkcji, aby powołać się w exec(), ale exec() robi:

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

Teraz PhoneGap.stringify() prostu postanawia JSON.stringify(), więc kod Phonegap wykonuje metodę API notification.alert(), wywołując funkcję prompt() z dwoma obiektami/tablicami JSON. Moje założenie jest takie, że prompt() jest native JavaScript prompt() function (nie znalazłem nic w ich kodzie JavaScript, który zastąpiłby tę funkcję). Jeśli tak jest, to w jaki sposób działa ten kod?

Robią podobnym zastosowaniu prompt() w różnych innych miejscach, a także:

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

Czy jest coś szczególnego sposobu ich wywołującego prompt() (w szczególności poprzez włączenie drugi parametr formularza gap.*:.*), który jest włączanie niestandardowych zachowań? A może w jakiś sposób nadpisują domyślne zachowanie funkcji prompt() gdzieś poza ich kodem JavaScript?

Należy zauważyć, że dotyczy to wersji Android Phonegap, ponieważ inne wersje wydają się używać nieco innych mechanizmów do wykonywania wywołań API.

+0

Prośba zwraca ciąg znaków. Co jest nie tak? – xdazz

+1

Co jest nie tak, to że standardowa wersja 'prompt()' wyświetla okno dialogowe dla użytkownika. Jednak to nie jest to, co się tutaj dzieje. W wyniku tych wywołań 'prompt()' nie pojawia się okno dialogowe, zamiast tego wywoływana jest inna część interfejsu API Phonegap. Zasadniczo używają one 'prompt()' jako podstawowego punktu wejścia API i chciałbym wiedzieć jak/dlaczego. – aroth

Odpowiedz

7

Funkcja prompt() została nadpisana.

Możesz to znaleźć w DroidGap.java.

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

Tak, PhoneGap używa podpowiedzi do wykonania mostka JavaScript na Java na Androida. –

+1

Interesujące. Więc w zasadzie Phonegap ma callback/detektor zdefiniowany w widoku webowym, który jest powiadamiany za każdym razem, gdy wywoływana jest metoda 'prompt()', zanim zostanie pokazane prawdziwe okno dialogowe zachęty JavaScript? A w ich metodzie wywołania zwrotnego w zasadzie sprawdzają parametry 'prompt()' dla zakodowanego zadania, wykonują je, jeśli zostały znalezione (lub po prostu zwracają fałsz, jeśli nie), a następnie przekazują wynik do JavaScript za pomocą 'JsPromptResult'? I przypuszczam, że nie mogliby użyć 'onJsAlert()' lub 'onJsConfirm()', ponieważ tylko 'onJsPrompt()' pozwala na zwrócenie łańcucha za pomocą obiektu wynikowego? Sprytny. I okrężny. – aroth

+1

@aroth Yep, tak myślę. – xdazz

4

Most JavaScript-Java przestał działać na emulatorze w systemie Android 2.3. Sprytny uczestnik PhoneGap odkrył, że wsparcie dla piggy on prompt było obejściem problemu.

Oto Android issue.

Powiązane problemy