Кажется, что window.postMessage все еще сломан на IE 11, когда сообщение
- между окном и дочерним всплывающим окном с вкладкой window.open
- когда он отправляется из разных доменов [или одного домена в некотором случае, c.f. update 16/01]
Были проблемы с IE 8/9/10, но эта функция отмечена как "поддерживаемая" в IE 11 из "частично поддерживаемой" в IE 10
Существует пример кода, который работает на chrome/ff, но не в IE:
$(document).ready(function() {
$('#log').append('listening...');
window.addEventListener("message", function(e){
$('#log').append("Received message: " + JSON.stringify(e.data));
}, false);
$('button').click(function() {
window.open('http://jsbin.com/eQeSeros/1', 'popup','menubar=no, status=no, scrollbars=no, menubar=no, width=200, height=100');
});
});
дочернее всплывающее окно (jsbin): (не будет работать, если не открыть jsfiddle)
$(document).ready(function() {
$('body').append('sending...');
window.opener.postMessage("Hello?", "http://fiddle.jshell.net");
$('body').append('sent...');
});
Я читал из сообщения Является ли перекрестная ссылка postMessage в IE10?, что мы можем использовать MessageChannel
вместо postMessage
, но чтение документа, я не нашел, как использовать его в моем реальном случае, потому что вы должны передать порт дочернему окну.
Перед отправкой моего сообщения есть цепочка перенаправления, поэтому даже если я могу отправить порт, я потеряю любой объект js, отправленный изначально/перед перенаправлением.
Любая идея для замены?
Обновление 14/01. Я думаю о передаче моих данных в заголовок окна/вкладки и регулярно проверяю этот заголовок у родителя... но это было бы довольно грязным трюком.
Обновление 16/01. Очень плохо, что он работает, даже если сообщение отправлено из того же домена, но после перенаправления другим доменом.
вот пример: http://jsfiddle.net/L4YzG/13/ открывает всплывающее окно http://jsbin.com/eQeSeros/4/edit, которое перенаправляет на http://jsfiddle.net/mxS8Q/2/ (который отправляет сообщение)
Если вы измените всплывающее окно URL-адреса непосредственно на окончательный URL-адрес перенаправления на http://jsfiddle.net/mxS8Q/2/show, это работает на IE, потому что нет другого домена между открытие и пост
Я все еще работаю над своим грязным трюком. мы не можем получить заголовок окна, когда он находится в другом домене, но если он возвращается на jsfiddle, доступный заголовок доступен (нет предыдущей проблемы с postMessage). Вот пример: http://jsfiddle.net/L4YzG/14/... Это может быть альтернативное решение, но я только что увидел что-то о передаче данных в cookie, его просто нужно проверить.
Обновление 04/02. Передача информации в заголовке недостаточна, если работает хорошо, если конечные домены совпадают, но не в перекрестном домене. Я хотел бы ввести iframe того же домена, чтобы передать эту информацию, но я не могу совместно использовать объект дочернего окна (postMessage нужен сериализуемый объект).
Наконец, я попытался разделить куки файлы (созданные и полученные в js) между введенным iframe и дочерним окном, это хорошо работает на chrome и ff, но все равно не может получить его правильно с IE. После добавления заголовков P3P он работал нормально, это, по-видимому, настоящее решение. У Safari, похоже, есть некоторые проблемы с этой техникой, поэтому я просто сохраняю эту технику как резерв.