Hi, I'm a newbie to javascript and I'm also using jQuery 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
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