471,066 Members | 1,227 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,066 software developers and data experts.

Consecutive requests with XMLHttpRequest under IE

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
4 2174


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
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


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
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.

Similar topics

2 posts views Thread by Christopher Benson-Manica | last post: by
2 posts views Thread by dmagliola | last post: by
1 post views Thread by geevaa | last post: by
7 posts views Thread by Brent | last post: by
reply views Thread by leo001 | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.