【发布时间】:2017-02-25 00:18:00
【问题描述】:
例如,在我的 HTML 文件中,我的表格中有以下表格行,其中 {{ }} 只是变量:
<tr id="{{ object.id }}">
<td class="name">{{ object.name }}</td>
</tr>
<tr id="{{ object.id }}">
<td class="name">{{ object.name }}</td>
</tr>
然后在我的 JavaScript 文件中,我有以下代码:
var rows = document.getElementsByTagName("tr");
for (var r = 0; r < rows.length; r++){
var tr = rows[r];
var id = tr.id;
$.ajax({
url: "/some-link/" + id,
success: function(some_json){
some_json = JSON.parse(some_json);
var td = document.createElement("td");
td.innerHTML = some_json;
//Problem is the following tr is referring to the last tr in the for loop by the time the AJAX request is complete
tr.appendChild(td);
}
});
}
我得到的结果是:
<tr id="{{ object.id }}">
<td class="name">{{ object.name }}</td>
</tr>
<tr id="{{ object.id }}">
<td class="name">{{ object.name }}</td>
<td>SomeJSON from when rows was 0 in the for loop</td>
<td>SomeJSON from when rows was 1 in the for loop</td>
</tr>
但是,我的预期结果是:
<tr id="{{ object.id }}">
<td class="name">{{ object.name }}</td>
<td>SomeJSON from when rows was 0 in the for loop</td>
</tr>
<tr id="{{ object.id }}">
<td class="name">{{ object.name }}</td>
<td>SomeJSON from when rows was 1 in the for loop</td>
</tr>
我知道我可以通过添加到 AJAX 请求 async: false 来解决此问题,但我想保持异步。
任何帮助将不胜感激。
【问题讨论】:
-
你试过把
for (var rows = 0; rows < tableRows.length; rows++){ var tr = tableRows[rows];改成for (var i = 0; i < rows.length; rows++){ var tr = rows[i];吗?似乎这就是你想要做的。如果这不起作用,请发布您的所有代码 -tableRows不在您的代码中。 -
因为
$.ajax是异步的,所以在调用success 时,所有成功函数的tr 将是tableRows[tableRows.length - 1] -
@MichaelCoker - 为什么更改变量名会有所不同?
-
@JaromandaX
rows都是tr的,然后 OP 将其用作循环的计数器,但引用了代码中不存在的tableRows。 -
对不起,误读了问题中的代码:p
标签: javascript html ajax flask