क्लाइंट अनुरोध सर्वर से वेब पेज। तब क्लेंट को अतिरिक्त गणना करने के लिए अनुरोध किया जाता है; सर्वर गणना की श्रृंखला करता है और जैसे ही वे उपलब्ध होते हैं आंशिक परिणाम भेजता है (टेक्स्ट प्रारूप, प्रत्येक पंक्ति में अलग-अलग पूर्ण आइटम होता है)। सर्वर द्वारा प्रदान की गई जानकारी का उपयोग कर ग्राहक अद्यतन वेब पेज (जावास्क्रिप्ट और डीओएम के साथ)।"HTTP स्ट्रीमिंग" (पुश) का क्रॉस-ब्राउज़र कार्यान्वयन AJAX पैटर्न
यह अजाक्सपर्टर्न साइट से HTTP Streaming (current संस्करण) पैटर्न फिट लगता है।
प्रश्न यह है कि क्रॉस-ब्राउज़र (ब्राउज़र अज्ञेयवादी) तरीके से इसे कैसे करें, अधिमानतः जावास्क्रिप्ट ढांचे का उपयोग किए बिना, या jQuery जैसे कुछ हल्के ढांचे का उपयोग करना।
समस्या क्रॉस-ब्राउज़र फैशन में XMLHttpRequest उत्पन्न करने के साथ शुरू होती है, लेकिन मुझे लगता है कि मुख्य आइटम यह है कि सभी ब्राउज़र सही ढंग से लागू नहीं होते onreadystatechange
XMLHttpRequest से; प्रत्येक ब्राउजर पर onreadystatechange
ईवेंट प्रत्येक सर्वर फ्लश पर नहीं है (बीटीडब्ल्यू। सीजीआई स्क्रिप्ट (पर्ल में) से सर्वर फ्लश को कैसे मजबूर करना है?)। अजैक्सपर्टर्न पर उदाहरण कोड टाइमर का उपयोग करके इसके साथ सौदा करता है; अगर मुझे onreadystatechange
से आंशिक प्रतिक्रिया का पता लगाना है तो क्या मुझे टाइमर समाधान छोड़ना चाहिए?
जोड़ा 11-08-2009
वर्तमान समाधान:
मैं निम्नलिखित समारोह का उपयोग XMLHttpRequest वस्तु बनाने के लिए:
function createRequestObject() {
var ro;
if (window.XMLHttpRequest) {
ro = new XMLHttpRequest();
} else {
ro = new ActiveXObject("Microsoft.XMLHTTP");
}
if (!ro)
debug("Couldn't start XMLHttpRequest object");
return ro;
}
अगर मैं उपयोग करने के लिए थे कुछ (अधिमानतः हल्के वजन) jQuery की तरह जावास्क्रिप्ट ढांचे, मैं उपयोगकर्ता अगर फॉलबैक करना चाहते हैं jQuery स्थापित करने के लिए चुनता है।
मैं AJAX शुरू करने के लिए निम्न कोड का उपयोग करता हूं; setInterval
का उपयोग किया जाता है क्योंकि कुछ ब्राउज़र सर्वर को कनेक्शन बंद करने के बाद onreadystatechange
पर कॉल करते हैं (जो सेकंड के दस मिनट तक ले सकता है), और जैसे ही सर्वर डेटा फ्लश करता है (हर दूसरे या अधिक बार)।
function startProcess(dataUrl) {
http = createRequestObject();
http.open('get', dataUrl);
http.onreadystatechange = handleResponse;
http.send(null);
pollTimer = setInterval(handleResponse, 1000);
}
handleResponse
समारोह सबसे जटिल से एक है, लेकिन इसके बारे में संक्षिप्त वर्णन निम्नलिखित की तरह दिखता है। क्या यह बेहतर किया जा सकता है? कुछ हल्के जावास्क्रिप्ट ढांचे (जैसे jQuery) का उपयोग करके यह कैसे किया जाएगा?
function handleResponse() {
if (http.readyState != 4 && http.readyState != 3)
return;
if (http.readyState == 3 && http.status != 200)
return;
if (http.readyState == 4 && http.status != 200) {
clearInterval(pollTimer);
inProgress = false;
}
// In konqueror http.responseText is sometimes null here...
if (http.responseText === null)
return;
while (prevDataLength != http.responseText.length) {
if (http.readyState == 4 && prevDataLength == http.responseText.length)
break;
prevDataLength = http.responseText.length;
var response = http.responseText.substring(nextLine);
var lines = response.split('\n');
nextLine = nextLine + response.lastIndexOf('\n') + 1;
if (response[response.length-1] != '\n')
lines.pop();
for (var i = 0; i < lines.length; i++) {
// ...
}
}
if (http.readyState == 4 && prevDataLength == http.responseText.length)
clearInterval(pollTimer);
inProgress = false;
}
आपको निश्चित रूप से उस कोड उदाहरण को उत्तर के रूप में जोड़ना चाहिए और इसे सही के रूप में चिह्नित करना चाहिए! –
"यदि उपयोगकर्ता jQuery स्थापित नहीं करना चुनता है"? – Basic
हाय, बस आपके समाधान में आया, लेकिन मुझे डर है कि यह अभी भी आईई के साथ काम नहीं करेगा, क्योंकि जब आप प्रतिक्रिया प्राप्त करने का प्रयास करेंगे तब अनुरोध अभी भी समाप्त नहीं हुआ था, तो आपको निम्नलिखित मिलेंगे संदेश: "इस ऑपरेशन को पूरा करने के लिए आवश्यक डेटा अभी तक उपलब्ध नहीं है"। –