jQuery新元素事件绑定问题解决方案

js的事件侦听器与CSS不同,CSS具有与设置样式相同的性能,不管它是原始的还是新的,而事件监听器不是,您必须单独绑定每个元素。

一个常见的例子是当表被处理时,每行的结尾有一个删除按钮,可以通过这行删除。
复制代码代码如下所示:



这就是那条线。
删除


这就是那条线。
删除




通常,我一定要绑定这个
复制代码代码如下所示:
函数($){
删除按钮来删除绑定事件的初始化
Click(函数(){)
$(这个)。父母();
});
});

对于删除按钮存在Domready之前一切都是完美的。但是如果一些线路动态添加JS Domready后,在新的线路按钮将失去作用。

如何解决这个问题下面是4个解决方案:

0号溶液onclick方法

如果结构和行为之间的分离规则被忽略,我通常会这样做。
注意,此时的deltr函数必须是一个全局函数,把jQuery(功能($){ })外,放在成局部函数,在调用HTML onclick!
复制代码代码如下所示:
删除

函数($){
添加行
$(# ADD2)。Click(function(){)
$(#表> TBODY)。追加(新行删除)
});
});
功能 / /删除行,必须放在Domready功能
功能deltr(delbtn){
$(delbtn)。父母(TR)删除();
};

第1号溶液——重复结合法

即元素绑定事件处理函数在Domready给现有元素。
然后添加新元素时再次绑定。
复制代码代码如下所示:
删除

函数($){
定义删除按钮事件
在内部写入,以防止全局命名空间的污染。
功能deltr(){
$(这个)。父母();
};
删除按钮来删除绑定事件的初始化
$(# Table3. del)。Click(deltr);
添加行
$(# ADD3)。Click(function(){)
$(补充说行删除)
再次在这里删除按钮绑定事件。
找到(。德尔)。Click(deltr)结束()。
。appendto($(#表> TBODY ));
});
});

第2种解决方案——事件冒泡法

使用事件冒泡的原理,我们将事件处理函数绑定到按钮的祖先元素。
然后是判断的对象,event.target触发事件的对象我们正在寻找。
通常你可以使用DOM的属性,如event.target.classname,event.target.tagname等等。
复制代码代码如下所示:
删除

函数($){
第四表删除按钮事件
$(#表)。Click(function(e){
如果(e.target。类名= = ){
$(e.target)。父母(TR)删除();
};
});
表第四添加按钮事件
$(# add4)。Click(function(){)
$(#表> TBODY)。追加(新行删除)
});
});


第3解决方案——复制事件方法

有几种方法可以说,即使您不使用jQuery库,您也可以相对容易地实现,但这个方案对jQuery的依赖程度更高。您必须要求jQuery 1.2或更多。
上述两个方案都是关于删除功能,多种触发和绑定的变化。这个方案是不同的,且可以绑定到在Domready静态元素一样。但当我们添加一个新的路线,我们改变它,不想添加一个字符串添加一个新行。这一次我们尝试使用的DOM元素的复制,复制与约束的事件,然后修改内部元素的发现等。
同时,就像这个例子一样,如果删除所有元素,模板模板是必需的。如果你不删除光,你不需要使用模板。为了防止它被删除,我把模板隐藏起来。
我在jQuery中使用了唯一的克隆(true)
复制代码代码如下所示:
模板{显示:无;}


下面是模板
删除


这就是那条线。
删除


这就是那条线。
删除


函数($){
第五表删除按钮事件
$(#表5. del)。Click(function(){)
$(这个)。父母();
});
表第五添加按钮事件
$(# 5%)。Click(function(){)
$(#表5 TBODY TR:情商> >(0))
与复制的事件一起
克隆(真)
删除模板标记
。removeClass(模板)
修改内部元素
查找(EQ(0))
文本(新行)
((完)
插入表
。appendto($(#表5 > TBODY ))
});
});

一般:

以上4种方案各有优缺点。
第0种方案,结构和行为完全分离,全局命名空间的污染。推荐最少。所以我不认为它是一个方案。但是对于JS初学者来说,它可以用于项目救援。
1号,遵纪守法,没有什么不坏。
2方案,该方法充分发挥了JS事件冒泡的优势。和最高的效率。但同时,由于该方案无视jQuery强大的选择器,它将如果元素性质有太多更麻烦。你会流连忘返的条件下大量如果。然后我认为可以使用$(事件。目标),(选择)在jQuery作为条件,这可以大大提高开发效率,但略微降低了执行的效率。
第3号计划,我认为是反映结构与行为分离的最好办法,但缺点也很明显。对于jQuery来说,它太高了,不能依赖它,或者编写一个具有事件的函数的副本,但是这对于初学者来说也是非常困难的,但是从未来的趋势来看,强烈建议使用这个方案。

具体的选项中,没有明确的数字。看看你的项目和你的JS的程度和结构与行为分离的想法。最好的是最好的。

额外的:

将3号方案转化为完善的结构行为分离方式。
首先,模板是一个模板元素。他是所有拷贝的源,为了防止它被删除,所以不可见。如果光线没有被删除,模板元素也是可选的。因为你可以复制循环中使用的任何现有元素。
第二,向每个重复元素添加一个重复,这样可以方便地删除按钮来找到这个级别的元素,这是可选的,有时不需要。
最后是将一个类添加到要修改的每个元素,这很容易找到。例如,我这里有一个内容类,可以添加它来修改内部的值。
这种结构与案件行为的完美分离已经完成。
复制代码代码如下所示:



下面是模板
删除


这就是那条线。
删除


这就是那条线。
删除





添加到




函数($){
第六表删除按钮事件
$(# tbody6。德尔)。Click(function(){)
$(这个)。父母(重复);
});
表第六添加按钮事件
$(#注意力不足症)。Click(function(){)
$(# tbody6 >。模板)
与复制的事件一起
克隆(真)
删除模板标记
。removeClass(模板)
修改内部元素
查找()
文本(新行)
((完)
插入表
。appendto($(# tbody6 ))
});
});

同样,js的这一部分也适用于下面的HTML结构
复制代码代码如下所示:


下面是模板
删除


这就是那条线。
删除


这就是那条线。
删除