Hi, I'm another newbie to jQuery and also not that experienced in JavaScript so I'm not sure if my issue is jQuery or JavaScript.
The issue is that I'm creating a constructor for an object, in which I initialise some instance properties, then kick off an asynchronous $.ajax event to retrieve an XML file. The callback method of the .ajax object is bound to a prototype method of the same object as the constructor. My problem is that when the ajax call is complete and the callback method is called, it appears that the callback method cannot see any of the 'this'.properties that were initialized in the constructor. I'm beginning to think that the asynchronous nature of the ajax object has actually created a new instance of my object in which no constructor was called and therefore is not working against the original instance I created. But then again I always look for the most obscure explanation instead of noticing the simple error I've made. I've included the code below. If anyone can show me the errors of my ways, I'd be very grateful. The line causing me a problem is commented with // THIS LINE FAILS WITH AN "this.woffers has no properties" ERROR ================================================================ // Use jQuery 'document.ready' selector to define the function to call when page is ready. $(main); ////////////////////////////////////////////////////////////////////////////// // The main entry function hopefully called by the jQuery 'ready' selector ////////////////////////////////////////////////////////////////////////////// function main() { try { //create a new 'Woffers' instance var woffers = new Woffers("woffersdata.xml", "xml"); } // Catch any exceptions... catch(e) { // ...and report them. TODO: remove this for live alert(e); } } ////////////////////////////////////////////////////////////////////////////// // Constructor for a 'Woffers' class which will contain all our 'Woffer' items // and some methods to retrieve them. // // Expects: // sourceURL - a String containing the location of the file containing the // data to be used to construct our object. // sourceType - a String containing the type of file we are using to // construct the object. Can be "xml" or "json" ////////////////////////////////////////////////////////////////////////////// function Woffers(sourceURL, sourceType) { if(sourceType != "xml") { throw new Error("Invalid source type (" + sourceType + ") supplied to Woffers constructor."); } // Store parameters for later use by any method this.sourceURL = sourceURL; this.sourceType = sourceType; // Create a property to hold a list of Woffer objects this.woffers = new Array(); // <-- This property should get populated by the $.ajax callback method switch(this.sourceType) { case "xml": { $.ajax( { type: "POST", // type of http request url: this.sourceURL, // where to get file from dataType: "xml", // type of file to retrieve complete: this.parseXML // Function to run on completion which will populate this.woffers } ) break; } // End case(xml) case "json": { $.ajax( { type: "POST", // type of http request url: this.sourceURL, // where to get file from dataType: "json", // type of file to retrieve complete: this.parseJson // Function to run on completion } ) break; } // End case(json) } } // End Woffers constructor ////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////// Woffers.prototype.parseXML = function(woffersDOM, resultStatus) { if(resultStatus != "success") { throw new Error("Encountered a problem retreiving the XML file." + " Reported status is " + ResultStatus + "."); } // retrieve a list of woffers from the response var retrievedWoffers = woffersDOM.responseXML.documentElement.getElementsByTagName("route"); // Go through each woffer and use it to create a new 'Woffer' object for(var index = 0; index < retrievedWoffers.length; ++index) { // // THIS LINE FAILS WITH AN "this.woffers has no properties" ERROR // // Create a new woffer and add it to 'this.woffers' this.woffers.push(new Object()); } } Any feedback, much appreciated Regards, Glenn