2013-02-25 3 views
6

私は、window.openとウィンドウ間通信(新しい '子'ウィンドウcommunicates success/failure to the 'parent' window)の使用に依存するいくつかのJavaScriptを持っています。ウィンドウ間通信のブラウザサポートを検出する

このウィンドウ間通信はほとんどの場合うまく機能しますが、ウィンドウ間通信をサポートしないブラウザでは機能しません。例はWindows PhoneiPhone's UIWebViewです。

私は現在、これらのシナリオを検出するためにクライアント側(JavaScriptベース)user-agent sniffingを実行し、別のコードパスを使用して問題を回避します。

私が使用できるユーザーエージェントのスニッフィングの代替品はありますか?

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

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

を次にあなたが返事が到着したときにクリアすることができ、送信側でタイマーを行うことができます:あなたが戻って、このような子ウィンドウへの応答を送信することができ、あなたのオープナーウィンドウ・メッセージ・コールバックで

+0

子供はwindow.openerプロパティにアクセスすることもできますがnullにする必要がありますが、残念ながらこれは信頼性の高い検出手法ではありません。例として、親からwindow.openを使用せずに直接子ウィンドウを開くと、子が実際にウィンドウ間通信を実際にサポートしていても、window.openerはnullになります。 – mjwills

+0

'window.open'は動作するのですが、関数は子ウィンドウIDを返しますか? – Raptor

+0

私はその情報をどのように役立てるのか分かりません。私が欲しいのは、親ウィンドウと話すことができるかどうかについての子ウィンドウ内の特徴検出である。 window.open関数呼び出しの戻り値は、明らかに親にしか利用できません。つまり、この気密なハッチウェイの反対側にあることになりました。 これらのことは、戻り値をチェックするとモバイルIE9ではnull、UIWebViewではウィンドウオブジェクトになります。どちらの場合も、新しいウィンドウが正しくロードされたことに注意してください(しかし、親ウィンドウと通信することはできません)。 – mjwills

答えて

2

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

これは少しハックした解決策かもしれないが、ユーザーエージェントの盗聴よりも多分それほど簡単ではないことは知っていますか?

+0

私はあなたの提案@sactorを誤解しているかもしれないことを恐れる。最初のコードブロックは親ウィンドウの内側に配置され、2番目のコードブロックは子ウィンドウの内側に配置されますか?親へのpostMessageは動作しません(http://stackoverflow.com/a/12265816/34092)。 – mjwills

+0

または、単に「postMessage」を試してみることをお勧めします。「ack」が返ってこない場合は、動作しなかったことがわかります。それはうまくいくかもしれませんが、私の元の投稿の2番目のコメントと同じ問題がある可能性があります。親ウィンドウのwindow.openではなく、ブラウザでエンド・ユーザーが直接子ウィンドウを開いた場合、提案された手法はフレーム間通信がサポートされているかどうかを検出することができません。 – mjwills

+0

はい私はちょうど私達が返事を得るかどうか確認することを提案している。私はあなたの目的が理論的に可能である場合(実際には間違った方法で開かれていない場合)ではなく、実際に親にメッセージを届けることができるかどうかを確認することだと考えました。そのために私は残念なことに答えを持っていません。 – sactor

関連する問題