2011-08-31 9 views
9

私はPhonegapの情報源を探して、そのnotification.alert()メソッドがネイティブJavaScript alert()機能に委譲していることを確認しようとしていました。彼らのコードはありません:今すぐPhonegapとprompt()

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()は、単純に解決:exec()に呼び出すための関数の名前として解釈されます「警告」が、exec()がやっているように私には見えます

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

JSON.stringify()であるため、Phonegapコードは APIメソッドを2つのJSONオブジェクト/配列を持つprompt()関数を呼び出して実行しています。私の前提は、prompt()native JavaScript prompt() functionであるということです(JavaScriptコードでこの機能を無効にするものは見つかりませんでした)。その場合、このコードはどのように機能していますか?

は、彼らは同様に、他のさまざまな場所でprompt()の同様の使用します(フォームgap.*:.*の2番目のパラメータを含めることによって特異的に)彼らはprompt()を呼び出す方法について何か特別なものであるが、

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

ありますカスタム動作を有効にしますか?または、JavaScriptコードの外部のprompt()関数のデフォルトの動作をどういうわけかオーバーライドしましたか?

これは、AndroidバージョンのPhonegapに特に適用されることに注意してください。他のバージョンでは、API呼び出しの実行に若干異なるメカニズムが使用されているようです。

+0

プロンプトは文字列を返します。なにが問題ですか? – xdazz

+1

何が問題なのは、 'prompt()'の標準バージョンがユーザにダイアログを表示することです。しかし、ここで起こっていることではありません。これらの 'prompt()'呼び出しの結果として表示されるダイアログはなく、代わりにPhonegap APIの他の部分が呼び出されます。本質的に、彼らは主なAPIエントリポイントとして 'prompt()'を使用しています、そして、私はhow/whyを知りたいと思います。 – aroth

答えて

7

prompt()関数がオーバーライドされました。

これはDroidGap.javaにあります。

+0

まあ、PhoneGapはプロンプトを使ってAndroid上で実際にJavaScriptからJavaへのブリッジを作ります。 –

+1

興味深い。だから、基本的にPhonegapには、実際のJavaScriptプロンプトダイアログが表示される前に、 'prompt()'メソッドが呼び出されるたびに通知されるコールバック/リスナーがwebviewで定義されていますか?コールバックメソッドでは、基本的にエンコードされたタスクの 'prompt()'パラメータをチェックし、見つかった場合はそれを実行し、そうでない場合はfalseを返し、結果を 'JsPromptResult'を介してJavaScriptに返します。また、 'onJsPrompt()'だけで結果オブジェクト経由で文字列を返すことができるので、onJsAlert()やonJsConfirm()を使用できないと思いますか?賢いそして、迂回している。 – aroth

+1

@arothうん、そうだと思います。 – xdazz

4

Android 2.3では、JavaScriptからJavaへのブリッジがエミュレータで動作しなくなりました。賢いPhoneGapの貢献者は、プロンプトのピギーバックが回避策であることを発見しました。

ここにはAndroid issueがあります。