-1

Ok。これについて助けが必要です。何らかの理由で 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最後に作成されたものを表します。ndhrthis

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

ajaxのthe last for(ndai = 0; ndai < ndac; ndai++)非同期性により、 は期待どおりに動作しています。コードが実行されるまでには、ajax リクエストはまだ終了していません。このコードは、on ready change ステート コールバックで実行する必要があります。カウンターを使用して、すべての ajax リクエストが終了したかどうかを確認してから、コードを実行します。

于 2013-03-11T00:28:43.100 に答える
0

コードを 1 回実行する必要がある場合は、何回実行readystate 4されたかを気にする必要はありません。コードのブロックが実行されたかどうかを確認するには、ブール変数を使用するだけです。

これが私のアイデアの疑似コードの例です。

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