在IE6和IE7上正确运行AJAX的问题

时间:2009-08-04 14:49:41

标签: ajax internet-explorer

我有这个代码,它可以在FireFox,chrome和IE8中正常工作,但它不适用于IE6和IE7。

function GetXmlHttpObject() {
  //var xmlHttp = null;
  try {
    xmlHttp = new XMLHttpRequest();
  } catch (e) {
    try {
      xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
  return xmlHttp;
}

function login()
{
    alert("Entered Login()");   
    var url="http://server.com/ALUauth.php";
    xmlhttp.onreadystatechange=statechangedLogin;
    xmlhttp.open("GET", url, true);
    xmlhttp.send(null);
}

function statechangedLogin()
{
    if(xmlhttp.readyState==4)
    {
        alert("Entered State Changed Login");
        if (xmlhttp.responseText=="Please <a href=http://server.com/ALUauth.php?login>login</a>")
        {
            document.getElementById("ALUauth").innerHTML=xmlhttp.responseText;
        }
        else
        {
            GetEmailId();
        }

    }
}

function GetEmailId()
{   
    alert("Entered GetEmailId()");
    var url="http://server.com/GetPostEmail.php";
    url=url+"&sid="+Math.random();
    xmlhttp.onreadystatechange=statechangedLogin2;
    xmlhttp.open("GET", url, true);
    xmlhttp.send(null);
}

function statechangedLogin2()
{ 
    if(xmlhttp.readyState==4)
    {
        alert("Enter State Changed Login 2");
        if(xmlhttp.responseText=="Login again")
        {
                window.location="http://server.com/profile.html";
        }
    }
}

当我在除IE6和7之外的任何其他浏览器中运行代码时,输​​出显示从以下开始的所有警告框:   - 进入登录()   - 输入状态更改登录   - 输入GetEmailId()   - 输入State Changed Login 2

然后窗口位置变为http://server.com/profile.html

但是当我在IE 6或7上运行相同的东西时,代码不会进入statechangedLogin2(),所以我在这里发出的警告是:

  • 已输入登录()
  • 已输入状态已更改登录
  • 已输入GetEmailId()

我无法弄清楚为什么会出现这个问题。为什么会这样,我应该改变什么?该项目在其他浏览器上运行得非常好,包括IE8。

有人能帮我解决这个问题。

2 个答案:

答案 0 :(得分:2)

很难读取您的代码,因为它没有格式化,但我认为您的问题是您将xmlhttp转换为全局变量而不是传递它(我认为......)。

尝试将xmlhttp.onreadystatechange更改为

xmlhttp.onreadystatechange = function() { statechangedLogin(xmlhttp); };

xmlhttp.onreadystatechange = function() { statechangedLogin2(xmlhttp); };

然后更改statechangedLogin和Login2的函数以接受参数

function statechangedLogin(xmlhttp) {
  // ... code here
}

问题可能是您在xmlhttp变量完成之前意外覆盖当前请求,这可能导致这些事件无法触发。通过使xmlhttp成为每个函数的局部变量,您可以多次调用这些函数,它们不会相互覆盖或停止。

答案 1 :(得分:1)

您好我很抱歉再次发布我的问题。但我没有得到任何解决方案所以我试图这样做。你对此感到抱歉。

无论如何,我能够在老板的帮助下解决问题。

我所做的就是给GetEmailId函数提供自己的会话。像这样的东西:

function GetEmailId()   
 { 
 alert("Entered GetEmailId()"); 
 xmlhttpTwo=GetXmlHttpObject();
 var url="http://server.com/GetPostEmail.php";
 url=url+"&sid="+Math.random();
 xmlhttpTwo.onreadystatechange=statechangedLogin2;
 xmlhttpTwo.open("GET", url, true);
 xmlhttpTwo.send(null);
 }

我试过这个,它在IE 6 n 7上完全正常......:)

最佳Zeeshan