Есть несколько способов передать сообщение, состоящее из нескольких частей, обработчику postMessage
. Первый (и менее «чистый» способ) - использовать символ-разделитель, а затем передавать данные через строку.
Допустим, мы хотели передать идентификатор пользователя, действие и имя пользователя. Строка будет выглядеть так:
54|do_logout|chris
В обработчике postMessage
переданные данные могут быть split
(docs) на символе |
, то каждый сегмент сообщения можно использовать по мере необходимости.
Другой путь, вместо создания / разделения строки вручную, заключается в использовании JSON (docs) для преобразовать объект в строку с одной стороны и использовать JSON для обратного преобразования в объект в обработчике.
var pass_data = {
'name':'Chris',
'id':54,
'action':'do_logout'
};
target_window.postMessage(JSON.stringify(pass_data), "http://www.example.net");
... затем в обработчике:
function (event) {
var pass_data = JSON.parse(event.data);
}
Не забудьте, однако, протестировать, поскольку объект JSON
предоставляется не во всех пользовательских агентах, особенно в старых. Существует много (много, много) сторонних библиотек для ограничения поддержки JSON, так что пусть вас не пугает отсутствие полного принятия - JSON определенно является безопасным стандартом для «продвижения вперед».
Разве не было бы лучше, если бы мы могли сразу пройти мимо этого объекта? Что ж, глядя в Firefox 6 (источник), данные, которые вы передаете обработчику пост-сообщения, могут быть объектом . Объект будет сериализован, поэтому есть некоторые проблемы на этом фронте, но:
var pass_data = {
'name':'Chris',
'id':54,
'action':'do_logout'
};
target_window.postMessage(pass_data, "http://www.example.net");
Немного лучше, а? К сожалению, текущие версии IE работают только со строками. Мне не удалось найти обсуждения будущих планов относительно postMessage
для IE 10. Кроме того, в IE 8/9 есть известная ошибка, которая нарушает postMessage
что-либо, кроме фреймов. (источник).
Переходя к конкретному аспекту вашего вопроса - обратным вызовам. Если вы не можете передать обратный вызов по имени функции, нет способа передать функцию; никаких анонимных функций для вас. Это связано с тем, как данные фактически передаются обработчику. На практике «не существует» поддержки объектов как данных, за кулисами браузер превращает переданный объект в строку (сериализация).
Таким образом, вы должны понимать, что передача объекта в точности такая же, как использование JSON для stringify
объекта перед передачей, только в первом случае браузер выполняет собственную сериализацию (и последующую десериализацию), тогда как во втором маршруте Вам решать сериализовать / десериализовать.
Пункты приема пищи здесь:
- postMessage по-прежнему имеет ограниченную кроссбраузерную поддержку
- Тенденция к появлению новых версий браузеров, соответствующих стандартам, заключается в том, чтобы разрешить прохождение объектов в дополнение к строкам.
- Переданный объект будет сериализован, поэтому ссылки на функции не допускаются.
- Самая широкая поддержка «в дикой природе» предназначена для данных, состоящих только из строк, что означает, что вам придется придерживаться строк и «упаковать» свои данные, как показано выше, если вы хотите поддерживать широкий спектр пользовательских агентов.
- Internet Explorer испортит любой план, который вы когда-либо составляли (включая семейный отдых)
Документация и справочные материалы
person
Chris Baker
schedule
12.12.2011