多个XMLHttpRequest不工作

Multiple XMLHttpRequests not working

本文关键字:工作 XMLHttpRequest 多个      更新时间:2023-09-26

我对此感到困惑。我有两个XMLHttpRequest,它们对HTML文件的Select元素进行操作(在加载HTML文件时,每一个都对不同的Select元素执行操作)。我正在使用W3CSchools上推荐的回调函数。如果我的变量xmlHttp是在回调函数之外定义的,那么只有第二个请求有效,第一个请求在有机会完成之前就被删除了。如果我把var放在前面,同样的事情也会发生然而,如果我的变量在函数内部,前面有"var",那么绝对不会发生任何事情。我已经把范围缩小到了"在这里!!!"这句话的哪里,这句话似乎是节目的悬挂位置。我知道loadXMLDoc函数实际上并没有完成,因为当我在它之外放置警报时,什么都不会发生。我认为这与"if"部分和程序无法识别xmlHTTP有关,即使它是本地定义的。我对JavaScript还很陌生,只想能够同时运行多个XMLHttpRequest对象,而不会相互妨碍,也不会挂起页面。有什么想法为什么不起作用吗?

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>

这里的问题是loadXMLDoc函数中定义的xmlHTTP变量,并尝试在returnStateListForCounties函数中再次使用,我会这样做:

       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();
            }
        }

通过这种方式封装数据恢复。