2012-03-09 39 views
0

下面的脚本执行,并在Safari,Chrome和Firefox的正常工作失败。不幸的是IE8是我的目标浏览器之一,所以这是一个问题。由于我对Ajax没有太多的经验,我不确定从哪里开始寻找。阿贾克斯脚本IE8

我注意到,IE报告第15行(标有**)的错误,并没有真正意义的if-else语句应该连看该行停止。

function getNames(str) { 
    var xmlhttp; 
    // Clear previous queries 
    if(str.length == 0){ 
     document.getElementById("txtHint").innerHTML = ""; 
     return; 
     // Due to the high number of possible hits we'll demand 3 chars 
     // before we start querying. 
    }else if(str.length < 3){ 
     return ; 
    } 
    if (window.XMLHttpRequest){ // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp = new XMLHttpRequest(); 
    }else{ // code for IE6, IE5 
     **xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");** 
    } 
    xmlhttp.onreadystatechange = function(){   
     if(xmlhttp.status == 200 && xmlhttp.readyState == 4){ 
      // String from get_names.php is comma separated 
      var arr = xmlhttp.responseText.split(","); 
      // The UL list we want our names in 
      var ul = document.getElementById("names"); 

      // Clear the list for each key in 
      if(ul.hasChildNodes()){ 
       while(ul.childNodes.length >= 1){ 
        ul.removeChild(ul.firstChild); 
       } 
      } 
      // Step trough the String in Array form 
      for(var i = 0; i < arr.length; i++){ 
       // :@ means that we've reached the end of applicable names. 
       if (arr[i] != ":@") { 
        var li = document.createElement("li"); 
        li.innerHTML = newListItem = arr[i]; 
        // Inserts the current name into the list. 
        ul.insertBefore(li, ul.getElementsByTagName("li")[0]); 
       } 
      } 
     } 
    } 
    xmlhttp.open("GET", "./ext/get_names.php?q=" + str, true); 
    xmlhttp.send(); 
} 
+0

股票答案:你有没有考虑过使用像jQuery这样的框架?他们会为您处理所有这些跨浏览器的问题。 – Jamiec 2012-03-09 08:24:52

+0

不是你的问题的直接答案,但也许你应该考虑一个js框架(jQuery/mootools/...)。这些跨平台工作,并节省您的头痛 – 2012-03-09 08:25:36

+0

你能否添加逻辑来测试,如果Active X的对象可用,即:(IF(window.ActiveXObject)) – 2012-03-09 08:33:28

回答

0

你应该首先检查readyState的和然后检查状态。这是在大多数浏览器中报告但忽略的常见错误。我不确定这是否是解决问题的方法,但由于您没有提供错误消息,因此很难进一步帮助您。

if(xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
    // Code ... 
} 
+0

为什么顺序回事?它不应该除非*阅读*'readyState'对'status'产生*副作用......这是愚蠢的: - /(注意它只是一个逻辑连词:'&&'。) – 2012-03-09 08:47:18

+0

因为属性只有readState等于4(或3)时才能访问'状态'。当readyState不是这些值之一时,访问变量至少会在Chrome和Firefox中引发错误。 – Saebekassebil 2012-03-09 08:51:03

+0

权,那么,为什么'xmlhttp.readyState == 4个&& xmlhttp.status == 200'比'xmlhttp.status == 200 && xmlhttp.readyState不同== 4'(在后)?虽然我同意这是一个更合理的布局,假设没有任何副作用,“a && b”和“b && a”在逻辑上是等价的。 – 2012-03-09 08:57:42

0

据我所知道的“window.XMLHttpRequest'检查应该没问题。

你可以试着考虑看看this答案。在这种情况下,问题是在浏览器设置中禁用了原生xmlhttprequest。