2012-02-07 4 views
94

मैं एक्सएचआर रिटर्न इवेंट के बारे में उलझन में हूं, जैसा कि मैं कह सकता हूं, ऑनरस्टेटेन्चेंज के बीच इतना अलग नहीं है -> readyState == 4 और ऑनलोड, क्या यह सच है?क्या एक्सएमएलएचटीपीआरक्वेट में तैयार स्टेट == 4 के बराबर ऑनलोड है?

var xhr = new XMLHttpRequest(); 
xhr.open("Get", url, false); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState === 4) 
    { 
     /* do some thing*/ 
    } 
}; 

xhr.send(null); 

या

xhr.onload = function() { /* do something */ } 
+3

किसी को भी एक उदाहरण टिप्पणी है कि यह async = false (xhr.open 3 तर्क) उपयोग कर रहा है के रूप में इस पर देख रहा है, तो - जो आम तौर पर नहीं है कि आप क्या चाहते चाहते हैं। – eddiewould

उत्तर

54

यह एक ही बात होनी चाहिए। onload XMLHttpRequest 2 में जोड़ा गया था जबकि onreadystatechange मूल कल्पना के बाद से आसपास रहा है।

+0

लगता है कि मोबाइल सफारी ऑनलोड का उपयोग करते समय वापस नहीं आती है। हालांकि, पहले से ही काम करता है। –

+1

अब XHR 1 और XHR 2 के बीच कोई वास्तविक स्पष्ट अलगाव नहीं है, वे एक मानक में विलय हो गए हैं। एक्सएचआर 2 का प्रतिनिधित्व करने वाली सबसे आम विशेषता सीओआरएस समर्थन है, इसलिए उस दृष्टिकोण से एक्सएचआर 2 आईई 10 तक आईई में नहीं दिखाई दिया था, लेकिन एक्सएचआर.ऑलोड को आईई 9 में समर्थित किया गया था, जिसे आमतौर पर एक्सएचआर 1. – Chase

122

यह लगभग हमेशा सत्य है। हालांकि, एक महत्वपूर्ण अंतर यह है कि ऑनरस्टेस्टेन्डेशन इवेंट हैंडलर उन मामलों में तैयार स्तर == 4 के साथ ट्रिगर हो जाता है जहां पर आतंकवादी हैंडलर आमतौर पर ट्रिगर होता है (आमतौर पर नेटवर्क कनेक्टिविटी समस्या)। इस मामले में 0 की स्थिति मिलती है। मैंने सत्यापित किया है कि यह नवीनतम क्रोम, फ़ायरफ़ॉक्स और आईई पर होता है।

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

यहां Plunker test program का एक लिंक है, मैंने लिखा है कि आप विभिन्न यूआरएल का परीक्षण करने और देखने को देखते हैं विभिन्न मामलों में जावास्क्रिप्ट ऐप द्वारा देखी गई घटनाओं और तैयार स्टेटस मानों का वास्तविक अनुक्रम। जे एस कोड भी नीचे सूचीबद्ध है:

var xhr; 
 
function test(url) { 
 
    xhr = new XMLHttpRequest(); 
 
    xhr.addEventListener("readystatechange", function() { log(xhr, "readystatechange") }); 
 
    xhr.addEventListener("loadstart", function(ev) { log(xhr, "loadstart", ev.loaded + " of " + ev.total) }); 
 
    xhr.addEventListener("progress", function(ev) { log(xhr, "progress", ev.loaded + " of " + ev.total) }); 
 
    xhr.addEventListener("abort", function() { log(xhr, "abort") }); 
 
    xhr.addEventListener("error", function() { log(xhr, "error") }); 
 
    xhr.addEventListener("load", function() { log(xhr, "load") }); 
 
    xhr.addEventListener("timeout", function(ev) { log(xhr, "timeout", ev.loaded + " of " + ev.total) }); 
 
    xhr.addEventListener("loadend", function(ev) { log(xhr, "loadend", ev.loaded + " of " + ev.total) }); 
 
    xhr.open("GET", url); 
 
    xhr.send(); 
 
} 
 

 
function clearLog() { 
 
    document.getElementById('log').innerHTML = ''; 
 
} 
 

 
function logText(msg) { 
 
    document.getElementById('log').innerHTML += msg + "<br/>"; 
 
} 
 

 
function log(xhr, evType, info) { 
 
    var evInfo = evType; 
 
    if (info) 
 
     evInfo += " - " + info ; 
 
    evInfo += " - readyState: " + xhr.readyState + ", status: " + xhr.status; 
 
    logText(evInfo); 
 
} 
 

 
function selected(radio) { 
 
    document.getElementById('url').value = radio.value; 
 
} 
 

 
function testUrl() { 
 
    clearLog(); 
 
    var url = document.getElementById('url').value; 
 
    if (!url) 
 
     logText("Please select or type a URL"); 
 
    else { 
 
     logText("++ Testing URL: " + url); 
 
     test(url); 
 
    } 
 
} 
 

 
function abort() { 
 
    xhr.abort(); 
 
}

+4

माना जाता है। उत्तर :) विवरण के लिए धन्यवाद –

+2

@Fernando 'अधिभार' के अंदर, स्पष्ट करने के लिए, 'readyState === 4' सही होने की गारंटी है? – sam

+4

@ सैम हां, ऐसा लगता है कि यह हमेशा मामला है, हालांकि विपरीत स्पष्ट रूप से सत्य नहीं है, क्योंकि 'readyState'' त्रुटि 'या 'abort' मामलों पर भी 4 हो सकता है। इस स्थिति का मूल रूप से मतलब है कि लोड प्रक्रिया समाप्त हो गई है, चाहे सफलतापूर्वक हो या नहीं। सामान्य, सफल लोड के लिए, घटनाओं का अंतिम अनुक्रम है: 'प्रगति' (सभी डेटा लोड किए गए) के साथ, 'readystatechange' (' readyState == 4'), 'load',' loadend' के साथ। –

1

नहीं, वे ही नहीं हैं। यदि आपको नेटवर्क त्रुटि आती है या ऑपरेशन को रोकती है, तो onload नहीं कहा जाएगा। असल में, readyState === 4 पर सबसे नज़दीकी घटना loadend होगी। प्रवाह इस तरह दिखता है:

 onreadystatechange 
     readyState === 4 
      ⇓ 
onload/onerror/onabort 
      ⇓ 
     onloadend 
संबंधित मुद्दे