给Jquery动态添加的元素添加事件

来源:[http://wangqixia.diandian.com/post/2011-05-10/6597866]

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

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 >

通常,我会这么绑定

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

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

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

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

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

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

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

  1. <td><buttonclass="del">删除</button></td>
    1. jQuery(function($){
    2. //第四个表格的删除按钮事件绑定
    3. $("#table4").click(function(e) {
    4. if (e.target.className=="del"){
    5. $(e.target).parents("tr").remove();
    6. };
    7. });
    8. //第四个表格的添加按钮事件绑定
    9. $("#add4").click(function(){
    10. $("#table4>tbody").append('<tr><td>新增行</td><td><button class="del">删除</button></td></tr>')
    11. });
    12. })

给Jquery动态添加的元素添加事件的更多相关文章

  1. jquery动态生成的元素添加事件的方法

    动态生成的元素如果要添加事件,要写成 $(document).on("click", "#txtName", function() { alert(this.v ...

  2. 用JQuery动态为选中元素添加/删除类

    在做一些tab页功能时,我们经常会见到如下样式: 即当选中一个元素时,在此元素下会添加相应的类,以示区别.今天就研究了一下如何用JQuery实现此效果. 1. HTML代码 <a id=&quo ...

  3. Jquery 动态生成的元素绑定事件

    使用 on方法 $("#id1").on("click","#id2",function(){}) 这里要注意的是#id1必须是原来就存在的 ...

  4. 用jquery动态生成的元素绑定事件

    $(document).on("click",".class a",function(){ })

  5. Jquery动态添加的元素绑定事件的3种方法

    假设我们点击li标签,弹出他的文本,如果是动态添加的li,点击是没有效果的,压根弹不出来文本. 下面博主分享一下为动态添加的元素绑定事件的三种方法,网上一般都是两种,我在这里多增加了一种. 事件案例: ...

  6. [转载]给Jquery动态添加的元素添加事件

    原文地址:给Jquery动态添加的元素添加事件作者:小飞侠 我想很多人都会向我一样曾经 被新元素的事件绑定困惑很久也就是在页面加载完成后给元素绑定了事件,但又新增加的元素上却没有绑定任何事件. js的 ...

  7. jquery无法为动态生成的元素添加点击事件的解决方法

    遇到 jquery无法为动态生成的元素添加点击事件,谷歌一下,整理一下解决方法如下: (<li>中间的元素是动态生成的), 现在想为<i>添加点击事件, 例子如下: <d ...

  8. jquery append 动态添加的元素绑定事件on

    用jquery添加新元素很容易,面对jquery append 动态添加的元素事件on 不起作用我们该如何解决呢?on方法中要先找到原选择器(如例.info),再找到动态添加的选择器(如列.delet ...

  9. jQuery 为动态添加的元素绑定事件

    在使用jquery的方式为元素绑定事件时,我经常使用bind或者click,但这只能为页面已经加载好的元素绑定事件.像需要用ajax的方式请求远程数据来动态添加页面元素时,显然以上几种绑定事件的方式是 ...

随机推荐

  1. [转]win 10 开始菜单(Win 7风格)增强工具 StartIsBack++ v1.3.4 简体中文特别版

    Windows10开始菜单增强工具StartIsBack++现已更新至v1.3.4,最近主要修复在Win10周年更新版上恢复睡眠后任务栏通知中心按钮消失的问题.升级版对StartIsBack+全新构建 ...

  2. BZOJ 4698: Sdoi2008 Sandy的卡片

    4698: Sdoi2008 Sandy的卡片 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 106  Solved: 40[Submit][Stat ...

  3. Codeforces Round #342 (Div. 2) B. War of the Corporations(贪心)

    传送门 Description A long time ago, in a galaxy far far away two giant IT-corporations Pineapple and Go ...

  4. XSS攻击测试代码

    '><script>alert(document.cookie)</script>='><script>alert(document.cookie)&l ...

  5. DataTable的过滤需要的数据

    DataView dv = datatable.DefaultView;           (1)      dv.RowFilter = "RowsId>3";  //此 ...

  6. sphinx 配置文件全解析

    sphinx的配置文件是在配置的时候最容易出错的了: 我们先要明白几个概念: source:数据源,数据是从什么地方来的. index:索引,当有数据源之后,从数据源处构建索引.索引实际上就是相当于一 ...

  7. C语言基础(2)-常量

    常量就是在程序运行中不可变化的量. #define #define MAX 100 定义了一个常量名字叫MAX,值是100,用#define定义的常量一般用大写字母. #define是一个预编译指令, ...

  8. [UML]UML系列——用例图中的各种关系(include、extend)

    用例图中的各种关系 一.参与者与用例间的关联关系 参与者与用例之间的通信,也成为关联或通信关系. 二.用例与用例之间的关系 包含关系(include) 扩展关系(extend) 包含关系 (1)  概 ...

  9. Spring 入门知识

    ------------------------------------------------------------------------------------- Spring是什么? Spr ...

  10. JS高级群的日常

    北京-z兄*10031*33) 2015/6/5 13:38:01北京-逍遥君武*5611*7) 2015/6/5 13:3*:082上海-goesby<woshixuleijava@****. ...