MessageEvent - 表示由目标对象接收到的消息
MessageEvent 接口表示由目标对象接收到的消息。
它用于表示消息:
- 服务器发送的事件 (参见
EventSource.onmessage)。 - Web sockets(参见 WebSocket 接口的
onmessage属性)。 - 跨文档消息传递(参见
Window.postMessage()和Window.onmessage)。 - 通道消息传递(参见
MessagePort.postMessage()和MessagePort.onmessage)。 - 跨worker/文档消息传递(参见上面两个入口,同时还有
Worker.postMessage(),Worker.onmessage,ServiceWorkerGlobalScope.onmessage等等。) - 广播通道(参见
Broadcastchannel.postMessage()) 和BroadcastChannel.onmessage)。 - WebRTC 数据通道(参见
RTCDataChannel.onmessage)。
由该事件触发的操作在函数集中定义为相关 message 事件的事件处理程序(例如,使用上面列出的 onmessage 处理程序)。
构造函数
MessageEvent()
创建一个新的 MessageEvent。
属性
该接口还继承其父接口 event 的属性。
MessageEvent.data 只读
由消息发送器发送的数据。
MessageEvent.origin 只读
一个 USVString,表示消息发送器的源。
MessageEvent.lastEventId 只读
一个 DOMString,表示事件的唯一 ID。
MessageEvent.source 只读
一个 MessageEventSource (其可以是 WindowProxy,MessagePort 或 ServiceWorker 对象)表示消息发送器。
MessageEvent.ports 只读
一个包含 MessagePort 对象的数组,表示与正在发送消息(在适当情况下,例如在通道消息传递中或向共享 worker 发送消息时)的通道相关联的端口。
方法
该接口还继承其父接口 event 的方法。
initMessageEvent()
初始化一个消息事件。不要再使用这个方法 - 使用 MessageEvent() 构造函数替代。
更多实例
在我们的基础共享 worker 实例(运行共享 worker)中,我们有两个 HTML 页面,每个页面都使用一些 JavaScript 进行简单的计算。 不同的脚本使用相同的工作文件来执行计算 - 即使它们的页面在不同的窗口中运行,它们也可以访问该文件。
下面的代码片段显示了使用 SharedWorker() 构造函数创建 SharedWorker 对象的过程。这两个脚本都包含以下内容:
var myWorker = new SharedWorker('worker.js');
然后,这两个脚本都通过使用 SharedWorker.port 属性创建的 MessagePort 对象访问 worker。如果使用 addEventListener 绑定 onmessage 事件,则使用端口的 start() 方法手动启动该端口:
myWorker.port.start();
启动端口后,这两个脚本都将消息发布到 worker,并分别使用 port.postMessage() 和 port.onmessage 处理从其发送的消息:
first.onchange = function() {
myWorker.port.postMessage([first.value,second.value]);
console.log('消息发送到 worker');
}
second.onchange = function() {
myWorker.port.postMessage([first.value,second.value]);
console.log('消息发送到 worker');
}
myWorker.port.onmessage = function(e) {
result1.textContent = e.data;
console.log('从 worker 接受消息');
}
在 worker 内部,我们使用 SharedWorkerGlobalScope.onconnect 处理程序连接到上述相同的端口。可在 connect 事件的 ports 属性中访问与该 worker 关联的端口 - 然后,我们使用 MessagePort start() 方法启动端口,并使用 onmessage 处理程序处理从主线程发送的消息。
onconnect = function(e) {
var port = e.ports[0];
port.addEventListener('message', function(e) {
var workerResult = '结果:' + (e.data[0] * e.data[1]);
port.postMessage(workerResult);
});
port.start(); // 使用 addEventListener 时必需。否则由 onmessage setter 隐式调用。
}
规范
| 规范 | 状态 | 备注 |
|---|---|---|
| HTML Living Standard MessageEvent 的定义 |
现行的标准 | - |
桌面浏览器兼容性
| 特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|---|
| 基础支持 | 1 | 支持 | 4 | 9 | 支持 | 10 |
MessageEvent() constructor | 1 | 支持 | 4 | 9 | 未知 | 10 |
data | 1 | 12 | 4 | 9 | 支持 | 10 |
initMessageEvent | 1 | 12 | 4 | 9 | 支持 | 10 |
lastEventId | 1 | 17 | 4 | 9 | 支持 | 10 |
origin | 1 | 12 | 4 | 9 | 支持 | 10 |
ports | 1 | 12 | 4 | 9 | 支持 | 10 |
source | 支持 | 12 | 55 | 不支持 | 支持 | 支持 |
移动浏览器兼容性
| 特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
|---|---|---|---|---|---|---|---|
| 基础支持 | 支持 | 支持 | 未知 | 支持 | 未知 | 支持 | 3 |
MessageEvent() constructor | 37 | 18 | 未知 | 未知 | 未知 | 未知 | 3 |
data | 支持 | 支持 | 未知 | 支持 | 未知 | 支持 | 3 |
initMessageEvent | 支持 | 支持 | 未知 | 支持 | 未知 | 支持 | 3 |
lastEventId | 支持 | 支持 | 未知 | 支持 | 未知 | 支持 | 3 |
origin | 支持 | 支持 | 未知 | 4 | 未知 | 支持 | 3 |
ports | 支持 | 支持 | 未知 | 支持 | 未知 | 支持 | 3 |
source | 支持 | 支持 | 未知 | 55 | 未知 | 支持 | 支持 |
相关链接
ExtendableMessageEvent- 类似这个的接口,但用于需要更多灵活的情况。