2012-04-30 4 views
0

У меня есть веб-приложение с iframe, которому необходимо связаться со своей страницей. IFrame и хост находятся в разных доменах и протоколах (iframe - https, главная страница http). Я использую postMessage, чтобы получить небольшое количество состояний (отслеживание пользователей) с внешней страницы в iframe.Имеет ли IE8 какие-либо конкретные ограничения на postMessage для IFrames?

Когда IFrame загружен, он посылает короткое сообщение к началу страницы просить visitorid:

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

($ .f.postMessage (ш, м) является просто оболочкой вокруг 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, '*'); 
    } 
} 

Внутренний каркас имеет слушатель, зарегистрированный для ответа:

$.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(); 
    } 
} 

Это все работает, как это предполагается на хром и Firefox на OSX (когда загружается iframe, мы получаем два предупреждения: один из receiveVisitorId и один из giveVisitorId); однако на IE8 на XP мы получаем только первое предупреждение (from 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

Мы решили его. Проблема заключалась в том, что мы вызывали $.f.listen после $.f.postMessage во внутреннем iframe; поэтому, когда внешнее окно разместило сообщение на внутреннем, слушатель еще не был прикреплен. Я не знаю, почему это произошло в IE, а не в Chrome или Firefox, но мы просто положили его на разницу во времени между браузерами.

 Смежные вопросы

  • Нет связанных вопросов^_^