2011-09-12 10 views
10

यहां नमूने XMLHttpRequest मैं w3schoolsXMLHttpRequest अतुल्यकालिक काम नहीं कर रहा है, हमेशा स्थिति देता है 0

<html> 
<head> 
<script type="text/javascript"> 
function loadXMLDoc() 
{ 
    var T="nothing"; 

    xmlhttp=new XMLHttpRequest(); 
    xmlhttp.overrideMimeType('text/plain'); // don't sc 
    xmlhttp.onreadystatechange=function() 
    { 
    alert ("rdystate: " + xmlhttp.readyState); 
    alert ("status: " + xmlhttp.status); 
    alert ("Text: "  + xmlhttp.statusText); 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
     T = xmlhttp.responseText; 
    } 
    } 
xmlhttp.open("GET","SBL_PROBES.htm",true); 
xmlhttp.send(null); 
//T = xmlhttp.responseText; 
alert(T); 
} 
</script> 
</head> 
<body> 

<h2>Using the XMLHttpRequest object</h2> 
<div id="myDiv"></div> 
<button type="button" onclick="loadXMLDoc()">CHange Content</button> 

</body> 
</html> 

XMLHttpRequest हमेशा एक शून्य स्थिति देता से एक साथ पत्थर है।

फ़ायरफ़ॉक्स के त्रुटि कंसोल में कुछ भी दिखाई नहीं देता है।

अगर मैं लाइन बदलकर

xmlhttp.open("GET","SBL_PROBES.htm",true); 

xmlhttp.open("GET","SBL_PROBES.htm",false); 

करने और अन-टिप्पणी लाइन

//T = xmlhttp.responseText; 

अनुरोध की गई फ़ाइल का पाठ तुल्यकालिक एक के लिए अनुरोध को बदलने वापस आ गया है

एचटीएम और फ़ाइल एक ही निर्देशिका में रहते हैं। यदि आप इसे आज़माते हैं तो आपको एक फ़ाइल SBL_PROBES.htm की भी आवश्यकता होगी, इसकी सामग्री अप्रासंगिक है।

मैं फ़ायरफ़ॉक्स 3.6.22 का उपयोग कर रहा हूं।

क्या यह एक क्रॉस डोमेन समस्या हो सकती है? यदि हां, तो यह एक तुल्यकालिक अनुरोध के रूप में क्यों काम करता है?

+3

कृपया पुष्टि करें कि आप निश्चित रूप से अपने स्थानीय मशीन के फाइल सिस्टम से एक वेब सर्वर से यह पेज चल रहे हैं, और नहीं। यानी, जब आप अपने ब्राउज़र में परीक्षण पृष्ठ पर जाते हैं तो आप यूआरएल http से शुरू करते हैं और फ़ाइल नहीं देखते हैं। – James

+2

इससे आपको परेशान करने के लिए सभी से माफी माँगती है। मेरी समस्या वास्तव में थी कि मैं सर्वर के माध्यम से नहीं चल रहा था लेकिन एक फाइल के रूप में। किसी भी तरह, मुझे यह मेरे सिर के माध्यम से मिला क्योंकि मेरे पास एक .htm फ़ाइल थी जो मैं सर्वर से जा रहा था। मैं evilhead के जवाब में स्वीकार कर लिया क्योंकि वह जब तक यह मेरी मोटी खोपड़ी प्रवेश :-) –

+0

https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest मुझे इस बारे में पूछ रखने के लिए पर एक नजर डालें दृढ़ता था "XMLHttpRequests किया जा रहा बंद कर दिया" अनुभाग। यह एक संयुक्त त्रुटि की तरह दिखता है। –

उत्तर

15

यदि आप कथन के अंदर एक फ़ंक्शन का उपयोग कर सकते हैं। इस समारोह 4.

var handleResponse = function (status, response) { 
    alert(response) 
} 
var handleStateChange = function() { 
    switch (xmlhttp.readyState) { 
     case 0 : // UNINITIALIZED 
     case 1 : // LOADING 
     case 2 : // LOADED 
     case 3 : // INTERACTIVE 
     break; 
     case 4 : // COMPLETED 
     handleResponse(xmlhttp.status, xmlhttp.responseText); 
     break; 
     default: alert("error"); 
    } 
} 
var xmlhttp=new XMLHttpRequest(); 
xmlhttp.onreadystatechange=handleStateChange; 
xmlhttp.open("GET","SBL_PROBES.htm",true); 
xmlhttp.send(null); 

आपके पुराने कोड को निष्पादित किया जाता है जब readyState परिवर्तन एक अतुल्यकालिक कॉल किया था और सिर्फ चेतावनी वक्तव्य के साथ जारी रखा। टी इस समय खाली था।

ठीक है, मैं एक छोटा सा तरीका बताएंगे इस पूरी बात कैसे काम करता है:

पहले हम दो कॉलबैक काम करता है, जो हम बाद में अनुरोध, handleResponse और handleStateChange नामित में फोन परिभाषित करते हैं।

बाद में हम एक वस्तु है, जो XMLHttpRequest

var xmlhttp=new XMLHttpRequest(); 

यह एक वस्तु में जो परिणाम के रूप में इस प्रकार (simplyfied) का प्रतिनिधित्व करता है बनाने के लिए:

XMLHttpRequest { status=0, readyState=0, multipart=false, onreadystatechange=handleEvent()} 

खुला (...) समारोह के साथ आप फोन अनुरोध के लिए निर्धारित मापदंडों:

xmlhttp.open("GET","SBL_PROBES.htm",true); 

इसका मतलब यह है, के लिए एक अतुल्यकालिक प्राप्त अनुरोध करते हैं पृष्ठ SBL_PROBES.htm प्राप्त करें, फिर भेजें (...) फ़ंक्शन को कॉल किया जाता है जो अनुरोध को स्वयं निकाल देता है।

हमने पहले से ही बदलाव के लिए कॉलबैक फ़ंक्शन पंजीकृत किया है, जैसा कि आप कल्पना कर सकते हैं, यह वास्तव में एक ईवेंट हैडलर है।जब भी राज्य इस समारोह को बदलता है उसे बुलाया जाता है। (यह वही है जैसे आप एक फॉर्म में ऑनबैक इवेंट में कॉलबैक फ़ंक्शन पंजीकृत करते हैं, यह कॉलबैक हर बार आपकी कुंजी बढ़ जाती है :))

आपकी समस्या के लिए ब्याज का एकमात्र मामला राज्य 4 है । हैंडल के लिए कॉलबैक कॉलबैक फ़ंक्शन केवल 4 राज्य में ही कहा जाता है। इस समय आपके अनुरोध का वास्तव में परिणाम होता है, और आगे की स्थिति होती है। (स्थिति का मतलब है कि आपके वेबसर्वर ने एक स्टेटस कोड 200 = ठीक, 404 = नहीं मिला आदि)

यह AJAX सामान के पीछे जो जादू नहीं है, लेकिन आपको एक सरल अवलोकन देना चाहिए, वास्तव में क्या हो रहा है दृश - य। यह महत्वपूर्ण है कि आप इसे वेबसर्वर पर जांचें, परीक्षण के लिए फ़ाइल: // का उपयोग न करें।

यदि आपको विस्तार से जानकारी की आवश्यकता है, तो बस मुझे बताएं।

+0

मैं उस समारोह पर कभी भी कॉल नहीं देखता जहां readyState = 4 और स्थिति शून्य नहीं है। –

+0

एक समय में एक समस्या। हैंडल में बस एक चेतावनी ("foo") करें, क्या सही ढंग से बुलाया गया अलर्ट है? बस इस पल में स्थिति की परवाह नहीं है। Btw। आप "एसबीएल_PROBES.htm" छोड़ सकते हैं। बस एक "/" डालें और जांचें कि अलर्ट कहलाता है या नहीं। – evildead

+0

ठीक है। मैंने स्थिति पर चेक निकाला, केवल तैयार की जांच की स्थिति == 4. हैंडलस्टेट चेंज में अलर्ट उचित सामग्री के साथ टी दिखाता है। अंत में दूसरी चेतावनी भी बी 4 से नीचे चला गया जो कुछ भी नहीं दिखा रहा है। तो मैं पूरा करने के अनुरोध का इंतजार कैसे करूं? –

3

क्योंकि इसका अनुरोध अनुरोध से पहले एसिंक रिटर्न देता है। अनुरोध रिटर्न के बाद सिंक्रोनस अनुरोध वापस आते हैं।

यहां अपने तर्क को कुशल बनाने का प्रयास करें।

xmlhttp.onreadystatechange=function() 
    { 
    alert ("rdystate: " + xmlhttp.readyState); 
    alert ("status: " + xmlhttp.status); 
    alert ("Text: "  + xmlhttp.statusText); 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
     T = xmlhttp.responseText; 
     alert(T); 
    } 
    } 
+0

डैनियल ए व्हाइट: मैं माफी चाहता मुझे समझ नहीं आता हूँ, हम कभी नहीं वहाँ पाने xmlhttp.status हमेशा होता है क्योंकि शून्य । –

+0

अलर्ट कैप्स है, अलर्ट में बदल गया है। :) – epascarello

8

स्थिति शून्य दो कारणों से होता है।

  1. आप फ़ाइल प्रोटोकॉल को बंद कर रहे हैं।
  2. अजाक्स अनुरोध सक्रिय होने पर कुछ पृष्ठ वापस पोस्ट कर रहा है।

मुझे विश्वास है कि आप यहां # 2 देख रहे हैं। तो आपको बटन क्लिक को रद्द करने की आवश्यकता है।

<button type="button" onclick="loadXMLDoc(); return false;">CHange Content</button> 

कि चेतावनी (टी) के ऊपर अपने कोड में हमेशा कुछ भी नहीं कहेंगे जब अनुरोध अतुल्यकालिक है।

+0

कोई फर्क नहीं पड़ता, स्थिति हमेशा शून्य होती है। –

+0

क्या आप इसे किसी सर्वर से या अपनी हार्ड ड्राइव से चला रहे हैं [उर्फ सी: \ file.html]? यदि यह आपकी कठिनाई है तो आप कभी भी 200 नहीं देखेंगे। – epascarello

+0

+1 "फाइल प्रोटोकॉल" के लिए +1 – James

0

अब मुझे इस आम समस्या के लिए अच्छी प्रतिक्रिया मिली है। प्रतिक्रिया का पालन करें:

वेब के लिए विकास करते समय यह एक बहुत ही आम समस्या है। इसके चार तरीके हैं।

  1. पहला JSONP का उपयोग करना है, जब आप एक क्वेरी पैरामीटर ("? Callback = foo") जोड़ते हैं तो हमारा एपीआई समर्थन करता है। यह आपको उठाना और तुरंत चलना चाहिए और विकास के लिए बहुत अच्छा है, लेकिन यह उत्पादन उपयोग के लिए सुरक्षित नहीं है क्योंकि उपयोगकर्ताओं को आपकी एपीआई कुंजी तक पहुंच प्राप्त होती है।
  2. दूसरा (जो हम पूर्वानुमान पर उपयोग करते हैं, और उत्पादन के लिए सबसे अच्छी विधि है) अपने डोमेन पर प्रॉक्सी सर्वर स्थापित करना है जो उपयोगकर्ता की ओर से पूर्वानुमान के लिए अनुरोध कर सकता है। यह ब्राउज़र की एक ही मूल नीति को छेड़छाड़ करता है, जो उपयोगकर्ताओं को आपकी एपीआई कुंजी (जिसे सर्वर-साइड संग्रहीत किया जा सकता है) तक पहुंचने से रोकता है, और वांछित होने पर आपको अनुरोध कैशिंग का उपयोग करने की अनुमति देता है। (हमारा पसंदीदा वेब सर्वर, nginx, बॉक्स के इस बाहर का समर्थन करता है और कॉन्फ़िगर करने के लिए बहुत आसान है। आप कुछ नमूना विन्यास की जरूरत है, हमें बताएँ!)
1

मैं एक परिणाम नहीं मिल रहा है की समस्या लड़ाई लड़ी गए एसिंक्रोनस XMLHttpRequest खुला कथन का उपयोग करते समय। चूंकि यह प्रश्न Google का उपयोग करते समय पहली बार पाया गया था, यहां मैंने इसे हल किया है:

यदि आप किसी फ़ॉर्म के अंदर मौजूद बटन का उपयोग करते हैं, तो सुनिश्चित करें कि यह टाइप करने के लिए सेट है = "सबमिट करें" और ऑनक्लिक = "वापसी myfunction() "। और मेरे फ़ंक्शन() में, सुनिश्चित करें कि आप झूठी वापसी करते हैं, सत्य नहीं! फ़ंक्शन से सत्य लौटकर, आप पृष्ठ को फिर से लोड करते हैं और एक्सएमएल ऑब्जेक्ट गायब हो जाता है। यदि आप झूठी वापसी करते हैं, तो एक्सएमएल अनुरोध को उस समय को पूरा करने की आवश्यकता होती है जब इसे पूरा करने की आवश्यकता होती है और ऑनरस्टेस्टेन्शन फ़ंक्शन चलाया जाएगा।

स्रोत: Flask Mailing List

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