Why isn't IE displaying this alert()?
I have the following piece of code:
// setup the AJAX request
var pageRequest = false;
if(window.XMLHttpRequest) pageRequest = new XMLHttpRequest();
else if(window.ActiveXObject) pageRequest = new ActiveXObject("Microsoft.XMLHTTP");
// callback
pageRequest.onreadystatechange = function() {
alert('pageRequest.readyState: ' + pageRequest.readyState
+ '\npageRequest.status: ' + pageRequest.status);
}
pageRequest.open('POST','ajax.php',true);
// q_str contains something like 'data=value...'
pageRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
pageRequest.setRequestHeader("Content-length", q_str.length);
pageRequest.setRequestHeader("Connection", "close");
pageRequest.send(q_str);
This works fine in Chrome, but IE chokes on it, spitting out an "Unspecified error." and it points to the line with the alert() in it. Why can't it display the alert?
Edit: Okay, after I dismiss the error dialog,开发者_开发知识库 I get the three alerts as expected....
Edit: Now it's really getting weird. If I change
alert('pageRequest.readyState: ' + pageRequest.readyState
+ '\npageRequest.status: ' + pageRequest.status);
to
alert('pageRequest.readyState: ' + pageRequest.readyState);
then it works and I get 5 alerts. (1,1,2,3,4)
Status is the HTTP response the first two times the method is called you get back 1 and 1 as the readyState. readyState 1 means "The object has been created, but the send method has not been called.". At that time there is no status response from the server as it has not received any requests therefore using status in your alert gave you an error.
Chrome 4 raises an error too (INVALID_STATE_ERR: DOM Exception 11). You'll see the error if you open the Chrome Javascript Console.
Firefox 3.6 also raises an error, but seems to silently discard it (it's not visible in the Error Console). If you wrap the function in a try..catch
block you will see the error message (Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE)):
pageRequest.onreadystatechange = function() {
try {
alert('pageRequest.readyState: ' + pageRequest.readyState
+ '\npageRequest.status: ' + pageRequest.status);
}
catch (e) {
alert(e);
}
}
The first two times onreadystatechange
is invoked in Internet Explorer, readyState
is 1 (OPENED). In this state, the request is being sent, but the response has not yet been received. The error is raised when calling the status
property in this readyState
because there is no HTTP response to read the status from.
This behaviour is compatible with old versions of the W3C XMLHttpRequest specification, which state:
If the
status
attribute is not available it MUST raise an exception. It MUST be available whenreadyState
is 3 (Receiving) or 4 (Loaded). When available, it MUST represent the HTTP status code (typically 200 for a successful connection).Exceptions on retrieval
DOMException
INVALID_STATE_ERR
SHOULD be raised if this attribute is accessed when readyState has an inappropriate value.
Newer versions of the specification, however, state that status
must always return a value:
The
status
attribute must return the result of running these steps:
- If the state is UNSENT or OPENED return 0 and terminate these steps.
- If the error flag is true return 0 and terminate these steps.
- Return the HTTP status code.
I think you have a string concatenation problem, when evaluating PageRequest.status (which is an integer). Just try this:
status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);
精彩评论