टी एल; डॉ: जोड़ा जा रहा है किसी भी गैर-बिल्ट-इन कार्य Array.prototype करने और जब किसी भी JSON को पार्स Function.prototype एक ढेर अतिप्रवाह पाने के लिए IE8 देशी JSON पार्सर का कारण होगा कि एक सरणी है, लेकिन केवल तभी जब आप JSON.parse() में एक रिविवर फ़ंक्शन भी पास करते हैं।IE8 देशी JSON.parse बग कारणों अतिप्रवाह ढेर
यह एक सवाल के रूप में शुरू है, लेकिन मैं अपने खुद के मूल प्रश्न का उत्तर दिया है, इसलिए अब मैं पूछता हूँ: किसी को भी इस IE8 बग है कि सभी जे एस पुस्तकालयों कि संशोधित नष्ट करने को शामिल नहीं करता के लिए एक के बारे में सोच काम के आसपास कर सकते हैं Array.prototype और Function.prototype?
मूल प्रश्न:
मैं JSON डेटा के बारे में 13k पार्स करने के लिए की है। डेटा की संरचना एक ऑब्जेक्ट वाली एक ऑब्जेक्ट है जो एक नेस्टेड सरणी है।
{ 'value':[[ stuff ], [ more stuff], [ etc ]] }
मैं json2.js उपयोग कर रहा हूँ, जो ब्राउज़र देशी JSON.parse जब उपलब्ध के लिए defers। मैं तारीखों को सही तरीके से संभालने के लिए JSON.parse में एक रिवाइवर फ़ंक्शन पास कर रहा हूं। जब IE8 आईई 7 इम्यूलेशन मोड में है (जो इसे स्क्रिप्ट-आधारित json2.js पार्सर का उपयोग करने का कारण बनता है) सबकुछ ठीक काम करता है। जब IE8 IE8 मोड में है (जो इसे ब्राउज़र-मूल JSON पार्सर का उपयोग करने का कारण बनता है) यह "स्टैक स्पेस से बाहर" त्रुटि के साथ उड़ाता है। फ़ायरफ़ॉक्स और क्रोम, ज़ाहिर है, अपने ब्राउज़र-मूल JSON पार्सर्स के साथ ठीक काम करते हैं।
मैंने इसे नीचे संकुचित कर दिया है: यदि मैं JSON.parse में भी कुछ भी नहीं करता है, तो IE8 देशी पार्सर को स्टैक ओवरफ़्लो मिलता है। अगर मैं कोई रिवाइवर फ़ंक्शन नहीं करता हूं, तो IE8 मूल पार्सर ठीक काम करता है, सिवाय इसके कि यह तिथियों को सही तरीके से पार्स नहीं करता है।
// no error:
JSON.parse(stuff);
// "out of stack space" error:
JSON.parse(stuff, function(key, val) { return val; });
मैं अपने JSON डेटा के साथ खेलने के लिए, को देखने के लिए कम डेटा या डेटा की कम नेस्टिंग त्रुटि से बचने कर सकते हैं यदि जा रहा हूँ, लेकिन मैं सोच रहा था कि अगर किसी को भी इस से पहले देखा था, या किसी अन्य सुझाव दिया था काम arounds। IE8 पहले से धीमा है, इस बग के कारण उस ब्राउज़र के लिए मूल JSON को अक्षम करना शर्म की बात होगी।
अद्यतन: अन्य मामलों में, विभिन्न JSON डेटा के साथ, मुझे एक जावास्क्रिप्ट त्रुटि मिल रही है "$ lineinfo अपरिभाषित है" जब मैं IE8 देशी पार्सर को रिवाइवर फ़ंक्शन के साथ उपयोग करता हूं, और कोई त्रुटि नहीं है यदि मैं कोई रिवाइवर फ़ंक्शन नहीं करता हूं। स्ट्रिंग "$ lineinfo" मेरे किसी भी स्रोत कोड में कहीं भी दिखाई नहीं दे रही है।
अद्यतन 2: असल में, यह समस्या प्रोटोटाइप 1.6.0.3 के कारण होती है। मैं प्रोटोटाइप लाइब्रेरी में जोड़े जाने तक इसे एक अलग परीक्षण पृष्ठ में पुन: उत्पन्न करने में असमर्थ था।
अद्यतन 3:
कारण prototype.js IE8 देशी JSON पार्सर टूट जाता है यह है: जोड़ा जा रहा है किसी भी गैर-बिल्ट-इन कार्य Array.prototype करने और Function.prototype IE8 देशी JSON पार्सर का कारण बन पाने के लिए होगा किसी भी JSON को पार्स करते समय एक स्टैक ओवरफ़्लो जिसमें सरणी होती है, लेकिन केवल तभी जब आप JSON.parse() में एक रिविवर फ़ंक्शन भी पास करते हैं।
प्रोटोटाइप लाइब्रेरी Array.prototype और Function.prototype दोनों में फ़ंक्शंस जोड़ती है, लेकिन यह वही काम करने वाली किसी भी अन्य लाइब्रेरी के लिए समान रूप से लागू होती है। आईई JSON पार्सर में यह बग प्रोटोटाइप और एक्सटी द्वारा खुलासा किया गया है, लेकिन jQuery नहीं। मैंने किसी अन्य ढांचे का परीक्षण नहीं किया है।
यहां समस्या का एक पूरी तरह से अकेला प्रजनन है। यदि आप Function.prototype लाइन, या Array.prototype लाइन को हटाते हैं, या JSON स्ट्रिंग से सरणी को हटाते हैं, तो आपको "स्टैक स्पेस से बाहर" त्रुटि नहीं मिलेगी।
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
Function.prototype.test1 = function() { };
Array.prototype.test2 = function() { };
window.onload = function()
{
alert(JSON.parse('{ "foo": [1,2,3] }', function(k,v) { return v; }));
}
</script>
</head>
<body>
</body>
</html>
जावास्क्रिप्ट दल ने बताया है कि इस JavaScript इंजन में एक ज्ञात समस्या है। धन्यवाद। – EricLaw
मुझे बताने के लिए धन्यवाद। –