为什么jQuery的行为与javascript不同?

为什么jQuery的行为与javascript不同?,javascript,jquery,Javascript,Jquery,我是jQuery新手,并编写了以下代码。奇怪的是,jQuery代码即使在延迟之后也能工作。在时间延迟后调用onclick alert()。javascirpt with.addEventListener()中也会出现同样的错误,因为元素不存在。有人能解释一下jQuery是如何以及为什么这样做的吗 <div id="outerId" class="outerHolder"> <div class="innerHolder"></div> </div&g

我是jQuery新手,并编写了以下代码。奇怪的是,jQuery代码即使在延迟之后也能工作。在时间延迟后调用onclick alert()。javascirpt with.addEventListener()中也会出现同样的错误,因为元素不存在。有人能解释一下jQuery是如何以及为什么这样做的吗

<div id="outerId" class="outerHolder">
  <div class="innerHolder"></div>
</div>

JS代码:

$("#outerId").on("click touchstart", "#newTag", function (e) {
    alert("OK");
});

setTimeout(function() {
    var tag = '<div id="newTag">Hello World</div>';                  
    $("#outerId").append(tag);
}, 5000);
$(“#outerId”)。在(“单击touchstart”,“#newTag”,函数(e)上{
警报(“正常”);
});
setTimeout(函数(){
var标记='helloworld';
$(“#outerId”)。追加(标记);
}, 5000);

这里有一个相同的jsFiddle:

如果您想知道在页面加载时不存在的元素上单击是如何工作的,那么这是因为您将侦听器附加到outerDiv上并使用
.on


查看使用
.on
之间的区别。单击

如果您想知道单击在页面加载时不存在的元素上是如何工作的,那么这是因为您将侦听器附加到outerDiv上并使用
.on


查看使用
.on
之间的区别。单击

我猜您的查询是关于
on()
绑定到对象的方式。当第一次运行
on()
时,
#newTag
不存在,因此您可能想知道为什么在延迟后追加时它仍然会触发

这是因为
#outerId
是要绑定到的对象,在调用
on()
时该对象确实存在。当您附加
#newTag
时,它不会改变外部绑定,只是在单击时查看子项

对于常规js,我假设您使用的是
addEventListener
,这要求您将事件绑定到特定对象。如果您在它存在之前尝试直接在
#newTag
上使用它,那么它显然不会起作用


您可以通过以下文档查看:

选择器

类型:字符串 用于筛选触发事件的选定元素的后代的选择器字符串。如果选择器为null或省略,则事件总是在到达选定元素时触发


我猜您的查询是关于
on()
绑定到对象的方式。当第一次运行
on()
时,
#newTag
不存在,因此您可能想知道为什么在延迟后追加时它仍然会触发

这是因为
#outerId
是要绑定到的对象,在调用
on()
时该对象确实存在。当您附加
#newTag
时,它不会改变外部绑定,只是在单击时查看子项

对于常规js,我假设您使用的是
addEventListener
,这要求您将事件绑定到特定对象。如果您在它存在之前尝试直接在
#newTag
上使用它,那么它显然不会起作用


您可以通过以下文档查看:

选择器

类型:字符串 用于筛选触发事件的选定元素的后代的选择器字符串。如果选择器为null或省略,则事件总是在到达选定元素时触发


javascirpt中的相同内容会产生错误是什么意思?想展示一下这是什么吗?您已经展示了有效的jQuery代码,并询问了为什么非jQuery代码不能。。。你觉得这有什么问题吗?哦,你所发布的内容没有任何作用,因为问题中发布的代码中没有脚本标记。你的问题毫无意义。具体地说,“javascript中的相同内容会产生错误。”这没有意义,因为jQuery是一个javascript库。你的意思是问jQuery如何为尚不存在的元素上的事件附加事件处理程序吗?尽管如此,我相信你的困惑是由事件委派引起的。如果将事件处理程序绑定到元素,然后在DOM中替换该元素,则不会接管绑定到旧元素的事件处理程序。不过,在上面的jQuery中,id为
#newTag
的元素没有绑定任何内容,相反,onclick处理程序绑定到
#outerId
,并且
事件。target
用于确定实际单击了
#outerId
中的哪个元素。绑定处理程序时,不存在带有
#newTag
的元素并不重要,因为处理程序绑定到它的祖先。在javascirpt中,相同的东西会产生错误是什么意思?想展示一下这是什么吗?您已经展示了有效的jQuery代码,并询问了为什么非jQuery代码不能。。。你觉得这有什么问题吗?哦,你所发布的内容没有任何作用,因为问题中发布的代码中没有脚本标记。你的问题毫无意义。具体地说,“javascript中的相同内容会产生错误。”这没有意义,因为jQuery是一个javascript库。你的意思是问jQuery如何为尚不存在的元素上的事件附加事件处理程序吗?尽管如此,我相信你的困惑是由事件委派引起的。如果将事件处理程序绑定到元素,然后在DOM中替换该元素,则不会接管绑定到旧元素的事件处理程序。不过,在上面的jQuery中,id为
#newTag
的元素没有绑定任何内容,相反,onclick处理程序绑定到
#outerId
,并且
事件。target
用于确定实际单击了
#outerId
中的哪个元素。绑定处理程序时,具有
#newTag
的元素不存在并不重要,因为处理程序绑定到它的祖先。