2009-09-27 8 views
6

मैं एक एक्सएमएल फ़ाइल को पार्स करने के लिए jQuery का उपयोग कर रहा हूं, और मैं प्रत्येक तत्व को XML फ़ाइल में एक jQuery .each loop का उपयोग करके सरणी में धक्का देने की कोशिश कर रहा हूं। आश्चर्यजनक रूप से, अगर मैं लूप के भीतर सरणी के मान को सतर्क करता हूं तो यह बाहर आता है, लेकिन अगर मैं लूप समाप्त होने के बाद सरणी में मान को अलर्ट करने का प्रयास करता हूं तो इसका परिणाम "अपरिभाषित" होता है।एक jQuery के भीतर एक ऐरे को धक्का देना प्रत्येक लूप

क्या कोई अजीब ऐसा होता है जब आप इस तरह के लूप के भीतर किसी सरणी को मानते हैं?


यहाँ जावास्क्रिप्ट है:

<?xml version="1.0" encoding="UTF-8"?> 
<site>  
    <image src="splash1.jpg" /> 
    <image src="splash2.jpg" /> 
    <image src="splash3.jpg" /> 
    <image src="splash4.jpg" /> 
    <image src="splash5.jpg" /> 
    <image src="splash6.png" /> 
</site> 

उत्तर

10

सही संस्करण:

var splashArray = new Array(); 

// Load the Splash XML file and assign each image within to an array 
$.get('splash.xml', function(xml) { 
     $('image', xml).each(function (i) { 
       splashArray.push($(this).attr("src")); 
     }); 
     alert(splashArray[1]); 
}); 
var splashArray = new Array(); 

// Load the Splash XML file and assign each image within to an array 
$.get('splash.xml', function(xml) { 
    $('image', xml).each(function (i) { 
     splashArray.push($(this).attr("src")); 
    }); 
}); 

alert(splashArray[1]); // Results in undefined 



यहाँ एक्सएमएल हैकोड अलर्ट के आपके संस्करण में (splashArray [1]); AJAX को xml परिणाम प्राप्त करने से पहले निष्पादित करता है, इसलिए splashArray खाली था, जब आप अनुक्रमणिका 1 के साथ तत्व को अलर्ट करने का प्रयास करते हैं। आपका कोड केवल सिंक्रोनस मोड के लिए काम करता है, जब थ्रेड सर्वर प्रतिक्रिया के लिए प्रतीक्षा करता है। असीमित मोड में आपको कॉलबैक फ़ंक्शन का उपयोग करना चाहिए। कॉलबैक साथ

संस्करण:

var splashArray = new Array(); 

// Load the Splash XML file and assign each image within to an array 
$.get('splash.xml', function(xml) { 
     $('image', xml).each(function (i) { 
       splashArray.push($(this).attr("src")); 
     }); 
     work_with_splash(); 
}); 

function work_with_splash() { 
    alert(splashArray[1]); 
} 

या एक और पैटर्न (स्यूडोकोड):

function process(ajax_is_done) { 
    if (!ajax_is_done) { 
     ajax(function (result) { 
      import_result(result); 
      process(true); 
     }) 
    } 
} 
process(); 
+0

फिर भी यहां अपरिभाषित परिणाम .. – jakeisonline

+0

मेरे लिए यह अलर्ट splash2.jpg – Anatoliy

+0

हां, आपका कोड सही ढंग से $ .get ब्लॉक के अंदर एक सरणी पुनर्प्राप्त करेगा, लेकिन इसे $ .get के बाहर क्यों नहीं निकाला जाएगा ब्लॉक। शायद मैं स्पष्ट नहीं था। मेरी समस्या को चेतावनी() को काम करने के लिए नहीं मिल रहा है, यह बाद के कोड के लिए सरणी मान पुनर्प्राप्त करने योग्य बना रहा है। – cmal

2

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

काम करता है:

var splashArray = []; 

function fn() { 
    alert(splashArray[1]); 
} 

$.get('splash.xml', function(xml) { 
     $('image', xml).each(function (i) { 
       splashArray.push($(this).attr("src")); 
     }); 
     fn(); 
}); 

काम नहीं करता:

var splashArray = []; 

$.get('splash.xml', function(xml) { 
     $('image', xml).each(function (i) { 
       splashArray.push($(this).attr("src")); 
     }); 
     // this will populate the array almost always AFTER the alert below. 
}); 


alert(splashArray[1]); // this will almost ALWAYS alert BEFORE the callback function is done 
+0

वास्तव में दोनों विधियां ठीक काम करने लगती थीं, इसलिए डेटा टाइप बिट वास्तव में कोई फर्क नहीं पड़ता। क्या आप वाकई सही xml फ़ाइल पथ हैं? हो सकता है कि आपको रूट रिश्तेदार की आवश्यकता हो जैसे '/xml/splash.xml'? यह देखने के लिए कि क्या आप सही यूआरआई का अनुरोध कर रहे हैं, फायरबग नेट टैब आज़माएं। –

+0

यह लगभग काम करता है, लेकिन आप अभी भी splashArray को कॉल नहीं कर सकते हैं।AJAX फ़ंक्शन, यह अपरिभाषित में परिणाम। – jakeisonline

+0

मैंने सोचा था कि आप "समाधान पर काम कर रहे थे"? और मैंने इसे कॉलबैक के बाहर चेतावनी नहीं दी, मैंने इसे कॉलबैक के अंदर चेतावनी दी, इसलिए यह काम करता है और मैंने इसका परीक्षण किया है। –

0

आप एक मानक कॉलबैक का उपयोग नहीं करना चाहते हैं, तो अन्य विकल्प के लिए एक jQuery घटना को ट्रिगर करने के लिए है।

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