これは非常に単純なプロトタイプの例です。
それが行うのは、ウィンドウのロード時に、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>
紛らわしいのは、プロトタイプが div に実際に何かがあることを理解するコンテキストです。
ajax 呼び出しの onSuccess 部分を見ると、その時点で $('content').innerHTML に内容が含まれていることがわかります。
ただし、ajax 呼び出しの直後に $('content').innerHTML を確認すると、空のように見えます。
これは私の根本的な誤解に違いありません。誰か私に説明してくれませんか?
編集
何かを明確にしたいだけです。Ajax 呼び出しが非同期であることを認識しています。
物事が実行されている実際の順序と、それが私を混乱させる理由は次のとおりです。
- ページが読み込まれます。
- get-table.php への Ajax リクエストが行われます。
- click1() INSIDE onSuccess の呼び出しが発生します。div にコンテンツがあるというアラートが表示されます。
- Ajax 呼び出しが発生した後の click1() への呼び出し。div が空であるという警告が表示されます。
つまり、コードは書かれた順序で実行されているようですが、DOM は同じ順序で更新されていません。
編集 2 したがって、短い答えは、コードを onSuccess に配置することが正しい場所であるということです。
考慮すべきもう 1 つのケースは、次のように、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!
}
});
}