Передача JSON объекта в iframe или в новое окно через postMessage
Передача информации между родительским окном и iframe на странице или дочерним окном стала возможна благодаря новым возможностям HTML5. Теперь запросто можно отправить JSON объект, например, в открытый iframe на другом домене. Это стало возможным благодаря window.postMessage.
Первоначально мне такая операция понадобилась когда дочерняя страница в iframe должна была быть зависимой от данных получаемой родительской. И это решение мне как раз подходило. Сперва пришлось обратиться к документации https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage где подробно описан процесс передачи и получения данных.
Для получения данных на странице можно воспользоваться следующим кодом
var onmessage = function(e) {
var data = e.data;
var origin = e.origin;
/**
* Проверка октуда пришел запрос
*/
if (origin !== "http://localhost") {
alert('Запрос пришел с другого домена');
return;
}
var str = 'Пришли неверные данные';
if (data.title && data.value) {
str = 'Сообщение:' + data.title + '. Значение объекта:' + data.value;
}
document.getElementById('message').innerHTML = str;
};
if (typeof window.addEventListener != 'undefined') {
window.addEventListener('message', onmessage, false);
} else if (typeof window.attachEvent != 'undefined') {
window.attachEvent('onmessage', onmessage);
}
Или тот же метод, только без проверки с какого источника были переданы данные на jQuery
$(function(){
$(window).on("message", function(e) {
var data = e.originalEvent.data;
if (data) {
var str = 'Пришли неверные данные';
if (data.title && data.value) {
str = 'Сообщение:' + data.title + '. Значение объекта:' + data.value;
}
$('#message').text(str);
}
});
});
Для получения сообщения мы отлавливаем событие message. И в первом примере проверяем еще откуда пришел запрос.
Для отправки данных используется метод window.postMessage(message, targetOrigin);
Где message — Данные. По спецификации, это может быть любой объект, который будет клонирован с сохранением структуры при передаче.Но IE поддерживает только строки, поэтому обычно данные JSON-сериализуют.
targetOrigin — Разрешить получение сообщения только окнам с данного источника. Проверку осуществляет браузер. При указании '*' ограничений нет. Желательно всегда указывать источник, что бы предотвратить получение данных третьими лицам.
На странице у нас есть один iframe с id=»iframe» и три кнопки. По нажатию на 2 из них происходит событие передачи данных, и на одну — создание нового окна.
Аналогичном способом можно отправлять сообщения из iframe в родительскую страницу используя window.parent
$(function(){
var popup = null;
var sendObject = {
title: 'Тестовое сообщение',
value: 5000
};
$('.btn-iframe').click(function(){
var iframe = $('#iframe');
iframe[0].contentWindow.postMessage(sendObject, document.location);
});
$('.btn-create-popup').click(function(){
popup = window.open('popup.html');
});
$('.btn-popup').click(function(){
popup.postMessage(sendObject, '*');
});
});
Готовый пример можно скачать здесь Тестовый пример. Лучше разместить это на веб-сервере и потом уже смотреть. Или посмотреть работу по этой ссылке.
Ну и само собой поддержка браузерами: http://caniuse.com/#feat=x-doc-messaging
UPD: Ну и конечно не обошлось без проблем для браузера IE. До 10 версии через postMessage можно передавать только строки.
Используемые материалы: