好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

当jquery添加新元素后的绑定事件的处理

当jquery添加新元素后的绑定事件的处理

空间管理 您的位置:  ITPUB个人空间  ?  Java交流学习教室  ?  日志

汇聚你我之力......

jquery 新建的元素事件绑定问题(上)

上一篇  /  下一篇   2008-10-20 21:40:00 / 个人分类: jQuery

查看( 1565 )  /  评论( 8 )  /  评分(  30  /  5  )

demo: http://www.cnjquery.com/demo/jquery页面加载完成后元素绑定事件.html

我想很多人都会向我一样曾经 被新元素的事件绑定困惑很久也就是
在页面加载完成后给元素绑定了事件,但又新增加的元素上却没有绑定任何事件。

js的事件监听跟css不一样,css只要设定好了样式,不论是原来就有的还是新添加的,都有一样的表现。而事件监听不是,你必须给每一个元素单独绑定事件。

常见的例子是处理表格的时候。每行行末有个删除按钮,点了这个能够删除这一行。

< table >
     < tbody >
         < tr >
             < td > 这行原来就有 </ td >
             < td >< button   class = " del " > 删除 </ button ></ td >
         </ tr >
         < tr >
             < td > 这行原来就有 </ td >
             < td >< button   class = " del " > 删除 </ button ></ td >
         </ tr >
     </ tbody >
</ table >

通常,我会这么绑定

jQuery ( function ( $ )   {     //已有删除按钮初始化绑定删除事件     $ ( " .del " ) . click ( function ()   {         $ ( this ) . parents ( " tr " ) . remove () ;     }) ; }) ;

对于在domready之前就存在的删除按钮,一切都很完美。但如果在domready之后用js动态添加几行,那新增的几行中的这些按钮都将失去任何作用。

如何解决这个问题?以下提供4种解决方案:
=============================
0号解决方案——onclick法
如果不顾结构与行为分离的准则的话,通常,我会这么做。
注意 ,此时的deltr这个function必须是全局函数,得放jQuery(function($) {})外面,放里边就成局部函数了,html里的onclick就调用不到了!

< td >< button   onclick = " deltr(this) " > 删除 </ button ></ td >

jQuery ( function ( $ ) {     //添加行     $ ( " #add2 " ) . click ( function (){         $ ( " #table2>tbody " ) . append ( ' <tr><td>新增行</td><td><button nclick="deltr(this)">删除</button></td></tr> ' )     }) ; }) ; //删除行的函数,必须要放domready函数外面 function   deltr ( delbtn ) {     $ ( delbtn ) . parents ( " tr " ) . remove () ; } ;

=============================
1号解决方案——重复绑定法
即,在domready的时候就给已有的元素绑定事件处理函数,
而后当新增加的元素的时候再次绑定。

< td >< button class = " del " > 删除 </ button ></ td >

jQuery ( function ( $ ) {     //定义删除按钮事件绑定     //写里边,防止污染全局命名空间     function   deltr () {         $ ( this ) . parents ( " tr " ) . remove () ;     } ;     //已有删除按钮初始化绑定删除事件     $ ( " #table3 .del " ) . click ( deltr ) ;     //添加行     $ ( " #add3 " ) . click ( function (){         $ ( ' <tr><td>新增行</td><td><button class="del">删除</button></td></tr> ' )             //在这里给删除按钮再次绑定事件。             . find ( " .del " ) . click ( deltr ) . end ()             . appendTo ( $ ( " #table3>tbody " )) ;     }) ; }) ;

=============================
2号解决方案——事件冒泡法
利用事件冒泡的原理,我们给这个按钮的祖先元素绑定事件处理函数。
然后通过event.target这个对象来判断,这个事件是不是我们要找的对象触发的。
通常可以利用一些DOM属性,比如event.target.className、event.target.tagName等之类的来判断。

< td >< button class = " del " > 删除 </ button ></ td >

jQuery ( function ( $ ) {     //第四个表格的删除按钮事件绑定     $ ( " #table4 " ) . click ( function ( e )   {         if   ( e . target . className == " del " ) {             $ ( e . target ) . parents ( " tr " ) . remove () ;         } ;     }) ;     //第四个表格的添加按钮事件绑定     $ ( " #add4 " ) . click ( function (){         $ ( " #table4>tbody " ) . append ( ' <tr><td>新增行</td><td><button class="del">删除</button></td></tr> ' )     }) ; }) ;


相关阅读: jquery+ajax+xml+php简单留言板   ( Java006 , 2008-10-20) jquery五行代码实现对浏览器版本检测   ( Java006 , 2008-10-20) jquery ajax读取xml文档   ( Java006 , 2008-10-20) Jquery+ExtJS实现文件上传   ( Java006 , 2008-10-20) jquery 新建的元素事件绑定问题(下)   ( Java006 , 2008-10-20)

TAG:  javascript   jquery

引用 删除 Guest    /   2010-04-03 15:14:09 评  5  分
引用 删除 Guest    /   2010-01-21 14:31:21 评  -5  分
引用 删除 Guest    /   2010-01-13 16:58:07 评  5  分
引用 删除 Guest    /   2009-10-20 09:58:48 评  5  分
引用 删除 Guest    /   2009-07-21 12:13:49 评  5  分
引用 删除 Austin    /   2009-07-01 19:27:30 $(document).ready(function(){
  function bind(){
    $("xxx").bind("click",function(){//////});
  }
  function unbind(){
    $("xxx").unbind("click");
  }
  bind();
}
这样绑定事件,HTML结构变化后执行
unbind();
bind();
就可以了。先取消绑定,再绑定一次,实现rebind 引用 删除 Guest    /   2009-06-23 10:03:00 评  5  分
引用 删除 Guest    /   2009-05-15 11:33:51 评  5  分

查看全部评论

 

-5 -3 -1 - +1 +3 +5

评分: 0

我来说两句

显示全部

                                     

 

内容  

昵称  

验证    

  阅读:43次