2009-08-17 14 views
31

टी एल; डॉ: जोड़ा जा रहा है किसी भी गैर-बिल्ट-इन कार्य 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> 
+3

जावास्क्रिप्ट दल ने बताया है कि इस JavaScript इंजन में एक ज्ञात समस्या है। धन्यवाद। – EricLaw

+0

मुझे बताने के लिए धन्यवाद। –

उत्तर

2

यह ठीक यहाँ काम करने के लिए लगता है:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
<head> 
<title>Test</title> 
</head> 
<body> 
<pre> 
<script type="text/javascript"> 
document.writeln(''); 
var o = { 
    "firstName": "cyra", 
    "lastName": "richardson", 
    "address": { 
     "streetAddress": "1 Microsoft way", 
     "city": "Redmond", 
     "state": "WA", 
     "postalCode": 98052 
    }, 
    "phoneNumbers": [ 
     "425-777-7777", 
     "206-777-7777" 
    ] 
}; 
var s = JSON.stringify(o); 
document.writeln(s); 
var p = JSON.parse(s, function (key, val) { 
    if (typeof val === 'string') return val + '-reviver!'; 
    else return val; 
}); 
dump(p); 

function dump(o) { 
    for (var a in o) { 
     if (typeof o[a] === 'object') { 
      document.writeln(a + ':'); 
      dump(o[a]); 
     } else { 
      document.writeln(a + ' = ' + o[a]); 
     } 
    } 
} 
</script> 
</pre> 
</body> 
</html> 

समस्या या तो एक भ्रष्ट इंटरनेट एक्सप्लोरर 8 स्थापित है (आप स्थापित एक ही विंडोज पर इंटरनेट एक्सप्लोरर की कई प्रतियां चलाने का प्रयास कर रहे हैं?) या आपका इनपुट खराब है।

आप Native JSON in IE8 पढ़ना भी चाह सकते हैं। यह विशेष रूप से पैरा रुचि का हो सकता:

वैकल्पिक पुनर्जीवित तर्क एक उपयोगकर्ता परिभाषित पद के लिए इस्तेमाल किया परिवर्तन पार्स कार्य है। परिणामी ऑब्जेक्ट या सरणी को पीछे से घुमाया जाता है, रिवर्स फ़ंक्शन प्रत्येक सदस्य पर लागू होता है। प्रत्येक सदस्य मान को पुनर्विक्रेता द्वारा लौटाया गया मान के साथ प्रतिस्थापित किया गया है। यदि रिवाइवर शून्य लौटाता है, तो ऑब्जेक्ट सदस्य हटा दिया जाता है। ट्रैवर्सल और रिवॉवर पर कॉल पोस्टऑर्डर में किया जाता है। ये सही है; हर वस्तु है पुनर्जीवित '' revived' के बाद अपने सभी सदस्यों हैं '।

उपर्युक्त पैराग्राफ बताता है कि मेरा रिवाइवर फ़ंक्शन ऐसा तरीका क्यों दिखता है। मेरे परीक्षण कोड का पहला प्रयास था:

function (key, val) { 
    return val + '-reviver!'; 
} 

जाहिर है इस फिर से जीवित करनेवाला समारोह अपने सभी बच्चों के लिए लागू किए जाने के बाद से ऊपर address नोड के लिए लागू किया जाता है, तो मैं पूरी तरह से address वस्तु को नष्ट कर दिया गया है।

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

क्या आप edit your question कर सकते हैं और समस्या को प्रदर्शित करने वाले वास्तविक डेटा का नमूना पोस्ट कर सकते हैं ताकि मैं इसे आजमा सकूं?

+0

धन्यवाद - यह पता चला है कि प्रोटोटाइप किसी भी तरह अपराधी है। पूरी प्रतिक्रिया के लिए +1! –

3

मेरे पास इस प्रश्न को कुछ समय के लिए बैठे हुए स्वीकार्य उत्तरों के साथ नहीं मिला है, इसलिए बस इसे छुटकारा पाने के लिए, मैं इसे स्वयं जवाब दूंगा।

एरिक कानून माइक्रोसॉफ्ट पर कहते हैं:

जावास्क्रिप्ट दल ने बताया है कि इस JavaScript इंजन में एक ज्ञात समस्या है।

5

एक समाधान IE8 पर देशी JSON.parse हटाने और JSON से बदलने के लिए है।json2.js lib से पार्स:

जोड़ें:

<script type="text/javascript"> 
if (jQuery.browser.msie && jQuery.browser.version.indexOf("8.") === 0) { 
    if (typeof JSON !== 'undefined') { 
     JSON.parse = null; 
    } 
} 
<script> 

... और फिर में शामिल हैं:

<script type="text/javascript" src="json2.js"></script> 

यह अपने स्वयं के संस्करण के साथ JSON.parse को बदलने के लिए json2 ट्रिगर किया जाएगा

// json2.js 
... 
if (typeof JSON.parse !== 'function') { 
    JSON.parse = function (text, reviver) { 
... 

उसके बाद पार्स फिर से काम करना चाहिए। इस दृष्टिकोण के साथ

एक समस्या यह है json2.js पार्स कि विधि देशी एक की तुलना में धीमी है।

+0

मुझे एक ही समस्या है। IE8 पर काम करने के लिए मुझे JSON.parser की आवश्यकता है। मैंने आपकी सिफारिश की, यह मेरे लिए काम नहीं कर रहा है। यह किसी अन्य विभिन्न ब्राउज़रों पर काम करता है। कोई विचार? – user1471980

-2
eval(Ext.decode("{"foo":"bar"}")); 

में एक वस्तु में एक स्ट्रिंग बदलाव ला रहा है आईई 8

2

इस मुद्दे का एक एक्सटेंशन (जो अभी भी IE9 में मौजूद है), देशी JSON.stringify समारोह दुर्घटनाओं आईई जब वहाँ है:

  1. एक बड़ी वस्तु ग्राफ
  2. वस्तु ग्राफ संदर्भ jQuery ' डेटा 'ऑब्जेक्ट्स।
  3. वस्तु ग्राफ परिपत्र है।

हम अनिश्चित जो विशिष्ट बिंदु दुर्घटना का कारण बनता है कर रहे हैं।

इस उदाहरण में हमारे वैकल्पिक हल stringify समारोह पर एक replacer समारोह का उपयोग करने के चल जाने से एक विशेष वस्तु की संपत्ति पर अशक्त लौट सकते हैं और वस्तु ग्राफ को रोकने के लिए किया गया था।