当我尝试选择任何元素,这是ajax调用的结果,它不被选择使用$(element)
但是当我在任何函数中选择该元素时它都会选择
示例:如果我选择id为change
的元素
hello.php
is
<?php
echo '<span id="change"> hello </span>';
?>
html在main.php
是
<div id="content">
</div>
和脚本在main.php
<script>
$.post("hello.php",function(r,s){$("#content").html(r)});
$("#change").css({"backgroundColor":"red"});
</script>
这个脚本不改变span的颜色,我知道它不会工作,因为在第二个语句执行的时候,他们没有id为change
的元素,$("#element")
找不到id为change
但是当我在任何函数中尝试$("#change")
时,它会改变span的颜色。例如,如果我使用
<script>
$.post("hello.php",function(r,s){$("#content").html(r)});
setTimeout(function(){$("#change").css({"backgroundColor":"red"});},0);
</script>
请注意,我将延迟时间设置为0秒,但这是有效的,并改变了id为change
的span颜色。我是说现在$("#change")
可以找到id为#change
如果我在ajax函数中使用$("#change"),那么它也可以工作。
<script>
$.post("hello.php",function(r,s){$("#content").html(r)});
$.post("example.php",function(r,s){$("#change").css({"backgroundColor":"red"});});
</script>
谁能解释一下为什么会发生这种情况,为什么在其他两个例子中$("#change")
选择元素。即使在执行函数
一切都在于时机。当您从服务器获取内容并尝试将其注入DOM时,渲染将花费一些时间。当您对任何值使用setTimeout时,都将内部函数推入事件循环。结果是,它将在您指定的最小时间之后执行—在您的示例中为0,但仅在堆栈为空时执行。在此期间,内容以DOM呈现,您可以访问这些元素。你应该观看这个视频,以获得更好的解释:https://www.youtube.com/watch?v=8aGhZQkoFbQ
这是由于post
命令的异步特性。直到帖子完成,脚本的其余部分才会停止。而不是这样,即使post
命令已经在执行中,它也会被执行。使用timeout
函数所做的是将jquery选择的执行延迟一小部分时间,这为post
提供了完成的时间。