2012-01-08 22 views
5

Khi tôi chạy mã giao dịch với imageData được truyền tới một nhân viên web và sau đó quay lại, Firefox hoạt động tốt nhưng Chrome cung cấp "Lỗi không bắt buộc: DATA_CLONE_ERR: Ngoại lệ DOM 25"Nhân viên web xử lý imageData làm việc với Firefox nhưng không phải Chrome

Tìm kiếm trên google cho thấy các phiên bản cũ hơn của Chrome được sử dụng để hoạt động?

Tôi đã kiểm tra một số chi tiết và dường như tôi cần chạy JSON.stringify và JSON.parse trên imagedata trước khi gửi nhưng sau đó nó ngừng hoạt động ở mọi nơi. Các mã mà làm việc trong FF 9 là:

image.js:

var myImageData = context.getImageData(0, 0, canvas.width, canvas.height).data; 
var worker = new Worker("http://direct.link/helpers/worker.js"); 
worker.postMessage(myImageData); 
worker.onmessage = function(event) { 
    var value = event.data; 
    switch (value.cmd){ 
    case 'last': 
     //doing stuff 
     break; 
    default: 
     //doing stuff 
    }); 
} 

worker.js:

addEventListener('message', function(event) { 
    var myImageData = event.data; 
    // doing stuff. 
    sendItBack(colors); 
}); 
}; 

    function sendItBack(colors){ 
    each(colors, function(index, value){ 
     self.postMessage(value); 
    }); 
    self.postMessage({'cmd': 'last'}); 
    } 

phương pháp gì tôi nên sử dụng để gửi imageData này qua lại các ứng dụng và nhân viên web?

Cảm ơn!

EDIT:

Nếu tôi sao chép vào một mảng bình thường khi đó Chrome bắt đầu làm việc ...

var newImageData = []; 
for (var i=0,len=myImageData.length;i<len;++i) newImageData[i] = myImageData[i]; 

Vì vậy, chrome không thể vượt qua một CanvasPixelArray để một công nhân nhưng nó có thể vượt qua một mảng thông thường. Nhưng firefox có thể.

+0

http: // stackoverflow.com/questions/7506635/uncaught-error-data-clone-err-dom-exception-25-ném-bởi-web-nhân viên –

+0

oops. Cảm ơn. Hãy để tôi thử điều đó :) – garg

+0

Tôi vẫn chưa rõ về điều này. Dữ liệu mà tôi đang truyền (context.getImageData (0, 0, canvas.width, canvas.height) .data) là một mảng lớn và không nên có bất kỳ lỗi tham chiếu vòng tròn nào. Nếu nó đang được chuyển đổi sang JSON nội bộ bởi postMessage thì nó chỉ cần đi qua với lỗi. Và theo như tôi biết, tôi không chuyển tiếp một phần tử DOM. – garg

Trả lời

3

Đăng nội dung này như sau. Tôi có thể tạo lại lỗi của bạn trong trường hợp bất kỳ ai khác có thể trả lời câu hỏi của bạn (tôi không thể không may). Tôi đã tìm kiếm các vấn đề về Chromium để xem đó có phải là một lỗi nổi bật, nhưng không tìm thấy bất cứ điều gì. Với xử lý hình ảnh là một trong những ứng dụng phổ biến hơn của WebWorkers, tôi hy vọng ai đó có thể trả lời bạn nhanh chóng.

http://jsfiddle.net/gGFSJ/9/

Từ Chrome (dấu sao bổ sung của tôi):

window.URL does not exist 
window.WebKitURL does not exist 
using window.webkitURL for URL 
window.BlobBuilder does not exist 
using window.WebKitBlobBuilder for BlobBuilder 
***Uncaught Error: DATA_CLONE_ERR: DOM Exception 25*** 
data=send back. 
data=to worker. 
data=send back. 
data=0. 

Từ Firefox:

using window.URL for URL 
window.BlobBuilder does not exist 
window.WebKitBlobBuilder does not exist 
window.webkitBlobBuilder does not exist 
using window.MozBlobBuilder for BlobBuilder 
data=send back. 
data=to worker. 
data=send back. 
data=0. 
data=send back. 
data=[object Uint8ClampedArray]. 
+0

Cảm ơn bạn đã xem xét điều này! Điều này sử dụng mã tương tự: http://dylanfm.github.com/Ladderfck/ (https://github.com/garg/Ladderfck/blob/master/javascripts/app.js) và nó hoạt động tốt trên Chrome nhưng tôi ' m không chắc tại sao tôi không làm việc. Cảm ơn một lần nữa – garg

+0

Nếu tôi sao chép vào một mảng thông thường thì Chrome bắt đầu làm việc – garg

+0

Được đánh dấu là câu trả lời vì nhận xét ban đầu của bạn là chính xác nhưng giờ tôi đã hiểu. Cảm ơn sự giúp đỡ – garg

1

Nếu tôi sao chép getimagedata.data mảng đến một mảng thường xuyên và sau đó chuyển mảng này đến một webworker thì Chrome bắt đầu hoạt động.

var newImageData = []; 
for (var i=0,len=myImageData.length;i<len;++i) newImageData[i] = myImageData[i]; 

Vì vậy, chrome không thể vượt qua một CanvasPixelArray để một công nhân nhưng nó có thể vượt qua một mảng thông thường. Tuy nhiên, Firefox có thể chuyển trực tiếp imagedata.data.

+0

Xấu hổ bạn dường như không thể làm điều đó trực tiếp như trong FF. Có lẽ CanvasPixelArray của Chrome có một số liên kết đến DOM hoặc có thể Chrome chỉ thận trọng với dữ liệu mà nó cho phép truyền qua. –

5

Những gì tôi làm là vượt qua toàn bộ đối tượng imageData từ bối cảnh cho người lao động, và không chỉ là dữ liệu:

var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height); 

// This works beautifully 
worker.postMessage({imgData:imgData}); 

// But this throws the exception 
worker.postMessage({imgData:imgData.data}); 

Với phương pháp này bạn đang đi qua một vài thuộc tính bổ sung cho các công nhân (cụ thể là, chiều rộng và chiều cao của mảng), nhưng tôi nghĩ rằng bit này của dữ liệu bổ sung là tốt hơn so với các chi phí liên quan đến việc sao chép toàn bộ mảng dữ liệu.

+2

Đây phải là câu trả lời được chấp nhận. Trong chrome hiện tại (v33), chuyển toàn bộ đối tượng ImageData hoạt động. –

Các vấn đề liên quan