Web workers 支持

3

Web worker支持吗?

  1. XMLHttpRequest和回调函数
  2. 文件上传
  3. Websockets

我在不同的网站上找到了非常混乱的答案。

感谢您的帮助...


我知道你刚刚达到了能够接受答案的门槛,但如果你需要更多帮助,请告诉我。 - buley
请帮我解决在Web Workers中使用Web Sockets的问题。我已经清楚了XHR和回调。谢谢。 - Nigilan
2个回答

2

当你有疑问时,请进行测试。我使用的Chromium版本显示以下答案:

源代码在此处和下方。


<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Embedded Web Worker Test</title>
<script type="text/js-worker">
  var xmlhttp = 'XMLHttpRequest: ' + ( ( 'function' === typeof XMLHttpRequest ) ? ' YES' : ' NO' )
  var file_reader = 'FileReader: ' + ( ( 'function' === typeof FileReader ) ? ' YES' : ' NO' )
  var websockets = 'Websockets: ' + ( ( 'function' === typeof WebSocket ) ? ' YES' : ' NO' )    
    var myVar = "Test results: " + xmlhttp + ", " + file_reader + ", " + websockets;
</script>
<script type="text/javascript">
  function log_worker_msg(worker_msg) {
    var frag = document.createDocumentFragment();
    frag.appendChild(document.createTextNode(worker_msg));
    document.querySelector("#worker_log").appendChild(frag);
  }
</script>
<script type="text/js-worker">
  self.onmessage = function (oEvent) {
    self.postMessage(myVar);
  };
</script>
<script type="text/javascript">

  var oBuilder = new WebKitBlobBuilder() || new MozBlobBuilder();
  Array.prototype.forEach.call(document.querySelectorAll("script[type=\"text\/js-worker\"]"), function (oScript) { oBuilder.append(oScript.textContent); });

  var obj_url = window.webkitURL.createObjectURL(oBuilder.getBlob()) || window.URL.createObjectURL(oBuilder.getBlob());
  document.worker = new Worker(obj_url);

  document.worker.onmessage = function (oEvent) {
    log_worker_msg( oEvent.data);
  };

  window.onload = function() { document.worker.postMessage(""); };
</script>
</head>
<body><div id="worker_log"></div></body>
</html>

我正在使用Firefox 13,它显示以下错误:WebKitBlobBuilder未定义。 - Nigilan
当我在Opera 11.64中打开时,错误消息是“未捕获的异常:引用错误:未定义变量:WebKitBlobBuilder”。 - Nigilan
是的,这些都是供应商前缀的 API。对于 Firefox,请将“WebKitBlobBuilder()”更改为“MozBlobBuilder()”。不确定 Opera 是否支持文档 Blob(在此用于构建 Web Worker)。 - buley
我们已经有了MozBlobBuilder(),因此我删除了WebKitBlobBuilder()。这里,window.webkitURL.createObjectURL,再次出现了webkit,会抛出window.webkitURL未定义的错误。 - Nigilan
我在代码中进行了一些调整以使其正常工作。 var oBuilder = ( window.WebKitBlobBuilder || new window.MozBlobBuilder); 这行代码能让它在 Firefox 中运行,我必须添加 window 关键字并删除 new 关键字。 var oBuilder = new WebKitBlobBuilder() || new MozBlobBuilder(); 以上行代码可以在 Chrome 中工作。我无法在 Safari 和 Opera 中运行该程序。感谢您的帮助! - Nigilan
显示剩余2条评论

0

您的WebWorker支持测试存在重大错误,导致工作线程抛出引用错误。 BlobBuilder已被弃用,Blob更适合在整个浏览器中使用,但目前尚未得到广泛支持。

Blob支持

为了测试其对XMLHttpRequest、文件上传和Websockets的支持,我已经纠正了嵌入式工作线程测试。

修正后的源代码在这里。修正后的源代码

function log_worker_msg(worker_msg) {
  var frag = document.createDocumentFragment();
  frag.appendChild(document.createTextNode(worker_msg));
  document.querySelector("#worker_log").appendChild(frag);
}
var aFileParts = ["var xmlhttp = \'XMLHttpRequest: \' + ( ( \'function\' === typeof XMLHttpRequest ) ? \' YES\' : \' NO\' );var file_reader = 'FileReader: ' + ( ( \'function\' === typeof FileReader ) ? \' YES\' : \' NO\' );var websockets = \'Websockets: \' + ( ( \'function\' === typeof WebSocket ) ? \' YES\' : \' NO\' );var myVar = \"Test results: \" + xmlhttp + \", \" + file_reader + \", \" + websockets;self.onmessage=function(oEvent){self.postMessage(myVar)};"];
var oBuilder = new Blob(aFileParts, { "type" : "text\/javascript" });
var obj_url = window.webkitURL.createObjectURL(oBuilder) || window.URL.createObjectURL(oBuilder);
document.worker = new Worker(obj_url);
document.worker.onmessage = function (oEvent) {
    log_worker_msg( oEvent.data);
};
window.onload = function() { document.worker.postMessage(""); };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接