我在JQuery和php上写了一些例子。 Jquery插入了帖子查询。因此,页面必须查看9行。关于JQuery + HTML的代码:
<script type="text/javascript">
$(document).ready(function(){
$.post("test.php", {'test': "test"},
function (result) {
for (var i = 0; i < result; i++) {
$.post("test.php", {'test': "test2"},
function (result2) {
for (var j = 0; j < result2; j++) {
$("#test").append("<p>i="+i+" , j= "+j+" </p>");
}
}
);
}
}
);
});
</script>
<div id="test"></div>
test.php有下一个代码:
<?php
$id=$_POST["test"];
echo '3';
?>
我有下一个结果:
i=3 , j= 0
i=3 , j= 1
i=3 , j= 2
i=3 , j= 0
i=3 , j= 1
i=3 , j= 2
i=3 , j= 0
i=3 , j= 1
i=3 , j= 2
为什么i = 3?这怎么解决?我需要这样:
i=0 , j= 0
i=0 , j= 1
i=0 , j= 2
i=1 , j= 0
i=1 , j= 1
i=1 , j= 2
i=2 , j= 0
i=2 , j= 1
i=2 , j= 2
答案 0 :(得分:4)
请记住,AJAX调用是异步的。您正在使用i
循环来触发这些请求,但javascript代码几乎可以保证比ajax请求运行/完成更快(这只是一个普通的http请求,请记住)可以转到服务器然后回来当他们返回时,您的i
循环已完成,i
将在循环中分配最后一个值。在你的情况下恰好是3。
如果您在更长的循环中执行此操作,那么在i
循环仍在执行时可能会运气并且有一些响应返回,在这种情况下,您可能会看到输出的某些值出现在某处。
要回答您的实际问题,您需要发送i
以及其余的ajax请求,这样您就可以确定从哪个请求获得答案。请记住,每个.post()
调用都将是一个单独的HTTP请求,并且无法保证您将以最初请求它们的相同顺序获得答案。有些请求可能会受到net.lag的攻击,或者采取不同的路由并在以后的请求之后返回,因此请将代码更改为:
$.post("test.php", {'test': "test2", i: i},
然后将i
与答案一起返回:
<?php
$test = $_POST['test'];
$i = $_POST['i'];
echo "$i 3";
答案 1 :(得分:0)
正如Marc B所指出的,AJAX调用是异步的。如果你想通过使用jQuery的ajax()
的 async 选项来禁用此行为(尽管在POST中传递i值的解决方案可能更好)
$.ajax({
type: "POST",
url: "test.php",
async: false,
data: {test: "test"}
}).done( function (result) {
for (var i = 0; i < result; i++) {
$.ajax({
type: "POST",
url: "test.php",
async: false,
data: {test: "test2"}
}).done(function (result2) {
for (var j = 0; j < result2; j++) {
$("#test").append("<p>i="+i+" , j= "+j+" </p>");
}
});
}
});