2

この質問によると、window.locationを設定すると、javascriptは実行を「停止」するか、競合状態になります。

window.location = SOMESCH://xxx「通知」をアプリに送り返すために、WebView内で複数回起動する必要がある場合があります。たとえばwindow.location = myapp://loginButtonEnabled?e=1、ユーザーが必要な情報を入力してログインを開始できることをアプリに通知するように設定します。このようなことをするのは不可能のようです:

function(){
window.location = myapp://loginButtonEnable?e=1;
window.location = myapp://hideHintView;
.....
window.location = myapp://theLastThing;
}

最後のものだけwindow.location = myapp://theLastThingが起動され、Javascriptの実行が停止します(ただし、アプリでNOを返すことでリダイレクトを停止しましたwebView:shouldStartLoadWithRequest:navigationType:)。

PhoneGapがディスパッチキューを使用してこれを可能にしたのは興味深いことですが、なぜそれが機能するのかまだわかりません。誰かがそのトリックを知っていますか?

ところで、場所を設定した後に実行を「再開」する簡単な方法はありますか?操作キューを使用するよりもはるかに優れています。

4

1 に答える 1

5

イベントループに、毎回場所の変更に応答する機会を与える必要があります。これを行う一般的な方法は、setTimeout遅延が小さい/ゼロのを使用することです。これは、実行を次のイベントループティックに移動する効果があります。次のようなものを試してください。

var q=[];

function dequeue() {
  window.location='myapp://'+q.shift();
  if (q.length>0) setTimeout(dequeue,0);
}

function notifyApp(cmd) {
  q.push(cmd);
  if (q.length==1) setTimeout(dequeue,0);
}

notifyApp('loginButtonEnable?e=1');
notifyApp('hideHintView');
notifyApp('theLastThing');

javascriptの実行停止に関しては、window.location実際にページが変更されない限り、設定によってこの効果が得られることはありません。おそらく、上記の手法を使用して、最後のnotifyApp()呼び出し後にjavascriptが続行されるかどうかを確認してください。

編集:この問題への別のアプローチは、現在のページの場所を変更する代わりに一時的なiframeを作成することです-たとえば 、複数のwindow.location.href呼び出しでshouldStartLoadWithRequestをトリガーするを参照してください

于 2012-10-08T17:09:22.773 に答える