2014-10-09 80 views
0

我對此感到困惑。我有兩個XMLHttpRequests在我的HTML文件的Select元素上運行(當HTML文件加載時,每個元素都在不同的Select元素上運行)。我正在使用W3C學校推薦的回調函數。如果我的變量xmlHttp在我的回調函數之外定義,那麼只有第二個請求有效,第一個請求在有機會完成之前被刪除。如果我把'var'放在它的前面,會發生同樣的事情。 但是,如果我的變量在前面有'var'的函數內部,那麼絕對沒有任何反應。我已經縮小到了在哪裏說「這裏!!!!!」是程序似乎掛起的地方。我知道loadXMLDoc函數實際上並沒有完成,因爲當我在它之外放置一個警報時,沒有任何反應。我認爲它與'if'部分有關,程序不能識別xmlHTTP,即使它是在本地定義的。我對JavaScript仍然很陌生,只是希望能夠一次運行多個XMLHttpRequest對象,而不需要彼此相處,也不會掛頁。任何想法,爲什麼這不起作用?多個XMLHttpRequests不起作用

HTML:

<form> 

    <select id="stateSelectCities"> 
     <!-- Will be populated with MySQL --> 
    </select> 

    <select id="citySelect"> 
     <option>Select a State</option> 
    </select> 

    <br /> 
    <br /> 

    <select id="stateSelectCounties"> 
     <!-- Will be populated with MySQL --> 
    </select> 

    <select id="countySelect"> 
     <option>Select a State</option> 
    </select> 

    <p id="xmltest"></p> 
    <p id="currentState"></p> 
    <p id="sc"></p> 
    <p id="rs"></p> 
    <p id="st"></p> 

</form> 

的JavaScript:

<script type="text/javascript"> 
function loadXMLDoc(method, data, url, cfunc) { 
      var xmlHTTP = new XMLHttpRequest(); 
      xmlHTTP.onreadystatechange = cfunc; 
      xmlHTTP.open(method, url, true); 
      if (data) { 
       xmlHTTP.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
       xmlHTTP.send(data); 
      } else { 
       xmlHTTP.send(); 
      } 
     } 

function returnStateListForCounties() { 
      loadXMLDoc('GET', null, "stateslist.xml", function() { 
       document.getElementById('countySelect').disabled = true; 
       if (xmlHTTP.readyState == 4 && xmlHTTP.status == 200) { 

        // Read the XML Data and Populate Counties States Menu 
        var response = xmlHTTP.responseXML; 
        var states = response.getElementsByTagName('state'); 
        for (i = 0; i < states.length; i++) { 
         var option = document.createElement('option'); 
         option.innerHTML = states[i].childNodes[0].nodeValue; 
         option.setAttribute('onmouseup', 'returnCounties(this.innerHTML)'); 
         document.getElementById("stateSelectCounties").add(option); 
        } 
       } 
       //document.getElementById("sc").innerHTML = 'statusCode: ' + xmlHTTP.status; 
       //document.getElementById("rs").innerHTML = 'readyState: ' + xmlHTTP.readyState; 
       //document.getElementById("st").innerHTML = 'statusText: ' + xmlHTTP.statusText; 

      }) 
     } 

function returnStateListForCities() { 
      loadXMLDoc('GET', null, 'stateslist.xml', function() { 
       document.getElementById('citySelect').disabled = true; 
       // HERE!!!!! 
       if (xmlHTTP.readyState == 4 && xmlHTTP.status == 200) { 

        // Read the XML Data and Populate Cities States Menu 
        var response = xmlHTTP.responseXML; 
        var states = response.getElementsByTagName('state'); 
        for (i = 0; i < states.length; i++) { 
         var option = document.createElement('option'); 
         option.innerHTML = states[i].childNodes[0].nodeValue; 
         option.setAttribute('onmouseup', 'returnCities(this.innerHTML)'); 
         document.getElementById("stateSelectCities").add(option); 
        } 
       } 
       document.getElementById("sc").innerHTML = 'statusCode: ' + xmlHTTP.status; 
       document.getElementById("rs").innerHTML = 'readyState: ' + xmlHTTP.readyState; 
       document.getElementById("st").innerHTML = 'statusText: ' + xmlHTTP.statusText; 

      }) 
     } 

//returnStateListForCounties(); 
returnStateListForCities(); 

</script> 
+0

id是唯一的。你有3個選擇相同的ID。 – rogelio 2014-10-09 07:15:29

+0

@rogelio感謝您的支持。我已經更新了HTML部分。總共有4個選擇元素(具有唯一的ID),其中2個我現在想改變。 – SpencerAAA 2014-10-09 07:21:43

+0

你可以將網址複製到w3cschools網站(函數參考)? – rogelio 2014-10-09 07:30:26

回答

1

這裏probleme是其內部loadXMLDoc功能定義,並嘗試內returnStateListForCounties功能再次使用xmlHTTP變量,我會做這樣的:

 function loadXMLDoc(method, data, url, cfunc) { 
      var xmlHTTP = new XMLHttpRequest(); 
      xmlHTTP.onreadystatechange = function() { 
       if (xmlHTTP.readyState == 4 && xmlHTTP.status == 200) 
       {       
        cfunc(xmlHTTP.responseXML); //Call passed func with the resulting XML 
       } 
      }; 

      xmlHTTP.open(method, url, true); 
      if (data) { 
       xmlHTTP.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
       xmlHTTP.send(data); 
      } else { 
       xmlHTTP.send(); 
      } 
     } 

這樣你e封裝數據恢復。

+0

謝謝你的回覆。這是我所懷疑的,儘管我希望事實並非如此。我會稍微玩一下這個封裝。 – SpencerAAA 2014-10-09 07:26:36

+0

謝謝Balder!這是一個救星。我把我所有的onreadystatechange函數都放到了loadXMLDoc中,它運行得很好。我能夠訪問本地變量,並根據需要製作多個副本,而不需要通過對方的方式進行調用。 – SpencerAAA 2014-10-09 07:57:36

+0

我很高興幫助:) – Balder 2014-10-09 07:59:57