嗨,我有流畅的代码可以按预期在Firefox中运行,而在IE6中,它可以在第一次运行时正常运行,并且在第二次调用时出现问题并返回旧值
function loadCartItems()
{
var xmlhttp23;
if(xmlhttp23!= 'undefined')
{
xmlhttp23=getXmlHttpObject();
}
xmlhttp23.onreadystatechange=function()
{
if(xmlhttp23.readyState==4)
{
alert(xmlhttp23.responseText);
}
}
xmlhttp23.open("GET","../printerink/ItemsInCart.aspx",true);
xmlhttp23.send(null);
xmlhttp23=null;
}
function getXmlHttpObject()
{
var request = null;
/* Does this browser support the XMLHttpRequest object? */
if (window.XMLHttpRequest) {
if (typeof XMLHttpRequest != 'undefined')
/* Try to create a new XMLHttpRequest object */
try {
request = new XMLHttpRequest( );
} catch (e) {
request = null;
}
/* Does this browser support ActiveX objects? */
} else if (window.ActiveXObject) {
/* Try to create a new ActiveX XMLHTTP object */
try {
request = new ActiveXObject('Msxml2.XMLHTTP');
} catch(e) {
try {
request = new ActiveXObject('Microsoft.XMLHTTP');
} catch (e) {
request = null;
}
}
}
return request;
}
在这里,我将通过使用警报来提醒我在每个地方检查过的结果,每件事都工作正常,但是我只是注意到一个问题,因为我正在使用aspx页在此aspx页中返回结果,所以我设置了调试的断点并发现在第一次加载页面时会触发这些断点,并且如果页面从同一IE6窗口第二次加载时它们不会被触发,还有一个东西就是XMLHTTP,那么所有东西都在工作,例如xmlhttp.readyState为4而xmlhttp.status为200,只有xmlhttp.open似乎没有执行
请帮助
最佳答案
坦白说,我对您的代码感到困惑。我认为需要先澄清一下,然后才能提供帮助。首先,这样做的目的是什么:
function loadCartItems() {
var xmlhttp23;
if(xmlhttp23!= 'undefined') {
xmlhttp23=getXmlHttpObject();
}
...
xmlhttp23=null;
}
我的意思是,根据定义,每当您输入loadCartItems()时,本地变量xmlhttp23始终是未定义的。然后,您测试xmlhttp23!='undefined',但这没有任何意义:xmlhttp23永远不会等于字符串文字'undefined'。
我也不明白xmlhttp23 = null的最后一行:您打算显式清理XMLHttpRequest对象吗?在我看来这并不是真正必要的,因为在loadCartItems()函数完成后,无论如何局部变量xmlhttp23都将超出范围。
查看xmlhttp23的初始化代码,几乎就像您打算只创建一次XMLHttpRequest并想要重用它一样。如果是这样,我认为您的代码应为:
var xmlhttp23;
function loadCartItems() {
if(!xmlhttp23) {
xmlhttp23 = getXmlHttpObject();
}
xmlhttp23.open("GET","../printerink/ItemsInCart.aspx",true);
xmlhttp23.onreadystatechange = function() {
if (xmlhttp23.readyState==4) {
if (xmlhttp23.status==200) { //success
alert(xmlhttp23.responseText);
}
else { //error
alert("Whoops: " + xmlhttp23.statusText);
}
}
}
xmlhttp23.send(null);
}
请注意,必须在调用open()方法之后分配onreadystatechange处理程序。否则,您将无法在IE6中重用Xhr对象。
在此处详细了解为什么:
http://keelypavan.blogspot.com/2006/03/reusing-xmlhttprequest-object-in-ie.html