2013-03-11 107 views
-1

好的。我需要帮助。出于某种原因,onreadystatechange被多次触发。我真的需要今晚得出这个想法。这是我剩下的最后一项任务,我不知道该怎么做或是什么原因造成的。请帮忙。我使用AJAX(ndhr)通过JSON'Y-m-d h:i:s'发送到PHP以使用strtotime()函数通过AJAX返回'm-d-Y'。 JSON和PHP的工作很好,但是当onreadystatechange被解雇时,它会多次执行。几乎像readyState == 4的次数比它多。JavaScript AJAX PHP问题

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"; 
     } 
    } 
} 
+0

这到底是怎么回事?你没有给我们任何所需的信息。你遇到什么问题?抛出什么错误,你的php输出是什么..这些都是我们需要知道的,你没有提供的东西。 – Daedalus 2013-03-11 00:18:54

+0

问题更新 – yanike 2013-03-11 00:24:29

回答

1

在你ndhr.onreadystatechange功能ndhr代表在循环不调用中创建的最后ndhr,引用调用对象使用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请求都已完成,然后执行代码。

+0

@yanike请参阅更新。 – Musa 2013-03-11 00:48:24

+0

是的。我只是注意到,当我把戒备(nda [0]);在for循环之前,它显示未定义,然后当我关闭警报时,结果显示。当我从代码中删除警报时,没有结果显示。 – yanike 2013-03-11 00:52:00

+0

如何使用计数器来检查代码是否完整?我现在正在使用settimeout作为等待代码完成的秒数。最后一个for循环只需要调用一次。我使用ndhr AJAX来创建最后一个日期的数组,以创建最后一个for循环的div。 – yanike 2013-03-11 00:53:41

0

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

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

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