2012-04-30 9 views
0

私は、そのホスティングページと通信する必要があるiframeを持つWebアプリケーションを持っています。 iframeとホストは異なるドメインとプロトコルにあります(iframeはメインページhttpのhttpsです)。私はpostMessageを使用して、外側のページからiframeに小さなビットの状態(ユーザー追跡)を取得します。 IFRAMEがロードされるとIE8はIFrameへのpostMessageに特定の制限がありますか?

、それはvisitoridを求めてトップページにショートメッセージを送信する:

if ($.w.top != $.w) $.f.postMessage($.w.top, 'Get visitorId'); 

($ .f.postMessage(M、w)の単なるラッパーでありますpostMessageの周りには、typeof w.postMessage === 'undefined'の場合は何もしません)。外側のページでは、我々はメッセージリスナを持っている:

// Set up event listener so that we can respond when any iframes 
// inside of us ask for our visitorId 
$.f.listen($.w, 'message', giveVisitorId); 
function giveVisitorId(event) { 
    $.w['zzzzz'] = event.source; 
    if (event.data === 'Get visitorId') { 
    alert('about to reply from '+window.location.href+' with visitorid, typeof event.source.postMessage is ' + typeof(event.source.postMessage)); 
    event.source.postMessage('visitorId=' + $.v.visitorId, '*'); 
    } 
} 

インナーフレームは、応答に対するリスナーが登録されている:それはOSX上のChromeとFirefoxの上になっているよう

$.f.listen($.w, 'message', receiveVisitorId); 

function receiveVisitorId(event) { 
    alert('receiveVisitorId called with: ' + event.data + ' in window '+window.location.href); 
    var s = event.data.split('='); 
    if (s[0] === 'visitorId' && s.length === 2) { 
    $.v.visitorId = s[1]; 
    $.w.clearTimeout(giveUp); 
    rest(); 
    } 
} 

このすべての作品を(iframeが読み込まれると、receiveVisitorIdとgiveVisitorIdの2つの警告が表示されます)。しかしXPのIE8では、最初のアラート(giveVisitorIdから)しか得られません。

これは、外出するpostMessageが機能していると思われるので、奇妙なことです。本当に困惑しているのは、コンソールに接続してzzzzz.postMessage('hi', '*')を実行すると、receiveVisitorIdのアラートが予想どおりに行われるということです。 (event.sourceをwindow.zzzzzに保存したことに注意してください)。

これはなぜ起こっているのでしょうか?

PS:参照のための$ .w.listenの定義と$ .w.postMessage、:

listen: function (el, ev, fn) { 
    if (typeof $.w.addEventListener !== 'undefined') { 
    el.addEventListener(ev, fn, false); 
    } 
    else if (typeof $.w.attachEvent !== 'undefined') { 
    el.attachEvent('on' + ev, fn); 
    } 
}, 
postMessage: function(w, m) { 
    if (typeof w.postMessage !== 'undefined') { 
    w.postMessage(m, "*"); 
    } 
}, 

答えて

2

我々はそれを解決しました。問題は内側のiframeに$.f.postMessageの後に$.f.listenと呼んでいたことでした。外側のウィンドウがインナーにメッセージを投稿したとき、リスナーはまだ添付されていませんでした。私はなぜこれがIEで起こったのか、chromeやfirefoxではないのか分かりませんが、ブラウザ間のタイミングの違いだけにします。

関連する問題