-1

行。我需要这方面的帮助。由于某种原因,onreadystatechange 被多次触发。今晚我真的需要弄清楚这一点。这是我剩下的最后一个任务,我不知道该怎么做或导致它的原因。请帮忙。

我正在使用 AJAX (ndhr) 将 JSON 'Ymd h:i:s' 发送到 PHP,以使用 strtotime() 函数通过 AJAX 返回 'mdY'。JSON 和 PHP 工作得很好,但是当 onreadystatechange 被触发时,它会执行多次。几乎就像 readyState == 比它多 4 次。

var divs_d = ["d_2009", "d_2010", "d_2011"];

function ajax_get_json(cdiv,ocdv,ed){
    var hr = new XMLHttpRequest();
    hr.open("GET", "/json/sample.json", true);
    hr.setRequestHeader("Content-type", "application/json", true);
    hr.onreadystatechange = function () {
        if (hr.readyState == 4 && hr.status == 200) {
            cdiv.innerHTML = "";
            var data = JSON.parse(hr.responseText);
            var cad = data.comm_archive;
            var rndate;
            var nda = new Array();
            var ndac = 0;
            var ec = 0;

            for (ni = 0; ni < cad.length; ni++) {
                if (cad[ni].year == ocdv) {
                    ec = ec + 1;
                    ed.innerHTML = '<h4>' + ocdv + ' (' + ec + ' entries)</h4>';

                    var ndhr = new XMLHttpRequest();
                    var url = "/inc/strtotime.php";
                    var vars = "ndate=" + cad[ni].publish_date;
                    ndhr.open("POST", url, true);
                    ndhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                    ndhr.onreadystatechange = function () {
                        if (ndhr.readyState == 4 && ndhr.status == 200) {
                            nda[ndac] = ndhr.responseText;
                            ndac = ndac + 1;
                        }
                    }
                    ndhr.send(vars);
                }
            }

            nda.sort(function (a, b) { return b - a });
            for (ndai = 0; ndai < ndac; ndai++) {
                cdiv.innerHTML += '<h4><a href="/this_is_a_Test/archive.php?cdate=' + nda[ndai] + '">' + nda[ndai] + '</a></h4>';
            }
        }
    }
    hr.send(null);
}

function optionCchange() {
    var ocdv = document.getElementById("optionCdate").value;
    var ed = document.getElementById("ediv");

    for (i = 0; i < divs_d.length; i++) {
        var cdiv = document.getElementById(divs_d[i]);

        if (divs_d[i] == "d_" + ocdv) {
            cdiv.className = "bddiv show";
            ajax_get_json(cdiv,ocdv,ed);
        } else {
            cdiv.className = "bddiv hide";
        }
    }
}
4

2 回答 2

1

在您的ndhr.onreadystatechange函数中,ndhr代表循环中的最后一个ndhr创建而不是调用一个,以引用调用对象 use this

 ndhr.onreadystatechange = function () {
     if (this.readyState == 4 && this.status == 200) {
         nda[ndac] = this.responseText;
         ndac = ndac + 1;
     }
 }

由于the last for(ndai = 0; ndai < ndac; ndai++)ajax 的异步特性,它的行为与您预期的一样,在执行代码时,ajax 请求尚未完成。您必须在准备更改状态回调中执行此代码。只需使用计数器检查所有 ajax 请求是否已完成,然后执行代码。

于 2013-03-11T00:28:43.100 回答
0

如果您需要运行一次代码,您不必担心readystate 4被触发了多少次。只需使用布尔变量来检查代码块是否已执行。

这是我想法的伪代码示例。

executed = false;
if (readystate && (executed == false))
    {
      blablabla;
      executed = true;
    }
else
    {
      sry your code has been executed;
    }
于 2013-03-11T00:27:22.250 回答