所以,这可能是一个非常简单的问题,但我还是会问。这显然只是为了在我心中澄清这两个陈述是如何工作的。
场景我通过 Ajax 调用一些 JSON,然后将其插入到具有一些选择器的 html 中。像这样:
$.each(r, function(k,v){
str+='location: <div class=\'loc-to-select\' data-location-id=\'' + v.id + '\'>';
str+= v.name + '</div>';
});
$('#event-search-locations').html(str);
基本上写出来:
<div class='loc-to-select' data-location-id='2'>Joe's</div>
我有这两个 jQuery:
// doesn't work
$('.loc-to-select').on('click',function(){
alert('here you go');
});
// does work
$(document).on('click','.loc-to-select', function(){
alert('here you go');
});
所有这一切都发生在 jQuery 的 $(document).ready 完成触发之后。据我了解,这是 jQuery 提供的主要功能。我熟悉事件冒泡的概念。我还阅读了此处的文档http://api.jquery.com/on/ ,其中讨论了委托事件。我在内部不了解 jQuery 是如何通过后代元素做到这一点的。其中一些讨论了它如何从用户空间 pov 处理:Direct vs. Delegated - jQuery .on()
此外,出于性能原因,似乎首选后代元素技术。后代元素模型基本上是说,如果我们在 DOM 中添加了一些新的东西,检查它是否符合“委托元素”模型,而直接事件会绕过这个?
在更简单的层面上,jQuery“运行时”本质上是监视 DOM 的更改然后检查还是在更早的时候检查例如 html 函数(本质上是通过 html 解析它知道的项目)?
最后,他们为什么不把第二种语法(委托语法)设为默认?它似乎提供了更大的特异性和更好的性能(如文档中所述)
谢谢