`

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

阅读更多

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 onclick="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 新建的元素事件绑定问题解决方案

    在DOM加载完成后先给现有的元素绑定事件处理函数,然后在添加新元素时再次为新元素绑定相同事件。这种方法虽然有效,但可能会导致多个事件监听器附加到同一元素上,可能影响性能。例如: ```javascript function...

    jQuery新建文件夹展开缩收代码.zip

    【jQuery新建文件夹展开缩收代码.zip】是一个包含JavaScript特效的资源包,主要利用了jQuery库和Bootstrap.js框架来实现一种模拟文件夹结构的效果。在实际的网页设计和开发中,这种功能常用于构建文件管理系统或者...

    jquery高仿浏览器新建标签页网址缩略图导航特效代码

    jQuery的`$.ajax`或`$.get`方法可以异步获取远程资源,然后将获取到的图标数据绑定到对应的标签页元素上。 5. **收藏功能**:为了实现收藏功能,我们需要存储用户的收藏记录,这可能涉及到本地存储(如localStorage...

    JQUERY demo+api

    3. **事件处理**:jQuery提供了绑定事件的方法,如`$(selector).click(function(){...})`,可以为元素添加点击事件监听器。同时,`$(document).ready()`确保DOM加载完成后再执行函数,避免了页面闪烁问题。 4. **...

    AJAX与jquery试题

    【知识点详解】 1. **jQuery的基本使用*...总结,这个AJAX与jQuery试题主要测试了对jQuery的选择器、DOM操作、事件处理、链式操作以及动态创建元素等基础知识的掌握。解答这些题目需要熟悉jQuery的基本语法和常见API。

    jQuery实战中文版.pdf

    - **事件处理**:利用jQuery可以轻松绑定各种事件处理器。 - **插件扩展**:jQuery提供了丰富的插件机制,可以方便地扩展其功能。 #### 三、jQuery实战应用 - **基础用法**: - 加载jQuery库; - 使用`$(document...

    JQuery事件委托原理与用法实例分析

    在传统的事件绑定方式中,如果一个页面中有多个同类型的可交互元素(如列表项`&lt;li&gt;`),我们通常需要为每一个元素分别绑定事件监听器。但这样会增加内存消耗和处理时间,尤其是当动态添加新的元素时,需要额外绑定...

    jQuery.rar

    1. **jqueryDemo.html**:这可能是一个包含jQuery应用的HTML页面,展示了如何引入jQuery库,并可能包含使用jQuery进行DOM操作、事件绑定和动画效果的实例。 2. **jquery-3.4.1.js**:这是未压缩的jQuery库文件,...

    jquery-1.1.3.1.js,jquery.linscroll.js

    - **事件处理**:通过`.on()`, `.click()`, `.mouseover()`等方法绑定和触发事件。 - **动画效果**:jQuery的`.animate()`方法可以创建自定义动画,`.fadeIn()`, `.slideUp()`等预定义动画则提供常见效果。 2. **...

    jQuery应用技巧大全

    jQuery的事件绑定函数如$.on()、$.off()简化了事件处理。$.on()不仅可以绑定单个事件,还可以一次性绑定多个事件。此外,使用.delegate()或.live()(已被弃用,但理解其原理有益)可以实现事件冒泡和委托,提高性能...

    jQuery新建文件夹展开缩收代码

    // 触发展开/缩收事件绑定 applyFolderBehaviors(); } }); }); }); ``` 在这个例子中,当用户提交表单时,一个新的文件夹名被发送到服务器(这里的URL应替换为实际的API地址),然后在服务器返回成功响应后,...

    jquery实例

    事件委托是jQuery中的一个高级技巧,通过在父元素上绑定事件,可以处理子元素的动态添加和删除,提高代码的灵活性。 动画效果是jQuery的一大亮点。`.fadeIn()`, `.slideUp()`, `.animate()`等方法可以创建出流畅的...

    jQuery新建文件夹展开缩收特效代码

    本文将深入探讨“jQuery新建文件夹展开缩收特效代码”这一主题,这是利用jQuery和Bootstrap.js实现的一个功能,允许用户模拟文件夹的展开与收缩,支持多重嵌套,并提供新建文件夹的功能。 首先,jQuery的核心在于它...

    jQuery的实现原理的模拟代码 -3 事件处理

    在JavaScript中,事件处理通常通过为DOM元素绑定事件监听器来实现,当相应的事件发生时,监听器会触发一个回调函数。 jQuery作为JavaScript的一个库,提供了一套简化事件处理的API。它封装了底层的事件处理细节,并...

    jQuery实现表格行的动态增加与删除(改进版)

    首先,jQuery的选择器和事件绑定是实现这一功能的关键。通过`$(document).ready()`函数确保在DOM加载完成后执行相关代码。`$("#tab tr")`选择表格的所有行,并设置它们的对齐方式为居中。`$("#but")`则选择了带有...

    基于jQuery的学校网站设计与实现

    3. **事件处理**:jQuery简化了事件绑定,如`click()`,`mouseover()`等,还可以使用`.on()`方法处理动态添加的元素的事件。 4. **动画效果**:`.fadeIn()`,`slideUp()`,`animate()`等方法可以创建各种平滑的过渡...

    JS实现为动态创建的元素添加事件操作示例

    `live` 方法允许为尚未存在的元素绑定事件,它会监听到这些元素的祖先元素的事件冒泡,从而触发绑定的事件处理函数。 ```javascript $("#nep").live("click", function() { var that = $(this); console.log...

    jQuery很漂亮的标签切换样式

    这个"jQuery很漂亮的标签切换样式"示例可能包含了以上所有这些元素,通过实际的代码和样式文件,我们可以学习到如何将这些概念应用到实际项目中。不过,由于提供的文件列表中只有"新建文件夹",无法直接查看具体代码...

Global site tag (gtag.js) - Google Analytics