如何为jquery中append()添加的html绑定事件

2017-11-21  本文已影响476人  厨房有只偷吃的猫

1.问题描述:

如图所示,利用jquery实现如下功能:


火狐截图_2017-11-21T02-29-56.437Z.png

会发现,表格的每一行新纪录都是用jquery的append()方法动态的添加上的html,在为每一行的“delete”绑定click事件的时候无法获取新添加的元素。

2.解决方案

方案一:

append追加元素后,紧接着再利用find()方法找到新追加的元素,为其添加事件,具体代码如下:

            $(function(){
                // 删除
                $("a").click(function(){
                    var $tr = $(this).parent().parent();
                    $tr.remove();
                });
                // 添加
                $("#addButton").click(function(){
                    var $name = $("#name").val().length!=0?$("#name").val():null;
                    var $email = $("#email").val().length!=0?$("#email").val():null;
                    var $salary =  $("#salary").val().length!=0?$("#salary").val():null;
                    
                    if($name && $email && $salary){
                        
                        $("<tr></tr").append("<td>"+$name+"</td>")
                        .append("<td>"+$email+"</td>")
                        .append("<td>"+$salary+"</td>")
                        .append("<td><a href='#'>Delete</a></td>")
                        .appendTo("table")
                        .find("a").click(function(){// 删除
                            var $tr = $(this).parent().parent();
                            $tr.remove();
                        });
                    }
                });
                
            });

方案二:

度娘推荐的方法,包含liv()方法和on()方法,为appen()动态添加的元素绑定事件,但是live()方法在 jQuery 版本 1.7 中被废弃,在版本 1.9 中被移除,现用on()方法代替。

on()定义和用法

on() 方法在被选元素及子元素上添加一个或多个事件处理程序。

语法:$(selector).on(event,childSelector,data,function)

自 jQuery 版本 1.7 起,on() 方法是 bind()、live() 和 delegate() 方法的新的替代品。该方法给 API 带来很多便利,我们推荐使用该方法,它简化了 jQuery 代码库。

注意:使用 on() 方法添加的事件处理程序适用于当前及未来的元素(比如由脚本创建的新元素)。

由此可见,可以为新添加的元素绑定事件。但是值得注意的是,该事件是委托在已知选择器获取的父级对象上的。具体如下面代码所示:

$(function(){
                
                var i = 0;
                $(":submit").click(function(){
                    
                    $("table").append($("<tr><td>"+$("#name").val()+"</td><td>"+$("#email").val()+"</td><td>"+$("#salary").val()+"</td><td><a id='"+i+"' href='#'>delete</a></td></tr>"));
                    $("table").on("click","#"+i+"",function(i){
                        $(this).parent().parent().remove();
                    });
                    
                    i++;
                });
                        
            });

可以看到,事件委托在了已存在的“table”上。

上一篇下一篇

猜你喜欢

热点阅读