Sea*_*son 5 javascript iframe transferable
我正在学习MessageChannel和可转移的对象.
我的页面中有一个跨域的iframe.MessageChannel周围的文档表明它完全支持跨域通信.
我在iframe中的跨域页面中有这个代码:
var messageChannel = new MessageChannel();
// Transfer port2 to the background page to establish communications.
window.parent.postMessage('connect', 'chrome-extension://jbnkffmindojffecdhbbmekbmkkfpmjd', [messageChannel.port2]);
messageChannel.port1.start();
// Give time for background to setup its port. Not great practice, but OK for example.
setTimeout(function(){
// Create a 32MB "file" and fill it.
var uInt8Array = new Uint8Array(1024*1024*32); // 32MB
for (var i = 0; i < uInt8Array.length; ++i) {
uInt8Array[i] = i;
}
messageChannel.port1.onmessage = function(message){
console.log('iframe message:', message);
};
messageChannel.port1.postMessage(uInt8Array.buffer, [uInt8Array.buffer]);
if (uInt8Array.buffer.byteLength)
throw "Failed to transfer buffer";
}, 1000);
Run Code Online (Sandbox Code Playgroud)
在我的背景页面中我有:
window.onmessage = function(messageEvent) {
// Make sure the origin is correct for security
if (messageEvent.origin === 'https://www.youtube.com') {
if (messageEvent.ports.length > 0 && messageEvent.data === 'connect') {
var port = messageEvent.ports[0];
port.onmessage = function (message) {
console.log("background message:", message);
};
}
}
};
Run Code Online (Sandbox Code Playgroud)
当我尝试postMessage uInt8Array缓冲区时 - 我没有收到另一方的数据:

但如果我尝试发送一些简单的东西,请说:
messageChannel.port1.postMessage('hello');
Run Code Online (Sandbox Code Playgroud)
然后我看到:

使用可转移对象时 - 数据是否代表其他地方?我似乎能够很好地传输端口,但我正在努力转移数据数组.但是,因为我的异常没有被抛出 - 看起来它被转移了...但是它去了哪里?
我减少了您的代码示例,发现ArrayBuffer当它通过 aMessagePort的 a时总是会丢失MessageChannel。
报告为问题 334408:“在 postMessage 期间,ArrayBuffer 在 MessageChannel 中丢失(接收者的 event.data == null)” https://code.google.com/p/chromium/issues/detail?id=334408
| 归档时间: |
|
| 查看次数: |
1014 次 |
| 最近记录: |