相信很多人都知道事件代理这个方法,因为在JQuery里面,已经封装好了。
$(父元素).on('click','父元素下的子元素标签名',function(){
...})
但是如果用原生JS来写呢?相信有部分都会懵逼了….因为我曾经也是懵逼的一员
elem.addEventListener(“事件名”,callback,false/true);
为elem元素的指定”事件”,绑定callback回调函数
第三个参数: 设置是否在捕获阶段触发
如果你绑定了一个事件名,类似’click’、’mouseover’….等等一些事件
例如,如果你给某个绑定了click事件,那么当你点击该元素时,首先会从document开始捕获,一直捕获到你点击的目标元素,然后按照捕获阶段反向的顺序,依次执行各级父元素上的事件处理函数
整理下来就是:
2个阶段:
1. 捕获:由外向内,依次记录各级元素绑定的事件处理函数
捕获阶段只到目标元素截止
2. 冒泡: 按照捕获阶段反向的顺序,依次执行各级父元素上的事件处理函数
下面是代码的栗子
<!DOCTYPE HTML>
<html>
<head>
<title>取消与利用冒泡</title>
<meta charset="utf-8"/>
<link rel="stylesheet" href="css/3.css"/>
</head>
<body>
<div id="keys">
<button>1</button>
<button>2</button>
<button>3</button>
<button>4</button><br>
<button>C</button>
<button>+</button>
<button>-</button>
<button>=</button>
</div>
<textarea id="sc" style="resize:none;width:200px; height:50px;" readonly></textarea>
<script>
//为id为keys的元素绑定单击事件为:
keys.addEventListener("click",
function(e){
//获得目标元素,保存在target中
var target=e.target;
//如果target是button
if(target.nodeName=="BUTTON"){
//判断target的内容
switch(target.innerHTML){
case "C"://如果是C
//清除id为sc的内容
sc.value="";
break;
case "="://如果是=
try{
//错误处理
//将id为sc的内容,放入eval中,将结果再保存回id为sc的内容中
sc.value=eval(sc.value)
}catch(err){
//一旦出错
//将错误对象转为字符串,放入id为sc的内容中
sc.value=String(err);
}
break;
default://其他
//将target的内容追加到id为sc的内容中
sc.value+=
target.innerHTML;
}
}
}
);
</script>
<a id="a1" href="#">click me</a>
</body>
</html>
其实冒泡也可以取消。
取消冒泡: 执行完当前元素的事件处理函数后,阻止冒泡向上执行。
e.stopPropagation();