2013-02-27 26 views
7

आईओएस पर क्रोम एक बाहरी जावास्क्रिप्ट फ़ाइल को शामिल करते समय XMLHttpRequest ऑब्जेक्ट बनाने लगता है। ऐसा लगता है कि इस ऑब्जेक्ट को ग्लोबल वैरिएबल को पहचानकर्ता a के साथ असाइन करना है, जो आपके पास पहले से मौजूद कुछ भी ओवरराइट कर रहा है।क्या मैं क्रोम को अपनी वैश्विक संपत्ति खाने से रोक सकता हूं?

टेस्ट मामला:

  • HTML फ़ाइल (test.html):

    <!-- ... --> 
    <script> 
        var a = 1; // Value is not important for this demonstration 
    </script> 
    <script src="test.js"></script> 
    <!-- ... --> 
    
  • बाहरी JavaScript फ़ाइल (test.js):

    setTimeout(function() { 
        document.write(a); // [object XMLHttpRequest] 
        a.onreadystatechange = function() { 
         document.write(a.readyState); // Alternates between "1" and "4" 
        }; 
    }, 100); 
    

XMLHttpRequest बार-बार अनुरोध करता है (कहीं कहीं ... प्रॉक्सी के माध्यम से डिवाइस कनेक्शन को रूट करना और निगरानी अनुरोध कुछ भी नहीं दिखाता है) और onreadystatechange ईवेंट हैंडलर बार-बार निष्पादित किया जाता है।

कुछ और टिप्पणियों:

  • यह केवल (इसलिए setTimeout)
  • जब यह होता है पृष्ठ लोड करने के बाद कुछ समय लगता है, वहाँ भी एक window.__gchrome_CachedRequest संपत्ति
  • __gchrome_CachedRequest === a
  • है
  • यह आईओएस क्रोम के पुराने संस्करणों में ऐसा प्रतीत नहीं होता है (यह सुनिश्चित नहीं है कि यह कौन सा संस्करण पहले होता है)

क्या कोई इससे पहले इस पर आ गया है? क्या ऐसा कोई तरीका है जिससे मैं इसे रोकने से रोक सकता हूं (नोट ... मैं a का नाम नहीं बदल सकता)? अगर कोई क्यों जानता है ऐसा करता है तो मुझे यह पता लगाना अच्छा लगेगा।


अद्यतन

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

+1

नोट - 'document.write' कॉल पृष्ठ पर आसानी से आउटपुट करने के लिए बस वहां हैं। उन्हें 'अलर्ट', या' आंतरिक HTML ', या यदि आप चाहें तो कुछ और बदलें। प्रभाव वही है। –

+0

यह वास्तव में विचित्र व्यवहार है, जिसे मैं अपने स्थानीय पर दोहराना प्रतीत नहीं कर सकता। एक बात जो मैं अनुशंसा करता हूं वह आपके नेटवर्क के बाहर एक स्पष्ट क्रोम पर दी गई साइट का परीक्षण कर रहा है (कुछ प्लगइन्स जेएस, यानी स्काइप, और कुछ नेटवर्क प्रदाताओं के "सामान्य" कार्यकलापों को बाधित करते हैं, साथ ही साथ उनकी सामग्री भी जोड़ते हैं)। – eithed

+0

@Eithed - मैंने इसे 3 अलग-अलग डिवाइसों पर साफ क्रोम इंस्टॉल पर परीक्षण किया है (आईफोन 3 आईओएस 5 चला रहा है, और आईपैड 2 और आईपॉड टच दोनों आईओएस 6 चला रहे हैं)। वे सभी परीक्षण उपकरण हैं जिनमें कोई अनावश्यक प्लगइन्स नहीं हैं। हालांकि, यह क्रोम के नवीनतम संस्करण (23) के साथ है। –

उत्तर

2

चर्चा में हमारे पास चर्चा से, ऐसा लगता है कि क्रोम with कथन का उपयोग कर रहा है ताकि window गुणों के शीर्ष पर अपनी कुछ चीज़ें ले सकें। यह शायद ऐसा इसलिए करता है क्योंकि उन गुणों को आम तौर पर ओवरराइट नहीं किया जाएगा। पेज लोड होने के बाद देरी सबसे अधिक संभावना है कि क्रोम UIWebView में अपने स्वयं के स्क्रिप्ट को इंजेक्ट कर सकता है (आईओएस पर ब्राउज़र को अपने इंजन के बजाए अंतर्निहित UIWebView ऑब्जेक्ट का उपयोग करने के लिए मजबूर होना पड़ता है)।

यदि यह सब अटकलें वास्तव में सच है, तो सरल उपाय, अन्य a के बजाय window.a का उपयोग करने की तुलना में या सत्ता वापस लेने के लिए और अपने स्वयं के with कथन का उपयोग है:

with (window) 
    eval(myScript); 

शायद ही एक समाधान किसी को भी स्वाद होगा कार्यान्वित करना, लेकिन आपका एकमात्र विकल्प हो सकता है।

+1

मुझे लगता है कि हमारी अटकलें शायद मामला है इसलिए मैं इसे स्वीकार करने के रूप में चिह्नित करूंगा। मैंने एक [क्रोमियम मुद्दा] उठाया है (http://code.google.com/p/chromium/issues/detail?id=178737) ताकि हम देखेंगे कि कोई "आधिकारिक" प्रतिक्रिया है या नहीं। आपकी सहायता के लिए धन्यवाद. –

+0

@ जेम्सस अलार्डिस: कोई समस्या नहीं, मुझे उम्मीद है कि यह जल्द ही आपके लिए तय हो जाएगा। –

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