2012-01-08 22 views
5

जब मैं कोड है कि साथ imageData एक वेब कार्यकर्ता को पारित किया जा रहा सौदों और फिर वापस, तो फ़ायरफ़ॉक्स अच्छा काम करता है, लेकिन क्रोम देता चलाने "Uncaught त्रुटि: DATA_CLONE_ERR: डोम अपवाद 25"वेब कार्यकर्ता imageData Firefox के साथ काम कर रहा है, लेकिन Chrome नहीं है के साथ काम कर

खोज Google ने सुझाव दिया है कि क्रोम के पुराने संस्करण काम करते थे?

मैंने कुछ और जांच की और ऐसा लगता है कि मुझे JSON.stringify और JSON.parse को भेजने से पहले इमेजेडाटा पर चलाने की आवश्यकता है, लेकिन फिर यह हर जगह काम करना बंद कर देता है। कोड है कि एफएफ 9 में काम करता है:

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'}); 
    } 

क्या विधि मैं क्रम में उपयोग करना चाहिए इस imagedata आगे पीछे भेजने के लिए ऐप और वेब वर्कर?

धन्यवाद!

संपादित करें:

अगर मैं एक नियमित सरणी तो क्रोम काम करना शुरू करने के लिए नकल ...

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

तो क्रोम एक कार्यकर्ता के लिए एक CanvasPixelArray पारित नहीं हो सकता, लेकिन यह एक नियमित सरणी पारित कर सकते हैं। लेकिन फ़ायरफ़ॉक्स कर सकते हैं।

+0

http: // stackoverflow।कॉम/प्रश्न/7506635/uncaught-error-data-clone-err-dom-upgrade-25-thrown-by-web-worker –

+0

ओह। धन्यवाद। मुझे कोशिश करें :) – garg

+0

मैं अभी भी इस बारे में स्पष्ट नहीं हूं। जो डेटा मैं पास कर रहा हूं (context.getImageData (0, 0, canvas.width, canvas.height) .डेटा) एक बड़ी सरणी है और इसमें कोई परिपत्र संदर्भ त्रुटियां नहीं होनी चाहिए। यदि इसे पोस्ट मैसेज द्वारा आंतरिक रूप से JSON में परिवर्तित किया जा रहा है तो इसे केवल त्रुटियों से बाहर जाना चाहिए। और जहां तक ​​मुझे पता है, मैं एक डोम तत्व अग्रेषित नहीं कर रहा हूं। – garg

उत्तर

3

इसे अनुवर्ती के रूप में पोस्ट करना। यदि कोई और आपके प्रश्न का उत्तर दे सकता है तो मैं आपकी त्रुटि पुन: पेश कर सकता हूं (दुर्भाग्य से मैं नहीं कर सकता)। मैंने क्रोमियम के मुद्दों को यह देखने के लिए खोजा है कि यह एक उत्कृष्ट बग है, लेकिन कुछ भी नहीं मिला है। दी गई छवि प्रसंस्करण वेबवर्कर्स के अधिक लोकप्रिय उपयोगों में से एक है, मुझे उम्मीद है कि कोई आपको जल्दी उत्तर दे सकता है।

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

क्रोम से (तारांकन मेरे द्वारा जोड़ा):

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. 

फ़ायरफ़ॉक्स से:

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

इसे देखने के लिए धन्यवाद! यह समान कोड का उपयोग करता है: http://dylanfm.github.com/Ladderfck/ (https://github.com/garg/Ladderfck/blob/master/javascripts/app.js) और यह क्रोम पर ठीक काम करता है लेकिन मैं ' मुझे यकीन नहीं है कि मेरा काम क्यों नहीं कर रहा है। धन्यवाद फिर से – garg

+0

यदि मैं नियमित सरणी में प्रतिलिपि करता हूं तो क्रोम – garg

+0

पर काम करना शुरू कर देता है क्योंकि उत्तर आपकी मूल टिप्पणी सही थी लेकिन अब मैं समझता हूं। सहायता – garg

1

अगर मैं getimagedata.data एक नियमित सरणी सरणी कॉपी और फिर सरणी को वेबवर्कर पर पास करें, फिर क्रोम काम करना शुरू कर देता है।

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

तो क्रोम एक कार्यकर्ता के लिए एक CanvasPixelArray पारित नहीं हो सकता, लेकिन यह एक नियमित सरणी पारित कर सकते हैं। लेकिन फ़ायरफ़ॉक्स imagedata.data सीधे पास कर सकता है। इस दृष्टिकोण आप कार्यकर्ता को कुछ अतिरिक्त विशेषताओं गुजर रहे हैं के साथ अर्थात्

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}); 

(,:

+0

शर्म की बात है कि आप इसे एफएफ में सीधे ऐसा नहीं कर सकते हैं। हो सकता है कि क्रोम के कैनवास पिक्सेलएरे के पास डोम के लिए कुछ लिंक हो, या हो सकता है कि क्रोम सिर्फ उस डेटा के साथ सावधानी बरत रहा हो जो इसे पारित करने की अनुमति देता है। –

5

मुझे क्या कार्यकर्ता को संदर्भ से पूरे imagedata वस्तु पारित है, और न सिर्फ डेटा सरणी की चौड़ाई और ऊंचाई), लेकिन मुझे लगता है कि अतिरिक्त डेटा सरणी को कॉपी करने के साथ जुड़े अतिरिक्त डेटा का यह अतिरिक्त ओवरहेड से बेहतर है।

+2

यह स्वीकार्य उत्तर होना चाहिए। वर्तमान क्रोम (v33) में, पूरे ImageData ऑब्जेक्ट को गुजरता है। –

संबंधित मुद्दे