给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. Android开发常见问题小结

    1.布局文件 自己写的布局文件无得使用 原因:导入了系统的R文件 修改:将android.R 这句注释 或者删除 2.Activity作为主窗口设置 Activity无法启动,或者要设置Activit ...

  2. 给td添加滚动条

    <td><div style="overflow-y:scroll;height:330px;">test</div></td>

  3. bzoj 3055礼物运送 floyed + 状压DP

    bzoj 3055: 礼物运送 floyed first 设f[i][S]表示取到了S集合中的所有点(不一定是经过的所有点),最后停在了i的最优值. 初始就f[i][{i}] = dis[1][i] ...

  4. 放下恩怨,曝小米中兴投关键性一票让华为顺利取得5G短码控制权

    如果说最近国内科技公司最牛逼最令人振奋的新闻是啥,显然,就是两天前在3GPP RAN1 87次会议的5G短码方案讨论中,华为顺利碾压高通,战胜列强,拿下了5G的控制编码方案的标准. 虽然说,目前,华为 ...

  5. .Net 中的反射(动态创建类型实例) - Part.4

    动态创建对象 在前面节中,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它.可以说,前面三节,我们学习的都是反射是什么,在接下来的章节中,我们将学习反射可以 ...

  6. 图解JVM的Class文件格式(详细版)

          了解JAVA的Class文件结构有助于掌握JAVA语言的底层运行机制,我在学习的过程中会不断的与ELF文件格式作对比(当然他们的复杂程度.格式相去甚远,比如可执行ELF的符号表解析在静态链 ...

  7. C++11的enum class & enum struct和enum

    C++11的enum class & enum struct和enum C++标准文档--n2347(学习笔记) 链接:http://www.open-std.org/jtc1/sc22/wg ...

  8. css3 动画效果 定义和绑定执行

    首先要定义一个动画效果  keyframes 关键字 这里动画效果执行完毕后 恢复本身的css样式  有的动画效果 移动到位置 要保持 就需要写好css 元素的位置 css里直接写  (这里是一般的 ...

  9. 【转】ASP.NET MVC学习笔记-Controller的ActionResult

    1. 返回ViewResult public ActionResult Index()   {       ViewData["Message"] = "Welcome ...

  10. js自动闭合html标签,自动补全html标记

    假如我有一个DIV,如果没有闭合后面的样式都会乱了,这样的代码可能会影响后面的样式,我希望用js去自动闭合这种没有闭合的标签: 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 ...