2010-03-20 14 views
6

मैं जावास्क्रिप्ट और AJAX दुनिया के लिए बिल्कुल नया हूं लेकिन सीखने की कोशिश कर रहा हूं।XMLHttpRequest में मुझे क्या याद आ रही है?

अभी मैं XMLHttpRequest का परीक्षण कर रहा हूं और मैं काम को सबसे सरल उदाहरण भी नहीं बना सकता। यह मैं

<script type="text/javascript"> 
     function test() { 
      xhr = new XMLHttpRequest(); 

      xhr.onreadystatechange = function() { 
       if (xhr.readyState == 4 && xhr.status == 200){ 
        var container = document.getElementById('line'); 
        container.innerHTML = xhr.responseText; 
       } else { 
        alert(xhr.status); 
       } 
      } 

      xhr.open('GET', 'http://www.google.com', true);     
      xhr.send(null); 
     } 
    </script> 

को चलाने के लिए कोशिश कर रहा हूँ और मैं हमेशा स्थिति 0. मैं इस बारे में जाले की टन पढ़ा है के साथ चेतावनी मिलता है और मैं नहीं जानता कि मैं क्या याद आ रही है कोड है। मैं किसी भी मदद की सराहना करता हूं, धन्यवाद!

उत्तर

13

आप Same Origin Policy में भाग रहे हैं।

जब तक आपका कोड वास्तव में www.google.com पर चल रहा है (जो असंभव है), यह त्रुटि होगी।

इसके अलावा, और यह इस समय आपको कोई समस्या नहीं पैदा कर रहा है, यह खराब अभ्यास है और दौड़ की स्थिति का कारण बन सकता है, आप पूरे स्थान पर ग्लोबल्स का उपयोग कर रहे हैं।

XHR चर समारोह

var xhr = new XMLHttpRequest(); 

करने के लिए स्थानीय बनाओ और onreadstatechange विधि के अंदर this साथ कहते हैं।

if (this.readyState == 4 && this.status == 200){ 
// etc etc 
8

David's answer से बाद:

आप एक ही मूल नीति के भीतर रहने के एक रिश्तेदार पथ का उपयोग करने के लिए है। अन्यथा अधिकांश ब्राउज़र बस खाली responseText और status == 0 वापस कर देंगे।

एक संभावित कामकाज के रूप में, यदि आप अपाचे का उपयोग कर रहे हैं तो के साथ आप एक बहुत ही सरल reverse proxy सेट कर सकते हैं। यह आपको अपने AJAX अनुरोध में सापेक्ष पथ का उपयोग करने की अनुमति देगा, जबकि HTTP सर्वर किसी भी "दूरस्थ" स्थान पर प्रॉक्सी के रूप में कार्य करेगा।

mod_proxy में एक रिवर्स प्रॉक्सी सेट करने के लिए मूलभूत कॉन्फ़िगरेशन निर्देश ProxyPass है। आप आमतौर पर इसका इस्तेमाल देंगी:

ProxyPass  /ajax/  http://google.com/ 

इस मामले में, ब्राउज़र /ajax/search?q=stack+overflow का अनुरोध किया जाएगा लेकिन सर्वर http://google.com/search?q=stack+overflow के लिए एक प्रॉक्सी के रूप में कार्य करके इस काम करेगा।

1

दोनों डैनियल और डेविड सही उत्तरों के लिए करने के लिए +1, मुझे लगता है कि आप सीधे एक का उपयोग कर XHR उपाध्यक्ष का उपयोग करना चाहिए वहाँ बहुत कम मामलों में है कि (जब तक आप बस जे एस बेहतर सीखना चाहते हैं) टिप्पणी में जोड़ना चाहते हैं jQuery जैसी लाइब्रेरी जिसे दुनिया भर के लाखों डेवलपर्स द्वारा परीक्षण और साबित किया गया है। इसमें कई अन्य उपयोगी विशेषताएं भी हैं जो आपके AJAX विकास (जैसे एनिमेशन और डोम हेरफेर) के साथ आपकी सहायता करेंगी।

पॉल

2

एक ही मूल नीति मुद्दे के अलावा, अपने alert एक विसंगत स्थान पर है। जब आप XMLHttpRequest का उपयोग करते हैं, तो xhr.onreadystatechange को असाइन किए गए फ़ंक्शन को readyState परिवर्तनों पर कॉल किया जाएगा। readyState को (सिद्धांत में) 0 (प्रारंभिक) से 1 (प्रेषित) से 2 (लोडिंग) में 3 (इंटरैक्टिव) से 4 (समाप्त) तक बदलना चाहिए।

क्या अपने कोड करता readyState की जाँच करें और यदि अनुरोध समाप्त हो गया है (if (xhr.readyState == 4)) देखते हैं, और नहीं तो, alertHTTP status code है। चूंकि अनुरोध अभी तक नहीं भेजा गया है (या अभी भेजा गया है), अभी तक एक HTTP स्थिति नहीं होनी चाहिए।

आदर्श रूप से, आपको if ब्लॉक के अंदर ले जाना चाहिए, इसलिए यह आपको समाप्त होने पर बताता है।

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