-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;
}
}
の内側にアップデートしてテーブルを試してみました。 ''は '
ありがとう@mhodges。これは私にとっては問題ではありません。スコープは私に問題を引き起こしています。私がAJAXの中で更新しているものは更新されていません。今、私のテーブルは1つのカラムを除いて完成しています。これが原因です。しかし、返信いただきありがとうございます。 –
[非同期呼び出しからの応答を返すにはどうすればいいですか?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – CBroe
答えて
私は問題はあなたがテーブルを更新する時間だと思う、あなたはどの ``要素を作成していない
onreadystatechange
出典
2017-10-19 23:16:24
これは良いスタートですが、OPコードのすべてが大きなforループにあります。つまり、innerHTMLを上書きするたびにajax呼び出しが数回繰り返されることを意味します。 –
関連する問題