2012-12-24 26 views
9

में xmlhttprequest ऑब्जेक्ट्स कैसे बनाए जाते हैं, मर्ज किए जाते हैं और नष्ट होते हैं मेरी पृष्ठभूमि पारंपरिक संकलित ऑब्जेक्ट-उन्मुख भाषाओं जैसे सी ++ और .NET प्रोग्रामिंग में है, और अब मैं एक नई परियोजना के लिए जावास्क्रिप्ट के कुछ हद तक डब कर रहा हूं। मैं AJAX के साथ डब रहा था और ब्राउजर द्वारा ऑब्जेक्ट्स को प्रबंधित करने के तरीके के बारे में एक भ्रमित पहलू पर आया था।जावास्क्रिप्ट

  1. बटन पाठ के साथ 1 अद्यतन TextArea1: -

    [# संपादित 2] सक्रिय सामग्री स्क्रिप्ट में बदलें

    मैं तीन बटन जो प्रत्येक अद्यतन एक <textarea>XMLHttpRequest वस्तुओं का उपयोग कर के साथ एक अभ्यास पृष्ठ है की सामग्री slowtime.php

  2. बटन 2 slowtime.php से टेक्स्ट सामग्री के साथ TextArea2 अपडेट करता है
  3. बटन 3 अपडेट fasttime.php

से पाठ सामग्री के साथ TextArea3 कहाँ slowtime.php और fasttime.php सरल स्क्रिप्ट जो दो timestamps के साथ एक पाठ/HTML पृष्ठ वापसी कर रहे हैं: एक जब पृष्ठ लोड होता है, कुछ समय बीत जाने के बाद।

प्रत्येक बटन एक समय में एक क्लिक करते समय सही ढंग से काम करता है। यदि मैं पहले अनुरोध पूरा होने से पहले बटन 2 पर क्लिक करता हूं और फिर बटन 3 पर क्लिक करता हूं, तो अपडेट अभी भी अपेक्षित काम करते हैं।

यदि मैं पहला अनुरोध पूरा करने से पहले बटन 1 पर क्लिक करता हूं और फिर बटन 2 पर क्लिक करता हूं, तो टेक्स्टएरिया 1 और टेक्स्ट एरिया 2 सही मान प्राप्त करता है; हालांकि, onreadystatechange इवेंट कॉल एक ही समय में होते हैं, यानी, पहली बार देर से प्रतिक्रिया होती है और दूसरी बार आने पर संसाधित होती है।

नमूना कोड

वेबसाइट

<!DOCTYPE html> 
<html> 
<head> 
<script> 
function loadXMLDoc(url,target) 
{ 
var xmlhttp; 
xmlhttp=new XMLHttpRequest(); 

xmlhttp.onreadystatechange=function() 
    { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
    document.getElementById(target).value=xmlhttp.responseText; 
    } 
    } 
xmlhttp.open("POST",url,true); 
xmlhttp.send(); 
} 
</script> 
</head> 

<body> 
<form> 

<input type="button" value="Button 1" onClick="loadXMLDoc('slowtime.php','TextArea1')"/> 
<input type="button" value="Button 2" onClick="loadXMLDoc('slowtime.php','TextArea2')"/> 
<input type="button" value="Button 3" onClick="loadXMLDoc('fasttime.php','TextArea3')"/> 

<div><textarea id="TextArea1"></textarea></div> 
<div><textarea id="TextArea2"></textarea></div> 
<div><textarea id="TextArea3"></textarea></div> 

</form> 
</body> 
</html> 

पीएचपी संहिता (slowtime.php)

<?php 
    echo date('h:i:s') . "\n"; 
    sleep(5); 
    echo date('h:i:s') . "\n"; 
?> 

प्रश्न [संशोधित]

ब्राउज़र XMLHttpRequest ऑब्जेक्ट्स का प्रबंधन कैसे करता है? बटन 2 और 3 दबाकर इंगित करता है कि प्रत्येक प्रेस एक नई वस्तु को तुरंत चालू करती है, और इनमें से प्रत्येक में स्वतंत्र ईवेंट हैंडलर होते हैं। यदि ऑब्जेक्ट प्रारंभिक फ़ंक्शन कॉल से पहले रहते हैं (क्योंकि उनके ईवेंट हैंडलर जीवित रहते हैं) जब वे स्मृति/विनाश से साफ़ हो जाते हैं?

यदि XMLHttpRequests अलग-अलग ऑब्जेक्ट्स हैं, तो उसी URL पर दूसरा अनुरोध भेजने से पहले के प्रतिक्रिया समय को प्रभावित किया जाता है? क्या यह एक सर्वर-साइड मुद्दा हो सकता है?

+0

अपने 'xmlhttp.onreadystatechange' फ़ंक्शन में, क्या आप शायद' xmlhttp.responseText' के बजाय 'this.responseText' का उपयोग कर सकते हैं? –

+1

@ JoshuaD.Boyd यह कुछ और नहीं करना चाहिए क्योंकि 'xmlhttp' चर' loadXMLDoc' के अंदर एक स्थानीय दायरे में है। – Tyilo

+0

'onmlstpchange' फ़ंक्शन में 'xmlhttp'' के सभी संदर्भों को बदलकर भी काम करता है, और यह भी व्यवहार करता है – nicholas

उत्तर

2

XMLHttpRequest के संदर्भ को तब तक हटाया नहीं जाता है जब तक कि ऑब्जेक्ट पर डिलीट स्पष्ट रूप से नहीं कहा जाता है। इस मामले में: xmlhttp। यदि आप अपने आवेदन को दुबला और साफ चलाने के लिए चाहते हैं तो आपको वास्तव में उस var को ट्रैक करना चाहिए और इसे साफ़ करना चाहिए। जावास्क्रिप्ट मूल रूप से वेब पृष्ठों के लिए डिज़ाइन किया गया था, इस प्रकार यह चीजों को जंगली चलाने देता है जब तक कि आप इसे स्वयं नहीं रोकते।

अन्यथा, यह संभव है कि ऑब्जेक्ट किसी अन्य फ़ंक्शन द्वारा उपयोग करने योग्य नहीं है या किसी भी शेष कॉल बैक के बाद, ब्राउज़र का कचरा कलेक्टर ऑब्जेक्ट को खत्म कर देगा।

एक साथ होने वाली घटनाओं के साथ आपकी समस्या के लिए, मैं खुद को इस मुद्दे को पुन: उत्पन्न नहीं कर सकता, जो मुझे विश्वास दिलाता है कि आपको अपने PHP कॉन्फ़िगरेशन के साथ कोई समस्या है। क्या यह संभव है कि आपका सर्वर एक साथ कई स्क्रिप्ट चलाने की इजाजत नहीं दे रहा है?

यहाँ मामूली परिवर्तन के एक जोड़े के साथ अपने सर्वर पर आपके उदाहरण है,: http://www.seijinohki.net/test.php

+0

एक अलग परीक्षण सर्वर पर कोड पोस्ट करने के लिए धन्यवाद। जब मैं क्रोम या सफारी में आपकी साइट का परीक्षण करता हूं, तो मुझे रैम्बो के समान परिणाम मिलते हैं, ऊपर - दोनों टेक्स्ट क्षेत्रों को एक ही मूल्य मिलता है। इस बीच, फ़ायरफ़ॉक्स, आईई 9, और रेशम नहीं है। आपका पृष्ठ मैक्सथन मोबाइल ब्राउज़र में बिल्कुल भी काम नहीं करता है। – nicholas

+0

बहुत समय बाद अच्छी तरह से, बीमार इसे उत्तर के रूप में स्वीकार करते हैं क्योंकि यह सीधे संदर्भों के संदर्भ को संबोधित करता है।एक दिलचस्प चर्चा, और कम से कम वर्तमान में दिखाने के लिए चला जाता है कि वेब विकास/ब्राउज़र/आदि अभी भी स्क्रिप्ट निष्पादित करने में वर्दी के अलावा कुछ भी हैं .. – nicholas

1

यह एक ब्राउज़र मुद्दा है।

  • क्रोम 23 & 26 इस तरह से व्यवहार करें।
  • ओपेरा 12 does not को
  • आईई 9 does not को
  • फ़ायरफ़ॉक्स 17 does not को

आप यूआरएल अद्वितीय करते हैं, उदाहरण के लिए slowtime.php?1 और slowtime.php?2 तो Chrome अब इस तरह से व्यवहार करता है।

बीटीडब्ल्यू- मेरे टेस्ट क्रोम में समान पाठों के साथ दोनों टेक्स्टरेस अपडेट होते हैं - पहले अनुरोध से मूल्य। और जब वे पहला अनुरोध पूरा करते हैं तो वे दोनों अपडेट होते हैं, न कि जब दूसरा खत्म होता है। यह निश्चित रूप से एक बग है क्योंकि यह सिर्फ सादा गलत है। मैंने वेबसर्वर लॉग के माध्यम से सत्यापित किया कि दूसरा अनुरोध कभी नहीं भेजा जाता है।

+0

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

+0

@ निकोलस क्या आपका स्थानीय सर्वर लॉग दो अनुरोधों को इंगित करता है? फिर भी, तथ्य यह है कि क्रोम ने केवल मेरे परीक्षण में एक अनुरोध भेजा है जिसमें एक बग इंगित करता है (या एक अजीब विशेषता)। – goat