假设我有一些链接要将javascript操作添加到:
<a class='test'>
<a class='test'>
<a class='test'>
当我的页面加载时,我给他们一个点击事件:
$('.test').click(function(){
alert("I've been clicked!")
});
但是让我们说后来我添加了另一个元素,我想给它同样的事件。我不能这样做:
$('.test').click(function(){
alert("I've been clicked!")
});
因为那时前3个将有2个事件。处理这个问题的最佳方法是什么?
答案 0 :(得分:7)
你可以将$ .on绑定到一个永远存在于dom中的父元素。
$(document).on('click','.test', function() {
console.log('Test clicked');
});
请注意:
您可以将document
替换为dom中始终存在的元素的任何父级,并且父级越接近越好。
与click
绑定的简单事件无法作为click
将事件处理程序绑定到绑定时已存在于dom中的元素。因此,它不适用于稍后通过Ajax或jQuery动态添加到dom的元素。为此,您必须使用event delegation
。您可以将$.on
用于此目的。
检查$.on
的文档您可以使用$.live
但$ live折旧。请改用$ .on。 $ .on的等价语法为$ .live和$ .delegate执行相同的操作
$(selector).live(events, data, handler); // jQuery 1.3+
$(document).delegate(selector, events, data, handler); // jQuery 1.4.3+
$(document).on(events, selector, data, handler); // jQuery 1.7+
在这种情况下,事件处理程序将绑定到document
。在这种情况下,事件将被jQuery委托给目标元素test
类。
<强>更新强>
我建议您将$.on
用于所有事件处理目的,因为所有其他方法都会通过$.on
和$.off
方法进行路由。
从jQuery source v.1.7.2
检查这些函数的定义bind: function( types, data, fn ) {
return this.on( types, null, data, fn );
},
unbind: function( types, fn ) {
return this.off( types, null, fn );
},
live: function( types, data, fn ) {
jQuery( this.context ).on( types, this.selector, data, fn );
return this;
},
die: function( types, fn ) {
jQuery( this.context ).off( types, this.selector || "**", fn );
return this;
},
delegate: function( selector, types, data, fn ) {
return this.on( types, selector, data, fn );
},
undelegate: function( selector, types, fn ) {
// ( namespace ) or ( selector, types [, fn] )
return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
}
对于这些方便的事件处理程序也是如此
blur focus focusin focusout load resize scroll unload click dblclick mousedown
mouseup mousemove mouseover mouseout mouseenter mouseleave change select
submit keydown keypress keyup error contextmenu
您可以看到所有方法都在使用$.on
和$.off
。因此,使用$.on
,您至少可以保存一个函数调用,但在大多数情况下这并不重要。
答案 1 :(得分:4)
由于你的.test
是通过ajax追加的,所以你需要委托事件,普通绑定不会影响它们。 委托绑定将应用于DOM中现有的所有元素,并将添加到DOM。
$('body').on('click', '.test', function() {
// your code
});
您可以使用已属于DOM的所有body
的容器,而不是.test
。
详细了解 .on()
您还可以使用 .delegate()
,如下所示:
$('#container').delegate('.test', 'click', function() {
// your code
});
答案 2 :(得分:1)
如果将元素动态添加到页面,请查看jQuery on event。并考虑以下例子:
答案 3 :(得分:0)
使用on()
,并将其附加到其包含元素。
$(".container").on("click", ".test", function(){
alert("You clicked me!");
});
答案 4 :(得分:0)
因为当您向DOM注入新内容时(通过ajax或javascript),现有绑定将无效。您必须重新绑定事件或使用jQuery on
,这将适用于当前元素和未来元素
所以对于这个,改变
$('.test').click(function(){
alert("I've been clicked!")
});
到
$(document).on('click','.test',function(){
alert("I've been clicked!")
});