javascript - 检测postMessage是否可以发送对象?

标签 javascript html dojo web-worker postmessage

我正在寻找一种巧妙的方法来检测浏览器中的 postMessage 是否支持发送和接收对象或仅支持字符串。我想肯定有人写了一些东西可以做到这一点,但我还没有设法找到解决方案。

我正在使用 postMessage 向/从 WebWorker 发送数据。虽然检测浏览器是否支持 worker 很简单,但事实证明检测是否可以通过 postMessage 发送对象更加困难。

我想写一个简单的检测函数。所以,如果浏览器支持发送对象就可以使用。如果只允许使用字符串,我可以回退到使用 JSON.stringify()。我可能会将该功能分配给 dojo/has 测试(尽管这与问题/答案无关)。

其他人如何解决这个问题?任何建议都很好,我是 WebWorkers 和 postMessage 的新手。提前致谢。

最佳答案

我发现了一种更简单的方法来检测 postMessage 是只支持字符串还是支持其他类型。只需在对象上添加一个自定义的 toString 方法。当尝试在 IE8 和 IE9 中使用 postMessage 发送对象时,它们将被对象上的 toString 方法转换为字符串。由于支持发送对象的浏览器不调用 toString 我们可以利用它来发挥我们的优势。这个测试不是异步的,所以你会立即得到结果。还没有用网络 worker 测试过这个,但我想你可以使用相同的技术。

var onlyStrings = false;
try{window.postMessage({toString:function(){onlyStrings=true;}},"*");}catch(e){}

console.log("Browser only supports postMessage with strings? " + onlyStrings);

在 IE8、IE9、IE10 和最新版本的 Chrome、Firefox、Safari 和 Opera 中测试: http://jsbin.com/igowoFaj/1/edit?js,console

更新:做了 BrowserScope test有更多的测试和浏览器。结论是,如果 onlyStringsfalse,则发送可克隆对象、数组、数字、像素数据和数组缓冲区是安全的。理论上所有允许发送对象的浏览器都应该使用 structured clone algorithm ,但 Android 浏览器和 Opera Mobile 有怪癖。 BrowserScope 测试结果有点难以阅读,因为 send_xxx 的 0 只有在浏览器实际支持该类型时才会出现问题,因此还要检查 supports_xxx。如果它们相等则没问题,但如果浏览器支持但无法发送(当 onlyStrings 为 false 时),则为错误。

关于javascript - 检测postMessage是否可以发送对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13761968/

相关文章:

html - 背景图像 : url() does not work with link contains a space

javascript - dojo.itemFileReadStore 在嵌套数组上失败

javascript - XSRF-TOKEN 没有被 Angular 2 发送,因为它说默认情况下会发送

javascript - 在 Javascripts 中对非英文名称进行排序

html - 表格行的CSS插入框阴影?

javascript - DOJO 是否有类似于 .ajaxComplete() 的方法来监听多个 AJAX 调用何时完成或成功?

javascript - Dojo parseOnLoad 不起作用

javascript - 如何删除未保存的事件?

javascript - 在 ReactJS 上使用 axios 选择输入返回未定义

JavaScript - 读取视频文件的元数据