Атрибут onmessage тега <body>
Описание
Атрибут onmessage позволяет задать обработчик сообщений, отправляемых через механизмы межоконного взаимодействия, такие как:
- Window.postMessage() - обмен между окнами/фреймами
- Web Workers - обмен с фоновыми потоками
- Service Workers - взаимодействие с PWA
- BroadcastChannel - широковещательные сообщения
<body onmessage="handleIncomingMessage(event)">
<div id="message-display"></div>
<iframe src="child.html" id="child-frame"></iframe>
<script>
function handleIncomingMessage(event) {
// Проверяем источник сообщения
if (event.origin !== "https://trusted-domain.com") return;
document.getElementById('message-display').textContent =
`Получено сообщение: ${event.data}`;
}
// Отправка сообщения в iframe
window.onload = function() {
const frame = document.getElementById('child-frame');
frame.contentWindow.postMessage("Hello from parent", "https://child-domain.com");
};
</script>
</body>
Свойства объекта события message:
| Свойство | Описание |
|---|---|
data |
Переданные данные |
origin |
Источник сообщения (протокол + домен + порт) |
source |
Ссылка на окно-отправитель |
ports |
Массив MessagePort для сложных сценариев |
Рекомендации по использованию:
- Всегда проверяйте event.origin для безопасности
- Используйте JSON для сложных структур данных
- Для частых сообщений используйте debounce/throttle
- Документируйте форматы сообщений между компонентами
- Обрабатывайте ошибки при парсинге данных
Важные замечания:
- Сообщения передаются по значению (сериализуются)
- Для больших данных используйте Transferable Objects
- Разные источники требуют разных проверок origin
- В Service Worker используется event.waitUntil
- Для кросс-доменного взаимодействия требуется CORS
Современные альтернативы:
<script>
// 1. Использование addEventListener
window.addEventListener('message', (event) => {
// Более современный синтаксис обработки
});
// 2. BroadcastChannel API
const channel = new BroadcastChannel('app-channel');
channel.onmessage = (event) => {
console.log('Broadcast:', event.data);
};
// 3. MessageChannel для прямого взаимодействия
const {port1, port2} = new MessageChannel();
port1.onmessage = (event) => {
console.log('MessageChannel:', event.data);
};
port2.postMessage('Hello');
</script>
Безопасность:
- Никогда не доверяйте данным без проверки origin
- Очищайте/санируйте входящие данные
- Ограничивайте список разрешенных доменов
- Используйте Content Security Policy (CSP)
- Для чувствительных данных используйте дополнительные токены
Примечание: Механизм сообщений между окнами (postMessage) является мощным инструментом, но требует тщательной реализации мер безопасности. Всегда проверяйте источник сообщений и валидируйте полученные данные.