views:

2774

answers:

4

Hi, i'm trying to get this function to work, which does a request for parameter 'url' then sends the responseText to 'callback' which is a function. But it seems that it only gets to readyState 1 (thanks to the firebug commands).

Here it is:

function Request(url, callback){
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
} else{
 return false;
}
httpRequest.onreadystatechange = function(){
 console.log(httpRequest.readyState);
    if (httpRequest.readyState == 4) {
  callback(httpRequest.responseText);
 }
};
console.log(httpRequest, url);
httpRequest.open('GET', url, true);
httpRequest.send(null);
}
+1  A: 

Possibly the Ajax request doesn't return data (so, a server side error of some kind). Try enabling the option 'show XMLHttpRequests' in the firebug console, to check for this.

KooiInc
Well it's already on and I log the http object and inspecting it gives me readyState 4, but the event is not being called. Also the page returns data properly
kennyisaheadbanger
oh! it works in safari but not firefox! that's very strange
kennyisaheadbanger
Tried logging my own xmlHTTP lib function in FF, no problem. In my case I use => if (httpRequest.readyState < 4) {console.log(...);} else {[exec the callback]}.
KooiInc
Furthermore: my readystatechange handler is defined *after* the send method is called.
KooiInc
+1  A: 

Check that the URL in question does actually respond by visiting it directly in the browser.

Test with a different browser do you get the same result.

Use some form of HTTP monitor to watch the client to server conversation (my favorite is Fiddler)

AnthonyWJones
A: 

I workarounded this problem assigning onload event instead of onreadystatechange:

function Request(url, callback){
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
} else{
        return false;
}

var readyStateChange = function(){
    console.log(httpRequest.readyState);

    if (httpRequest.readyState == 4) {
                callback(httpRequest.responseText);
    }
};


if (isFirefox && firefoxVersion > 3) {
    httpRequest.onload = readyStateChange;
} else {
    httpRequest.onreadystateshange = readyStateChange;
}

console.log(httpRequest, url);
httpRequest.open('GET', url, true);
httpRequest.send(null);
}
Svitlana Maksymchuk
A: 

I also faced the same issue. By reading the url below, I got mine solved.

http://bytes.com/topic/javascript/answers/548442-ajax-readystate-1-wall

basically, when I assign my function as the event listener for httpRequest.onreadystatechange, I cannot pass any variable to it. SO that I have to embed the variable inside the HTTP POST string to the server backend then get it back from the HTTP response.

It works fine for FF 3. No need to use jQuery.