【问题标题】:JavaScript AJAX PHP issueJavaScript AJAX PHP 问题
【发布时间】:2013-03-11 00:17:45
【问题描述】:

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

我正在使用 AJAX (ndhr) 将 JSON 'Y-m-d h:i:s' 发送到 PHP,以使用 strtotime() 函数通过 AJAX 返回 'm-d-Y'。 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";
        }
    }
}

【问题讨论】:

  • 究竟如何?你没有给我们任何需要的信息。您遇到什么问题?它抛出什么错误,你的 php 输出是什么......这些都是我们需要知道的,你没有提供的东西。

标签: php javascript ajax


【解决方案1】:

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

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

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

【讨论】:

  • 是的。我刚刚注意到,当我输入 alert(nda[0]);在 for 循环之前,它显示未定义,然后当我关闭警报时显示结果。当我从代码中删除警报时,没有结果显示。
  • 如何使用计数器来检查代码是否完整?我现在正在使用 settimeout 作为等待几秒钟以完成代码的工作。最后一个 for 循环只需要调用一次。我正在使用 ndhr AJAX 创建一个包含最后一个日期的数组,我需要用最后一个 for 循环创建 div。
  • @yanike 你已经有一个计数器ndac,只需检查它何时等于cad.length 运行代码。
  • 不错。我将使用“ni”。谢谢穆萨!
【解决方案2】:

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

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

executed = false;
if (readystate && (executed == false))
    {
      blablabla;
      executed = true;
    }
else
    {
      sry your code has been executed;
    }

【讨论】:

    猜你喜欢
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    相关资源
    最近更新 更多