既然你打电话$('mySelector').on('myEvent', 'mySecondSelector'),
我不明白使用"mySecondSelector"
?
4 回答
第二个选择器是目标。on()
在运行代码时目标可能不存在的情况下,此语法可以用作委托方法
假设这个标记
<ul id="list">
<li class="item">Item</li>
</ul>
您可以将点击处理程序添加到item
类:
$('.item').on('click',doSomething);
但是如果我们现在添加一个新项目到列表中
$('#list').append(' <li class="item">Item</li>');
调用单击处理程序时此新项目不存在,因此不会将事件处理程序绑定到它
相反,我们使用主要的 ul 或任何其他永久祖先,document
因为它始终存在并以项目为目标
$('#list').on('click', '.item', doSomething);
将其解释为:
当点击时#list
,如果点击的目标是.item
,则运行处理程序,否则不执行任何操作
如果您有一个包含多个子元素的元素,如果您不指定第二个选择器,那么无论您单击哪个子元素,都会触发该事件。如果您指定它,则仅当您使用该选择器单击选定元素时才会触发该事件。
例如,您可能有:
<div id="clickable">
<div id="fireEvent">Example</div>
<div id="dontFireEvent">Example</div>
<div id="fireEvent"></div>
</div>
现在,如果您拨打电话,$('#clickable').on('myEvent');
无论您在该区域的哪个位置单击,该事件都会触发。
但是,如果您调用,$('#clickable').on('myEvent','#fireEvent');
事件只会在您单击第一个和第三个 div 时触发(具有 'fireEvent' 的 id 的那些。
在 jQuery 1.7x 中.on()
添加了该方法。
要回答你的问题,我需要先解释一下为什么要添加它。早些时候有(并且仍然被你贬低了)方法.live()
,例如不断监视 DOM 以查找与选择器匹配的元素。因此,在每次 DOM 更改(无论是插入、重新排列、删除等)时,侦听器都会处于活动状态,并试图查看它需要附加委托的内容。
想象一个带有容器和 1000 个子元素的页面。现在,子元素不断变化(主要是由于 Ajax),您需要将.click()
事件绑定到每个子元素。这曾经消耗大量处理并且性能相当差。
输入.on()
方法。基本上,这两个选择器用于:
第一个选择器 -加载 DOM 后不应更改parent
的元素
第二个选择器 - 作为child
您正在编写的方法的实际目标的元素,即使在加载 DOM 之后,它也可能来自第一个选择器。
为了广泛使用,许多人使用 `.on()' 之类的
$(body).on("click", "#mydiv", function(){
// do something
});
这通常没问题,因为 DOM 通常不是很大。然而,它的作用是:它告诉 jQuery 观察body
DOM 中的元素并查找其中的所有#mydiv
元素。当您有 1000 个子元素被操作时,与旧方法没有太大区别。
因此,使用时.on()
请尽量使第一个选择器包含第二个选择器元素,而不是进一步向上 DOM。
$('mySelector').on('myEvent', 'mySecondSelector')
我的第二选择器:
一个选择器字符串,用于过滤将调用处理程序的选定元素的后代。如果选择器为 null 或省略,则处理程序总是在到达所选元素时被调用。
有关详细信息,请参阅On()