为什么$(element)不能直接工作.但在功能上是有效的


why $(element) not works directly. but works in function

当我尝试选择任何元素,这是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提供了完成的时间。

相关文章: