这是一个非常简单的原型示例。
它所做的只是在窗口加载时,将一些 html 粘贴到 div 中的 ajax 调用。
<html>
<head>
<script type="text/javascript" src="scriptaculous/lib/prototype.js"></script>
<script type="text/javascript">
Event.observe(window, 'load', function(){
new Ajax.Request('get-table.php', {
method: 'get',
onSuccess: function(response){
$('content').innerHTML = response.responseText;
//At this call, the div has HTML in it
click1();
},
onFailure: function(){
alert('Fail!');
}
});
//At this call, the div is empty
click1();
});
function click1(){if($('content').innerHTML){alert('Found content');}else{alert('Empty div');}}
</script>
</head>
<body><div id="content"></div></body>
</html>
令人困惑的是 Prototype 理解 div 实际上包含内容的上下文。
如果您查看 ajax 调用的 onSuccess 部分,您会发现此时 $('content').innerHTML 中有内容。
但是,当我在 ajax 调用之后立即检查 $('content').innerHTML 时,它似乎是空的。
这一定是我的一些基本误解。有人愿意向我解释吗?
编辑
我只是想澄清一些事情。我意识到 Ajax 调用是异步的。
这是执行事物的实际顺序以及为什么它让我感到困惑:
- 页面加载。
- 向 get-table.php 发出 Ajax 请求。
- 发生在 onSuccess 内部对 click1() 的调用。我看到 div 有内容的警报。
- 在 Ajax 调用发生之后对 click1() 的调用。我看到 div 为空的警报。
所以这就像代码是按照它编写的顺序执行的,但是 DOM 并没有按照相同的顺序更新。
编辑 2 所以简短的回答是把代码放在 onSuccess 是正确的地方。
另一种需要考虑的情况是您进行 Ajax 调用,然后从第一个调用的 onSuccess 进行另一个 Ajax 调用,如下所示:
new Ajax.Request('foo.php',{
method: 'get',
onSuccess: function(response){
doAnotherAjaxCall();
}
});
function doAnotherAjaxCall(){
new Ajax.Request('foo.php',{
method: 'get',
onSuccess: function(response){
//Anything that needs to happen AFTER the call to doAnotherAjaxCall() above
//needs to happen here!
}
});
}