我通常使用
$(selector).click(...
但是有些人建议我使用这个:
$(selector).on("click", function(...
或者 $(selector).live("click"...
(已弃用)
我阅读了手册,但作为初学者,我无法理解。我被他们使用的所有术语搞混了。我仍然不知道为什么要使用.on()
,也不知道它与.live()
有什么区别。
http://api.jquery.com/on/
我通常使用
$(selector).click(...
但是有些人建议我使用这个:
$(selector).on("click", function(...
或者 $(selector).live("click"...
(已弃用)
我阅读了手册,但作为初学者,我无法理解。我被他们使用的所有术语搞混了。我仍然不知道为什么要使用.on()
,也不知道它与.live()
有什么区别。
http://api.jquery.com/on/
每个事件最终都与DOM中的某些元素绑定。在使用.bind
的情况下,您直接将事件绑定到jQuery对象中的元素(或多个元素)上。例如,如果jQuery对象包含100个元素,则将绑定100个事件监听器。
对于.live
、.delegate
和.on
,仅绑定单个事件侦听器,通常位于DOM树中的顶层节点之一:document
、document.documentElement
(即<html>
元素)或document.body
。因为DOM事件会冒泡到树上,所以附加到body
元素的事件处理程序实际上可以接收源自页面上任何元素的单击事件。因此,不必绑定100个事件,只需绑定一个事件。
对于少量元素(比如小于五个),直接绑定事件处理程序可能更快(尽管性能不太可能成为问题)。对于大量元素,请始终使用.on
。
.on
的另一个优点是,如果您向DOM添加新元素,则无需担心将事件处理程序绑定到这些新元素上。例如,请参考HTML列表:
<ul id="todo">
<li>buy milk</li>
<li>arrange haircut</li>
<li>pay credit card bill</li>
</ul>
接下来是一些 jQuery 代码:
// Remove the todo item when clicked.
$('#todo').children().click(function () {
$(this).remove()
})
现在,如果我们添加一个待办事项呢?
$('#todo').append('<li>answer all the questions on SO</li>')
点击此待办事项不会将其从列表中删除,因为它没有绑定任何事件处理程序。如果我们使用 .on
而不是 .click
,新项目将无需额外的工作即可正常工作。下面是使用 .on
版本的代码:
$('#todo').on('click', 'li', function (event) {
$(event.target).remove()
})
event.target
。在我写这篇文章的时候,我不确定在传递给.on
的事件处理程序中this
的绑定情况。刚刚阅读了该方法的文档,我现在意识到在这种情况下this
和event.type
将引用相同的对象(但不是所有情况都是如此)。 - davidchambers.on
方法是在jQuery 1.7中添加的,该版本刚刚发布。您的fiddle使用的是jQuery 1.6.4。 - davidchambers使用普通的 .click(...
如果选择器的目标在页面中被动态改变(例如通过一些 AJAX 响应),那么你需要再次指定这个行为。
在 .live(...
中,行为会自动重新应用到选择器上。
.on(...
是非常新的(jQuery 1.7)。它可以使用委托事件来覆盖 live
场景,这是一种更快的方式来附加行为。
.on()
可以使用映射同时附加多个事件。 - Pedram Behroozi$("#myTable").on("click", "tr", ...
。请参阅 http://api.jquery.com/on/。 - cherouvim.click()
只会应用于文档对象模型中已经存在的指定选择器的元素(仅限于已经存在的)。.on(selector ,"click",callback);
会应用于所有与该选择器匹配的元素,包括未来出现的元素。让我举个例子:$('p').click(function(){
$(this).next('<p>this is a copy of the previous paragraph </p>');
});
$('p').on("click",function(){
$(this).next('<p>this is a copy of the previous paragraph </p>');
});
.on
或 .delegate
甚至可以在新元素中找到匹配项)。