2012-06-20 5 views
6

कुछ कोड है कि मैं नियंत्रण अपने हाथ में नहीं है पता चल सके कि यह पहले से ही लागू हो जाता है बिना वैश्विक JSON ऑब्जेक्ट अधिभावी है:बहाल ओवरराइड window.JSON वस्तु

var JSON = { 
    org: "http://www.JSON.org", 
    copyright: "(c)2005 JSON.org", 
    license: "http://www.crockford.com/JSON/license.html", 
    stringify: function(a, g) { 
    ... 

समस्या है कि JSON पार्सर के इस संस्करण बहुत पुराना है और इसमें एक बग है, जो धारावाहिकरण पर मेरे प्रयासों को झुका रहा है। (दूसरों के पास इस कार्यान्वयन के साथ similar problem है।)

क्या मैं ब्राउज़र के मूल कार्यान्वयन पर जा सकता हूं? मैंने सोचा delete would work, लेकिन ऐसा नहीं है। मुझे संदेह है कि ऐसा इसलिए है क्योंकि JSON एक ऑब्जेक्ट है और method in the prototype नहीं है। क्या इसे पाने का कोई और तरीका है?

एक iframe सम्मिलित करें और (contextWindow बंद JSON हड़पने के रूप में में संकेत:

+2

इसी तरह के प्रश्न हाल ही में पॉप अप हो गए हैं। आप एक खाली आईफ्रेम बना सकते हैं और JSON ऑब्जेक्ट प्राप्त कर सकते हैं। या बाद में एक बेहतर पुस्तकालय शामिल किया गया। –

+0

ओह, एक खाली आईफ्रेम। यह बहुत चालाक है। निश्चित रूप से यह जवाब है? – paleozogt

+0

मुझे उत्सुकता है कि आप आईफ्रेम के डीओएम से जानकारी कैसे प्राप्त कर सकते हैं, मैंने सोचा कि ब्राउज़र ने बच्चे के फ्रेम की जावास्क्रिप्ट को सैंडबॉक्स किया है ... – jcolebrand

उत्तर

8

आप iframe तत्व बना सकते हैं (जो about:blank लोड करेगा और इसलिए नया संदर्भ बनाएं) और वहां से एक JSON ऑब्जेक्ट प्राप्त करें।

function restoreJSON() { 
    var f = document.createElement("iframe"); 
    f.style.display = "none"; 
    document.documentElement.appendChild(f); 
    window.JSON = f.contentWindow.JSON; 
    document.documentElement.removeChild(f); 
} 

about:blank साथ में लोड किए है, इसलिए load घटना के लिए प्रतीक्षा करने के लिए कोई जरूरत नहीं। हालांकि यह मूल JSON ऑब्जेक्ट को पुनर्स्थापित नहीं कर रहा है, लेकिन यह एक ब्लैक-बॉक्स समान है।

+2

' f' को DOM में डालने की आवश्यकता है, लेकिन 'डिस्प्ले: कोई भी नहीं' संभव है। – kay

+0

@kay प्रति spec यह नहीं होना चाहिए, और मुझे विश्वास है कि कम से कम सभी ब्राउज़रों की नवीनतम रिलीज का पालन करें। – gsnedders

+0

ओह, spec के लिए इसकी आवश्यकता है। – gsnedders

1

कोड आप नियंत्रण अपने हाथ में नहीं है कि मूल अधिभावी है इससे पहले कि आप पेज में साथ आ के बाद से, आपके पास दो विकल्प इस संपादन के समय इस प्रश्न पर अन्य उत्तर), या, वैकल्पिक रूप से, https://github.com/douglascrockford/JSON-js JSON लाइब्रेरी का उपयोग अपने स्वयं के सम्मिलन के रूप में करें। ध्यान दें कि क्रॉकफोर्ड का उपयोग करने से अनुरूपता की क्रॉस-ब्राउज़र-गारंटी मिलती है, लेकिन देशी कार्यान्वयन अक्सर तेज़ होते हैं।

<html> 
    <head> 
    <script> 
     window.myJson = window.JSON; 
    </script> 
.... 
:

एक वैकल्पिक यदि आप अपमानजनक कोड से पहले पेज पर साथ आने के लिए भविष्य में क्षमता है, से पहले कुछ सुई कि हमलावर "कोड है कि मदद करता है" JSON ऑब्जेक्ट हड़पने के लिए है

+0

ध्यान दें कि इसमें क्रॉकफोर्ड की स्क्रिप्ट जोड़ने से गायब सुविधाओं को ओवरराइड JSON ऑब्जेक्ट पर स्वचालित रूप से लागू किया जाएगा, और उसकी फाइल का एक छोटा सा संपादन आपको एक नई वस्तु देगा। 'ContentWindow' रखने के लिए – jcolebrand