一、绑定事件
动态添加元素绑定事件,原理是事件委托,就是说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事件
}
}