2010-02-24 16 views
7

तो मैं AJAX पर एक पुस्तक पढ़ रहा हूं, और वे कई अनुरोधों को संभालने के तरीके के रूप में आंतरिक फ़ंक्शन का उपयोग करने के बारे में बात कर रहे हैं। मैं समझता हूँ कि, लेकिन कोड वे इस्तेमाल के इस बिट में, मुझे समझ नहीं आता कैसे चर XMLHttpRequestObject अभी भी प्रयोग किया जा सकता है: जब वे XMLHttpRequestObject हटाकर बादअगर XMLHttpRequestObject हटा दिया गया है और/या इसमें कोई मान नहीं है, तो यह AJAX को एंटिंग करता है क्योंकि यह भी शून्य पर सेट है?

if(XMLHttpRequestObject) 
{ 
    XMLHttpRequestObject.open(“GET”, dataSource); 

    XMLHttpRequestObject.onreadystatechange = function() 
    { 
     if (XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200) 
     { 
      document.getElementById(“targetDiv”).innerHTML = XMLHttpRequestObject.responseText; 
      delete XMLHttpRequestObject; 
      XMLHttpRequestObject = null; 
     } 
    } 

    XMLHttpRequestObject.send(null); 
} 

मेरी पहली पछतावा है, के बाद यह माना जाता है कि नष्ट कर दिया है, वे इसे शून्य के बराबर सेट करते हैं। उसके बाद माना जाता है कि इसे हटा दिया गया है और शून्य पर सेट किया गया है, तो वे XMLHttpRequestObject.send(null); का उपयोग करते हैं, लेकिन XMLHttpRequestObject हटा दिए जाने पर यह कुछ भी कैसे करता है और/या इसमें कोई मान नहीं है क्योंकि यह भी शून्य पर सेट है?

+0

मेरे लिए एक बग जैसा दिखता है। –

उत्तर

1

मेरा पहला क्वालिम तब होता है जब वे XMLHttpRequestObject को हटाते हैं और फिर, इसे हटाए जाने के बाद, वे इसे शून्य के बराबर सेट करते हैं।

पता नहीं क्यों वे ऐसा कर रहे हैं। null पर सेट करना मेरे लिए पर्याप्त लगता है, लेकिन शायद यह कुछ अस्पष्ट ब्राउज़र क्विर्क हल करता है।

फिर इसे हटाए जाने के बाद हटा दिया गया और शून्य पर सेट करने के बाद, वे XMLHttpRequestObject.send (null) का उपयोग करते हैं;

संख्या। ईवेंट हैंडलर के अंदर हटाना होता है - अनुरोध के बाद तक इस ईवेंट हैंडलर फ़ंक्शन को कॉल नहीं किया जाता है, और xhr ऑब्जेक्ट की स्थिति बदलती है, उदाहरण के लिए सर्वर प्रतिक्रिया के कारण, या संचार में होने वाली त्रुटि के कारण।

असल में, बुला अनुक्रमघोषणा अनुक्रम के रूप में ही नहीं है। कॉलिंग अनुक्रम है:

XMLHttpRequestObject.open(“GET”, dataSource); 
... //assign event handler so it can be called later on 
XMLHttpRequestObject.send(null); 
... //request send, program continues 


//separate context here, goes off when the readystate of the xhr changes 
//due to server response or error: 
function() 
{ 
    if (XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200) 
    { 
     document.getElementById(“targetDiv”).innerHTML = XMLHttpRequestObject.responseText; 
     delete XMLHttpRequestObject; 
     XMLHttpRequestObject = null; 
    } 
} 
2

onreadystatechange फ़ंक्शन इसे बनाए जाने पर तुरंत निष्पादित नहीं होता है। जैसा कि नाम से पता चलता है, राज्य को बदलते समय इसे बुलाया जाता है।

इस मामले में XMLHttpRequestObject केवल XMLHttpRequestObject.readyState == 4 और XMLHttpRequestObject.status == 200 के बाद हटा दिया गया है, यानी पृष्ठ सफलतापूर्वक प्राप्त होने के बाद ही हटा दिया गया है।

+0

ठीक है, इसलिए इसे सफलतापूर्वक प्राप्त होने के बाद, यह एक त्रुटि कैसे नहीं उठाता है। यह अभी भी XMLHttpRequestObject को हटाने के बाद शून्य के बराबर सेट करता है। सी ++ या कुछ की तुलना में जेएस में हटाए गए कीवर्ड के साथ चीज़ें अलग-अलग हैं? – Justen

+0

@Justen: 'हटाएं' कथन पर क्या होता है यह है कि 'XMLHttpRequestObject' नाम के साथ वैरिएबल द्वारा जो भी ऑब्जेक्ट संदर्भित किया गया है उसे हटाने के लिए चिह्नित किया गया है और अंत में कचरा एकत्रित किया जाएगा। 'शून्य' असाइनमेंट सिर्फ 'XMLHttpRequestObject' को एक नया मान - 'null' प्रदान कर रहा है। तो परिवर्तनीय 'XMLHttpRequestObject' ऑब्जेक्ट के समान नहीं है - इसका उपयोग किसी ऑब्जेक्ट के संदर्भ को पकड़ने के लिए किया जाता है, और उस ऑब्जेक्ट पर' हटाएं 'कार्य करता है, चर नहीं। –

+0

मैंने सोचा कि जेएस कचरा संग्रह था? खुद को हटाने के लिए चीज़ को चिह्नित करने की आवश्यकता क्यों है? – Justen

0

यह राज्य बदलते समय बुलाए जाने के लिए एक फ़ंक्शन सेट करता है। इसे तुरंत नहीं कहा जाता है, इसलिए यह तुरंत ऑब्जेक्ट का उपयोग नहीं कर रहा है।

तथ्य यह है कि आप XmlHttpRequestedObject का उपयोग कर सकते हैं, यह कुछ फैंसी कंपाइलर चाल है, मूल रूप से, जहां यह कार्य और परिवर्तनीय सामग्री को लपेटने के लिए बदसूरत कोड लिखता है।

+0

तो यह तुरंत इसका उपयोग नहीं करता है, लेकिन जब इसका उपयोग किया जाता है , मेरे सभी प्रश्न एक ही हैं। – Justen

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

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