2013-06-13 4 views
12

window.postMessage()を使用しているときにエラーが発生しました。 。私は私が取得していますエラーをキャプチャすることができるようにしたいJavaScript - Try&Catch - 問題をキャプチャするWindow.postMessage()エラー

-

http://www.that-domain.comにメッセージを投稿することができません。受信者が原点 http://www.this-domain.com

簡単なサンプルコードがあります(エラーはずです):

try { 
    window.postMessage('1','http://www.differentDomain.com'); 
} 
catch (e) {  
    alert('error'); 
} 

詳細なプロセスフロー: jQueryを使用してドキュメントにクロスドメインiframeを追加して投稿していますが、これはターゲットの起点が一致する必要があるためエラーではありませんproxyDomain変数で設定します。

var $iframeProxy = $('<iframe id="myIFrame" src="' + proxyDomain + '"></iframe>').appendTo('body'); 

window.storageProxy = $iframeProxy[0].contentWindow; 

try { 
    window.storageProxy.postMessage(message, proxyDomain); 
} 
catch (e) {  
    alert('error'); 
} 
+1

これまでの解決方法はありますか? –

+0

悲しいことに、私はまだいません。 –

+0

問題はありません。返信ありがとうございます –

答えて

2

ドメイン起源は一致しないならば、エラーがスローされないと、それは静かに中止すべきことをHTML5仕様に概説されているように見えます。 targetOriginに引数が絶対URLで、メソッドが呼び出されたWindowオブジェクトの文書がない場合はパート#9

」... - メッセージを投稿

http://www.whatwg.org/specs/web-apps/current-work/multipage/web-messaging.html#web-messaging

10.4.3 targetOriginと同じ起源を持ち、これらのステップをサイレントに中止します。

+8

ええ、どうやってこれを沈黙させて捕まえることができますか? –

+0

URLが変更されました:https://html.spec.whatwg.org/multipage/web-messaging.html#posting-messages and now 9.4.3 First Note – sschoof

0

受信側でエラーをキャッチできます。

window.addEventListener('message', function() { 
    try { 
     not.existing.objects = 'Something dangerous!'; 
    } catch(e) { 
     console.log('error at message receive: ' + e + ' stack trace: ' + e.stack); 
    } 
}, false); 

をそれとも、そこにそれを処理したい場合は、catchブロックで、あなたのホストのページに戻ってそれを送ることができます:バニラ、あなたは何ができるのjavascript。

1

エラーを検出する方法はありませんが、ターゲットの原点が異なる場合は通常エラーが発生します。ケースはテスト対生産シナリオです。

ですから、親ドメインが何であるかをチェックし、それに応じてターゲットの原点を変更することができます。

function getTargetOrigin() 
{ 
    try { 
     var url = (window.location != window.parent.location) ? document.referrer : document.location.href; 
     if (url.indexOf('www.myproduction-website.com')!=-1) 
      return document.location.protocol + '//www.myproduction-website.com' 
     else //set the alternative target 
      return document.location.protocol + '//' + url.split('/')[2]; 
    } 
    catch(e) //falback to production 
    { 
     return document.location.protocol + '//www.myproduction-website.com' 
    } 
} 

をとのpostMessage関数内にそれを使用します。

function postMessage(message){ 
    window.top.postMessage(message,getTargetOrigin()); 
} 

このソリューションを使用すると、同じを使用することができますtargetOrigin URLをハードコーディングすることなく、複数のサーバー構成でコード化できます。

フレーム内を移動してdocument.referrerを再チェックすると、このソリューションは失敗します。この場合、親URLではなく前のフレームURLが含まれます。 その場合、targetOrigin urlとして '*'を使用することを検討してください。これは、他のドメインにメッセージを送信する唯一の解決策です。

希望すると助かります!