jquery动态添加元素绑定事件学习记录

一、绑定事件

动态添加元素绑定事件,原理是事件委托,就是说jquery将事件绑定到动态生成元素的父元素身上(直到root

根元素均可监听、触发事件),父元素则根据事件目标来判断是否与绑定的元素一致,来决定是否触发事件。但是在使

用过程中,发现如果在绑定的函数中不对事件目标进行判断的话,父元素也会触发该事件,有几级父元素,就有几个父

元素触发该事件。

比如说,页面通过按钮异步查询后端数据,动态添加包含多层关系的元素到节点上,想绑定动态生成的元素最内层

元素的click事件,根据事件冒泡原理,则动态生成的元素从内到外一致到原页面已加载完成父节点整个链条都能触发

click事件,因此在代码中使用$(this)是比较危险的行为,你根本不能判断清除,此次点击事件是谁触发的。

二、示例代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <script src="__PUBLIC__/js/jquery-3.1.1.js"></script>
    <title>Document</title>
    <style type="text/css">
        .box1{
            width: 100%;
            height: 150px;
            background-color: #ccc;
            position: relative;
        }
        .box2{
            width: 850px;
            height: 350px;
            margin: 0 auto;
            background-color: red;
            padding-top:420px; 
            padding-left: 20px;
        }
        .box2 .tar{
            width: 80px;
            height: 80px;
            background: blue;
        }
        .box3{
            padding:30px 30px;
            width: 300px;
            background-color: blue;
            position: absolute;
            top: 150px;
            right: 0;
            /*overflow: hidden;*/
            z-index: 8000;
        }
        .box3 .icon{
            margin:0 0 8px 8px;
            width: 80px;
            height: 80px;
            float: left;
            background: #808080;
            position: relative;
            z-index: 9999;
        }
        .box3 .icon .mark{
            width: 100%;
            height: 100%;
            position: relative;
            background: yellow;
        }
        .btn-group{
            width: 80px;
            height: 30px;
            border: 1px solid black;
            position: relative;
        }
    </style>
</head>
<body>
    <div class="box1">
        <div class="box3">
<!--             <div class="icon"><span class="mark"></span></div>
<div class="icon"><span class="mark"></span></div>
<div class="icon"><span class="mark"></span></div> -->
        </div>
    </div>
    <div class="box2">
        <div class="tar">
            目标区域
        </div>
    </div>
    <div class="btn-group">
        <button class="btn">点击生成</button>
    </div>
    
    <script type="text/javascript">
    var i=1;
    $(function(){
        $('.btn').click(function(){
            var icon = document.createElement('div');
            $(icon).addClass('icon');
            $(icon).attr('data-id','"'+(i++)+'"');
            var mark = document.createElement('span');
            $(mark).addClass('mark');
            $(icon).append(mark);
            $('.box3').append(icon);
        });
        $('.box3').on('click',$('.box3 .icon .mark'),function(e){
            console.log(e.target);
            var offset = $('.tar').offset();
            var start = $(e.target).offset();
            var t = offset.top-start.top;
            var l = start.left-offset.left;
            console.log(start.left,start.top);
            $(e.target).animate({right:'+='+l+'px',top:'+='+t+'px'},'slow','linear',function(evt){
                $('.tar').css('background','#808080');
                $(e.target).remove();
            });
        });
        $('.btn-group').click(function(){
            $('.btn-group').animate({top:'+=30px'});
        });
    });
    </script>
</body>
</html>
以上代码在box3中动态添加<div class="icon"><span class="mark"></span></div>元素,想绑定到span.mark元素

click事件,但是当鼠标点击div.icon、div.box3上时,均能触发click事件,通过打印e.target可以查看触发事件的元素

,通过打印e.target.tagName可以查看触发事件的元素标签。

三、触发对象判断

在绑定的事件函数中,如果仅触发span.mark的click事件,需要在function内做判断

function(e){
  if($(e.target).is('.icon .mark'))
 {
     // span.mark触发click事件
 }else
 {
    //非span.mark触发click事件
 }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值