By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
424,853 Members | 995 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 424,853 IT Pros & Developers. It's quick & easy.

Consecutive requests with XMLHttpRequest under IE

P: n/a
Hi,

I wrote a class to handle requests from the client-side. In particular,
I use :

fuction myClass() {
// ...
this.xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
// ...
}

In the first implementation of this class, I only instantiated
this.xhr_object (as shown above) once, when a "myClass" object was
created. But then, it happened that I couldn't perform more than one
request with this object : from the second request, the function
onreadystatechange would never be called (I made many tests to be sure
of that).

So I changed my class and now I create a new object (with
this.xhr_object = new ActiveXObject("Microsoft.XMLHTTP");) every time a
request is made. And it works.

So my question is :
Is this behavior normal or have I miss something ?

(In fact, my class is a wrapper for IE and Firefox and under Firefox
this problem doesn't exist : Once you have your HTMLHttpRequest object,
you can make as many requests as you want.)
Thank you all for your (future) answers !

Jul 23 '05 #1
Share this Question
Share on Google+
4 Replies


P: n/a


Robloche wrote:

I wrote a class to handle requests from the client-side. In particular,
I use :

fuction myClass() {
// ...
this.xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
// ...
}

In the first implementation of this class, I only instantiated
this.xhr_object (as shown above) once, when a "myClass" object was
created. But then, it happened that I couldn't perform more than one
request with this object : from the second request, the function
onreadystatechange would never be called (I made many tests to be sure
of that).


No problem here with IE 6 and the following:

var httpRequest = new ActiveXObject('Microsoft.XMLHTTP');

for (var i = 0; i < 2; i++) {
httpRequest.open('GET', location.href, true);
httpRequest.onreadystatechange = function () {
if (httpRequest.readyState == 4) {
alert(httpRequest.responseText);
};
};
httpRequest.send(null);
}

the alert shows up twice.

I suspect you set the onreadystatechange handler only once but do
several open/send calls then, I think that is a problem with older
versions of MSXML. So it shouldn't be necessary to create a new object
each time you want to make a request but to ensure that after each open
call the onreadystatechange handler is set.
--

Martin Honnen
http://JavaScript.FAQTs.com/
Jul 23 '05 #2

P: n/a
First of all, thank you very much for your answer.
I tried your little piece of code and, of course, it worked.
But as soon as I put it in a class, the bug occurs. Here's my code :

function CreateXMLHTTPRequestObject() {
this.xhr_object = new ActiveXObject("Microsoft.XMLHTTP");

this.doRequest = function(url) {
//this.xhr_object = new ActiveXObject("Microsoft.XMLHTTP");

var obj = this;
this.xhr_object.onreadystatechange = function() {
alert("onreadystatechange\nreadyState :
"+obj.xhr_object.readyState);
if(obj.xhr_object.readyState == 4)
alert(obj.xhr_object.responseText);
}

this.xhr_object.open('GET', url, true);
this.xhr_object.send(null);
}
}

var req = new CreateXMLHTTPRequestObject();
req.doRequest(location.href);
req.doRequest(location.href);

As it is, only the first request succeeds. In the second one, the first
alert in the onreadystatechange function never shows up...

But if I uncomment the first line of the function doRequest(url), then
the two requests succeed and all the alerts show up.
What's wrong with my class ?

Jul 23 '05 #3

P: n/a


Robloche wrote:

But as soon as I put it in a class, the bug occurs. Here's my code :

function CreateXMLHTTPRequestObject() {
this.xhr_object = new ActiveXObject("Microsoft.XMLHTTP");

this.doRequest = function(url) {
//this.xhr_object = new ActiveXObject("Microsoft.XMLHTTP");

var obj = this;
this.xhr_object.onreadystatechange = function() {
alert("onreadystatechange\nreadyState :
"+obj.xhr_object.readyState);
if(obj.xhr_object.readyState == 4)
alert(obj.xhr_object.responseText);
}

this.xhr_object.open('GET', url, true);
this.xhr_object.send(null);


I would change the order as follows (first open(), then setting
onreadystatechange, then send()):

this.xhr_object.open('GET', url, true);

var obj = this;
this.xhr_object.onreadystatechange = function() {
alert("onreadystatechange\nreadyState : "+obj.xhr_object.readyState);
if(obj.xhr_object.readyState == 4)
alert(obj.xhr_object.responseText);
}

this.xhr_object.send(null);
Then it works here for me with IE 6 for both requests.
--

Martin Honnen
http://JavaScript.FAQTs.com/
Jul 23 '05 #4

P: n/a
Thank you !!!
It was so simple... I feel kind of dumb... :o/

But why does it work only once when the onreadystatechange is set
before opening ?
I went through many web pages that deal with this and I found either
this order or the other one.
Anyway, you saved me hours of debugging, so thanks again !

Jul 23 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.