2013-03-11 113 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; 
    }