2012-03-09 83 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。