postMessage wciąż przerwany na IE11?
Wydaje się, że window.postMessage jest nadal uszkodzony na IE 11, gdy wiadomość jest
między oknem a podręcznym oknem na dziecko z window.opengdy jest wysyłany z różnych domen[lub ta sama domena w niektórych przypadkach, c.f. aktualizacja 16/01]Podobne problemy wystąpiły w IE 8/9/10, ale ta funkcja została oznaczona jako „obsługiwana” w IE 11 z „częściowo obsługiwana” w IE 10
Istnieje przykład kodu, który działa na chrome / ff, ale nie na 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');
});
});
Thepopup dziecka (jsbin): (nie będzie działać, jeśli nie zostanie otwarty przez jsfiddle)
$(document).ready(function() {
$('body').append('sending...');
window.opener.postMessage("Hello?", "http://fiddle.jshell.net");
$('body').append('sent...');
});
Czytałem z postuCzy wiadomość pocztowa jest łamana w IE10? że możemy użyćMessageChannel
zamiastpostMessage
, ale czytając dokument, nie znalazłem sposobu użycia go w moim prawdziwym przypadku, ponieważ musisz przekazać port do okna potomnego.
Przed przesłaniem wiadomości istnieje łańcuch przekierowań, więc nawet jeśli mógłbym wysłać port, stracę dowolny obiekt js wysłany początkowo / przed przekierowaniami.
Masz pomysł na wymianę?
Aktualizacja 14/01: Myślę o przekazaniu moich danych w tytule okna / zakładki i regularnym sprawdzeniu tego tytułu od rodzica ... ale to będzie dość podstępna sztuczka.
Aktualizacja 16/01: Naprawdę zła część polega na tym, że rozbija się, nawet jeśli wiadomość jest wysyłana z tej samej domeny, ale po przekierowaniu przez inną domenę.
oto przykład:http://jsfiddle.net/L4YzG/13/ otwiera popuphttp://jsbin.com/eQeSeros/4/edit to przekierowuje dohttp://jsfiddle.net/mxS8Q/2/ (który publikuje wiadomość)
Jeśli zmienisz okienko URL bezpośrednio przez ostatni przekierowanie adresu URLhttp://jsfiddle.net/mxS8Q/2/show działa to na IE, ponieważ nie ma innej domeny między otwarciem a postem
Nadal pracuję nad brudną sztuczką z tytułem okna. nie możemy otrzymać tytułu okna, gdy znajduje się w innej domenie, ale jeśli wróci on na jsfiddle, tytuł jest dostępny (nie ma poprzedniego problemu z postMessage). Oto przykład:http://jsfiddle.net/L4YzG/14/ ... To może być alternatywne rozwiązanie, ale właśnie zobaczyłem coś o przekazywaniu danych w pliku cookie, wystarczy go przetestować.
Aktualizacja 04/02: Przekazywanie informacji w tytule nie jest wystarczające, jeśli działa dobrze, jeśli końcowe domeny są takie same, ale nie w domenie międzysieciowej. Chciałem wstrzyknąć ramkę iframe tej samej domeny, aby przekazać te informacje, ale nie mogę też współdzielić obiektu okna potomnego (postMessage potrzebuje obiektu do serializacji).
W końcu spróbowałem udostępnić plik cookie (utworzony i otrzymany w js) między wstrzykniętym oknem iframe i podrzędnym, to działa dobrze na chrome & ff, ale nadal nie mogło go poprawnie odebrać z IE. Po dodaniu nagłówków P3P działało dobrze, wydaje się, że jest to prawdziwe rozwiązanie. Safari wydaje się mieć pewne problemy z tą techniką, więc po prostu utrzymuję tę technikę jako awarię.