`
ltl3884
  • 浏览: 135047 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
2号解决方案——事件冒泡法
利用事件冒泡的原理,我们给这个按钮的祖先元素绑定事件处理函数。
然后通过event.target这个对象来判断,这个事件是不是我们要找的对象触发的。
通常可以利用一些DOM属性,比如event.target.className、event.target.tagName等之类的来判断。
<td><buttonclass="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>')
   });
});
=============================
3号解决方案——复制事件法
上面几种方案可以说即便你没有用到jQuery库,你也能相对比较容易的实现。但这种方案相对依赖jQuery的程度更高。而且必须要求jQuery 1.2版以上。低版本jQuery需要插件。
上面两个方案都是对删除函数动了很多脑筋,换了多种触发、绑定的方式。这个方案不同,可以与平时纯静态的元素一样在domready的时候绑定。但在我们添加新行的时候我们改动一下,不再想上面那样拼接字符串来添加新行了。这回我们尝试使用复制DOM元素的方式。并且复制的时候连同绑定的事件一起复制,复制完之后再用find之类的修改内部的元素。
同时,就像这个例子,如果你会把所有元素都删除光,那template这个模板是必须的,如果不会删光,那就未必需要用template了。为了防止被误删,此处我把template设了隐藏。
我使用了jQuery中特有的clone(true)

.template{display:none;}
<trclass="template">
           <td>这里是模板</td>
           <td><button class="del">删除</button></td>
       </tr>
       <tr>
           <td>这行原来就有</td>
           <td><button class="del">删除</button></td>
       </tr>
       <tr>
           <td>这行原来就有</td>
           <td><button class="del">删除</button></td>
       </tr>
jQuery(function($){
   //第五个表格的删除按钮事件绑定
    $("#table5 .del").click(function() {
        $(this).parents("tr").remove();
   });
   //第五个表格的添加按钮事件绑定
    $("#add5").click(function(){
        $("#table5>tbody>tr:eq(0)")
           //连同事件一起复制
            .clone(true)
           //去除模板标记
            .removeClass("template")
           //修改内部元素
            .find("td:eq(0)")
                .text("新增行")
                .end()
           //插入表格
            .appendTo($("#table5>tbody"))
   });
});
=============================
总评:
上面4种方案,各有优劣。
0号方案,结构与行为完全没有分离,而且污染全局命名空间。最不推荐。所以我都不把它当作一个方案来看。但对于js初学者,可以用来项目救急。
1号方案,中规中矩,没啥好也没啥不好
2号方案,这种方法充分的发挥了js事件冒泡的优势。而且效率最高。但同时由于这种方案无视了jQuery强大的选择器,所以如果涉及的元素属性要求过多就会比较麻烦了。你会徘徊在众多if的条件的是非关系之中。后来我想起来,可以用jQuery中的$(event.target).is(selector)来作为条件。这样可以极大提升开发效率,但略微降低执行效率。
3号方案,这是我认为最能体现结构与行为分离的思想的一种方案。但缺点也很明显,对于jQuery依赖性过于高了,要不就自己写一个复制连同事件一起复制的函数,但这也显然对于初学者来说异常困难。但从未来的趋势的角度来看,还是很推荐使用这种方案的。

具体选用哪一个方案,没有定数。具体看你的项目以及你js还有结构与行为分离的思想的掌握程度。最适合的才是最好的。

=============================
附加:
把3号方案改造成完美的结构行为分离的样式。
首先,带有template的是模板元素。他是一切复制的源泉,为了防止被误删,所以设为不可见。如果不会删除光,那么这个模板元素也是可选的。因为你可以复制任何一个已经存在的用于循环元素。
其次,给每个重复的元素加上一个repeat,方便用于删除按钮找到这一级元素。这个是可选的,有时候并不需要。
最后是给每一个要修改的元素加上一个类,便于用find找到。比如我这里就家了content类,新增加的可以修改里边的值。
这样一个完美的结构与行为分离的案例就完成了。

<tableid="table6">
   <tbody id="tbody6">
       <tr class="template repeat">
           <td class="content">这里是模板</td>
           <td><button class="del">删除</button></td>
       </tr>
       <tr class="repeat">
           <td class="content">这行原来就有</td>
           <td><button class="del">删除</button></td>
       </tr>
       <tr class="repeat">
           <td class="content">这行原来就有</td>
           <td><button class="del">删除</button></td>
       </tr>
   </tbody>
   <tfoot>
       <tr>
           <td>&nbsp;</td>
           <td><button id="add6">添加</button></td>
       </tr>
   </tfoot>
</table>
jQuery(function($){
   //第六个表格的删除按钮事件绑定
    $("#tbody6 .del").click(function() {
        $(this).parents(".repeat").remove();
   });
   //第六个表格的添加按钮事件绑定
    $("#add6").click(function(){
        $("#tbody6>.template")
           //连同事件一起复制
            .clone(true)
           //去除模板标记
            .removeClass("template")
           //修改内部元素
            .find(".content")
                .text("新增行")
                .end()
           //插入表格
            .appendTo($("#tbody6"))
   });
});
同样,这段js也适用于如下的html结构

<ulid="tbody6">
   <li class="template repeat">
       <span class="content">这里是模板</span>
       <span><button class="del">删除</button></span>
   </li>
   <li class="repeat">
       <span class="content">这行原来就有</span>
       <span><button class="del">删除</button></span>
   </li>
   <li class="repeat">
       <span class="content">这行原来就有</span>
       <span><button class="del">删除</button></span>
   </li>
</ul>
分享到:
评论
2 楼 defender 2013-11-29  
                  
|
1 楼 a114d 2012-02-10  

相关推荐

    jquery 新建的元素事件绑定问题解决方案

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

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

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

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

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

    AJAX与jquery试题

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

    JQUERY demo+api

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

    jQuery实战中文版.pdf

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

    jquery 教程

    - **新建DOM对象**: 可以使用jQuery动态创建新的DOM元素,并将其插入到页面中。 - **事件处理**: 支持多种事件绑定方式,如`.click()`、`.hover()`等,方便处理用户的交互行为。 - **动画效果**: 提供简单易用的动画...

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

    而事件委托则解决了这个问题,只需要在父级元素(如`&lt;ul&gt;`)上绑定一次事件,所有子元素都能响应该事件。 例如,以下代码展示了事件委托的使用: ```javascript $(function () { // 使用事件委托的方式 $('.list...

    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

    "新建文件夹"可能表示这些文件在解压后存在于一个特定的目录下,开发者需要正确引用这些文件,才能在网页中使用jQuery和相关的插件功能。 5. **使用方法**: 要使用jQuery,需要在HTML中引入`jquery-1.1.3.1.js`,...

    jQuery应用技巧大全

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

    jquery实例

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

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

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

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

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

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

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

    jquery教程

    - **绑定事件**:如 `.click()`, `.hover()`, `.change()` 等方法可以为元素绑定事件。 - **解绑事件**:如 `.off()` 方法可以移除绑定的事件处理函数。 - **动画效果**: - **基本动画**:如 `.fadeIn()`, `....

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

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

    jQuery很漂亮的标签切换样式

    在IT行业中,jQuery是一款非常流行的JavaScript库,它极大地简化了DOM操作、事件处理以及动画效果。这个"jQuery很漂亮的标签切换样式"是一个示例,展示了如何利用jQuery来创建吸引人的用户体验,尤其是对于企业网站...

    jquery 可视化开发工具 ixedit

    通过右侧的属性面板修改元素的样式、属性和绑定的事件。 4. **配置交互**:利用ixEdit的事件编辑器,设置元素之间的交互逻辑,例如点击按钮弹出对话框,或者表单提交时发送Ajax请求。 5. **预览与调试**:在内置的...

Global site tag (gtag.js) - Google Analytics