2014-10-09 38 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