2017-10-19 30 views
-1

ケース:私はバックエンドからJSONデータを受け取りました。そのデータをテーブルに表示したいと思います。私はという名前の文字列を作成しています。テーブル出力の文字列と、JSONを繰り返し処理しているときに、のtableOutputStringに応答を連結しています。最後に、innerHTMLを使用して表を表示しています。Ajax関数から変数を変更する方法は?

注:「ここから開始」と「ここで終了」のコードを見てください。

問題:私はAJAXをネストしました。内部のAJAXでのtableOutputStringを連結しようとしていますが、それは起こっていません。スコープの問題があると思います。私はtableOutputStringがAJAXスコープの内部にあるときに更新されているのを見ることができますが、外側のAJAXから出ると、AJAXに入力する前の文字列と同じになります。これで私を助けてください。

function displaytable(response) { 

    // Variable to check the length of the JSON abject 
    var lengthOfJSON = Object.keys(response).length; 
    var tableOutputString = ""; 
    var Exam_id = ""; 

    // creating the body part of the table 
    tableOutputString = tableOutputString + '<tbody>'; 
    for (var i = 0; i < lengthOfJSON; i++) { 
     tableOutputString = tableOutputString + '<td>' + (i + 1) + '</td>'; 

     for (var key in response[i]) { 
      if (key == "exam_name") { 
       Exam_id = response[i]["exam_id"]; 
       tableOutputString = tableOutputString + '<td>' + '<a href="#"' + "onclick=getExam(" + Exam_id + ")>" + response[i][key] + '</a>' + '</td>'; 
      } else { 
       tableOutputString = tableOutputString + '<td>' + response[i][key] + '</td>'; 
      } 
     } 


     /* Starts Here */ 

     var xhttp = new XMLHttpRequest(); 
     xhttp.onreadystatechange = function() { 
      if (this.readyState == 4 && this.status == 200) { 
       var response = JSON.parse(this.responseText); 

       if (response["taken"] == "true") { 
        var xhttp = new XMLHttpRequest(); 
        xhttp.onreadystatechange = function() { 
         if (this.readyState == 4 && this.status == 200) { 
          var response = JSON.parse(this.responseText); 
          if (response["graded"] == "true") { 
           tableOutputString = tableOutputString + '<td>' + "graded" + '</td>'; // trying to concatenate 
          } 
          else { 
           tableOutputString = tableOutputString + '<td>' + "Not graded" + '</td>'; // trying to concatenate 
          } 
         } 
        }; 
        xhttp.open("POST", "getWasUserExamGraded.php?id=" + Exam_id, true); 
        xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
        xhttp.send(); 
       } 
       else { 
        tableOutputString = tableOutputString + '<td>' + "Not taken" + '</td>'; // trying to concatenate 
       } 
      } 
     }; 
     /* Ends Here */ 


     xhttp.open("POST", "getDidTakeExam.php?id=" + Exam_id, true); 
     xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
     xhttp.send(); 
     tableOutputString = tableOutputString + '</tbody>'; //tableOutputString is not updated inside AJAX 

     document.getElementById("responstable").innerHTML = tableOutputString; 
    } 
} 
+0

の内側にアップデートしてテーブルを試してみました。 '​​'は ''タグの内側にあるはずです。 ''は行コンテナであり、各 '​​'はその行のセルを表します。 – mhodges

+0

ありがとう@mhodges。これは私にとっては問題ではありません。スコープは私に問題を引き起こしています。私がAJAXの中で更新しているものは更新されていません。今、私のテーブルは1つのカラムを除いて完成しています。これが原因です。しかし、返信いただきありがとうございます。 –

+0

[非同期呼び出しからの応答を返すにはどうすればいいですか?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – CBroe

答えて

0

私は問題はあなたがテーブルを更新する時間だと思う、あなたはどの ``要素を作成していないonreadystatechange

var cellText; 
if (response["graded"] == "true") { 
    cellText = '<td id="gradedCell">' + "graded" + '</td>'; 
} else { 
    cellText = '<td id="gradedCell">' + "Not graded" + '</td>'; 
} 
document.getElementById("gradedCell").innerHTML = cellText ; 
+1

これは良いスタートですが、OPコードのすべてが大きなforループにあります。つまり、innerHTMLを上書きするたびにajax呼び出しが数回繰り返されることを意味します。 –

関連する問題