网络工作者抛出'未捕获错误:DATA_CLONE_ERR:DOM异常25'

时间:2011-09-21 21:05:56

标签: javascript jquery html5 dom web-worker

所以我正在创建一个网络工作者:

var arrayit = function(obj) {
  return Array.prototype.slice.call(obj);
};
work = arrayit(images);
console.log(work);
//work = images.push.apply( images, array );
// Method : "load+scroll"
var worker = new Worker('jail_worker.js');
worker.postMessage(work)
worker.onmessage = function(event) {
  console.log("Worker said:" + event.data);
};

以下是图片的内容:

$.jail.initialStack = this;
// Store the selector into 'triggerEl' data for the images selected
this.data('triggerEl', (options.selector) ? $(options.selector) : $window);
var images = this;

我认为我的问题与此有关:

http://dev.w3.org/html5/spec/Overview.html#safe-passing-of-structured-data

我该如何解决这个问题?正如您所看到的,我尝试将主机对象切片为真实数组,但这不起作用。

这是我正在攻击的文件的链接:

https://github.com/jtmkrueger/JAIL

UPDATE ---------------------------------------------- ----

这是我根据@davin接受的答案所做的事情:

var arrayit = function(obj) {
  return Array.prototype.slice.call(obj);
};
imgArray = arrayit(images);
work = _.map(images, function(i){ return i.attributes[0].ownerElement.outerHTML; });

var worker = new Worker('jail_worker.js');
worker.postMessage(work)
worker.onmessage = function(event) {
  console.log("Worker said:" + event.data);
};

注意:我使用underscore.js来确保兼容性。

2 个答案:

答案 0 :(得分:22)

最有可能抛出原始异常,因为您尝试将主机对象传递给Web worker(很可能是dom元素)。您的后续尝试不会抛出相同的错误。请记住两个关键点:不同线程之间没有共享内存,Web工作者无法操纵DOM。

postMessage支持将结构化数据传递给线程,并且internally serialise(或以其他方式递归地复制数据的)数据。序列化DOM元素通常会导致循环引用错误,因此最好的选择是map要序列化的对象,并提取要在Web工作者中重建的相关数据。

答案 1 :(得分:0)

尝试将indexeddb函数保存为对象的密钥时,再现了

Uncaught DataCloneError: An object could not be cloned。需要重新检查保存的对象是可序列化的