Существует несколько способов передачи сообщения, состоящего из нескольких частей, в обработчик 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 ( source ), данные, передаваемые обработчику пост-сообщений, могут быть объектами.Объект будет сериализован, поэтому есть некоторые проблемы на этом фронте, но:
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
для чего-либо, кроме кадров.( source ).
Знакомство с конкретным аспектом вашего вопроса - обратными вызовами.Если вы не можете передать обратный вызов по имени функции, нет способа передать функцию;нет анонимных функций для вас.Это связано с тем, как данные фактически передаются обработчику.На практике «нет» поддержки объектов как данных, за кулисами браузер превращает переданный вами объект в строку (сериализация).
Все это говорит о том, что вы должны понимать, что передача объектаточно так же, как использование JSON для stringify
объекта перед передачей, только в первом случае браузер выполняет свою собственную сериализацию (и последующую десериализацию), тогда как с последним маршрутом вы можете сериализовать / десериализовать.
Точки забора здесь:
- postMessage по-прежнему имеет ограниченную кросс-браузерную поддержку
- Тенденция к появлению новых версий совместимых со стандартами браузеров заключается в разрешении проходаобъекты в дополнение к строкам
- Переданный объект будет сериализован, поэтому ссылки на функции не допускаются
- Самая широкая поддержка "в дикой природе" относится только к строковым данным, что означает, что у вас будетпридерживаться строк и «упаковать» свои данные, как показано выше, если вы хотите поддерживать широкий спектр пользовательских агентовs
- Internet Explorer разрушит все ваши планы (включая семейные праздники)
Документация и справочные материалы