У меня есть веб-приложение с 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, "*");
}
},