我认为这与个人喜好和代码可读性有关。
就更强大的功能而言.on
,您可以委托事件,而快捷方式始终直接对元素进行操作。例如,即使是在使用 ajax 或其他方式添加的元素,也$('body').on('click', '.button', function(){});
适用于每个元素。.button
虽然快捷方式无法做到这$('.button').click(function(){});
一点,但这是添加侦听.button
器且不具有委托功能的唯一方法,因此.button
稍后添加的元素将没有此绑定。
多个元素上的直接未委托事件(如快捷方式)的效率也略低于父对象上的委托事件。例如:假设.button
页面上有 15 个元素,$('.button').click(...
将遍历所有 15 个元素并为每个元素添加一个事件侦听器;然而$('#parentElem').on('click', '.button', ...
,将简单地将单个事件侦听器附加到#parentElem
对目标的检查,因此一个附加和一个侦听器,而不是一个循环和 15 个侦听器。
最后,.on
它的优点是允许您从多个事件中将一个函数附加到一个元素,这是使用快捷方式无法实现的,例如:$('.button').on('click mouseover keyup', ...
该函数将通过单击、鼠标悬停或按键触发!
.button
让我们再次说在一个名为 div 中有 15 个元素#parent
快捷方式处理程序:
$('.button').click(turnRed);
$('.button').mouseover(turnRed);
$('.button').keyup(turnRed);
function turnRed(){
$(this).css('color','red');
}
- 创建了 4 个 jQuery 对象(是的,我知道您可以将其缓存到 2 个对象,但这是一个示例)
- 3 个元素循环,每个循环 15 个,因此 jQuery 在这里点击元素 45 次并附加监听器
- 总共 45 个事件监听器
- 添加到场景中的未来
.button
元素不会turnRed
.on
处理程序:
$('#parent').on('click mouseover keyup', '.button', turnRed);
function turnRed(){
$(this).css('color','red');
}
- 创建了 2 个 jQuery 对象
- 没有元素循环,所以 jQuery 一次点击元素
- 总共 3 个事件监听器
- 未来
.button
添加到场景中的元素实际上会turnRed
这里.on
明显有优势
如果您的情况比这更简单,那么 的优势.on
可能不会对您产生影响,并且该快捷方式可能是首选,因为它更具可读性。
$('#button').click(...
几乎与$('#button').on('click', ...
(请参阅@Fabrício Matté 的回答)相同,如果我们只想为一个事件添加一个侦听器,那么.on
' 的力量是一个有争议的问题。
就个人而言,因为有时我希望.on
我总是使用的优势.on
只是为了保持一致。