-4

window.open およびウィンドウ間通信 (新しい「子」ウィ​​ンドウが成功/失敗を「親」ウィンドウに伝達する場所) の使用に依存する JavaScript があります。

この (ウィンドウ間通信) は、ほとんどの場合正常に機能しますが、ウィンドウ間通信をサポートしていない一部のブラウザーでは機能しません。例には、Windows PhoneiPhone の UIWebViewが含まれます。

私は現在、これらのシナリオを検出するためにクライアント側 (javascript ベース)のユーザー エージェント スニッフィングを行っており、別のコード パスにフォールバックして問題を回避しています。

ユーザーエージェントのスニッフィングに代わる方法はありますか?

明確にするために、window.open は機能します (機能するということは、「要求された URL を開く」ことを意味します)。信頼できないのは、 window.opener とpostMessageを使用して「子」から「親」へのウィンドウ間通信を行うことです。

4

1 に答える 1

3

オープナー ウィンドウのメッセージ コールバックでは、次のように子ウィンドウに返信を返すことができます。

function yourMessageCallback(event) {
  // your other handler stuff here...
  event.source.postMessage('Yeah I got it', event.origin);
}

次に、返信が到着したときにクリアできる送信側でタイマーを実行できます。

// do your postmessage here

function notReceived() {
  // do stuff if the message didn't go through
}

var messageTimer = setTimeout(notReceived, 500); // 500ms should be enough for everyone?

window.addEventListener('message', function(event) {
  // do necessary origin checks first etc... (not shown here)

  if (event.data == 'Yeah I got it') {
    clearTimeout(messageTimer);
    // do stuff if the message went through
  }
}, false);

これは少しハックなソリューションかもしれませんが、ユーザーエージェントのスニッフィングほどではないでしょうか?

于 2013-02-25T14:14:29.690 に答える