一、事件流
(1)事件冒泡:通俗的讲就是由最具体的元素向上传播至最不具体的节点(文档);
(2)事件捕获:可以理解为事件冒泡反过来,由最不具体至最具体。
二、事件处理程序
(1)HTML事件处理程序
(2)DOM0级事件处理程序
(3)DOM2级事件处理程序
(4)IE级事件处理程序及跨浏览器解决
具体测试代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>事件处理程序</title>
</head>
<body>
<!-- <div id="box">
<input type="button" value="按钮" id="btn" onclick="alert(‘Hello‘)">
</div> -->
<div id="box">
<input type="button" value="按钮" id="btn" onclick="showMes()">
<input type="button" value="按钮2" id="btn2">
<input type="button" value="按钮3" id="btn3">
<a href="http://www.imooc.com/" id="go">跳转</a>
</div>
<script type="text/javascript">
//事件处理程序
//(1)HTML事件处理
function showMes(event){
alert(event.target.nodeName);
event.stopPropagation();//阻止冒泡
}
function showBox(){
alert("测试出现冒泡");
}
function stopGoto(event){
event.stopPropagation();//阻止冒泡
event.preventDefault();//阻止默认事件
}
//(2)DOM0级事件处理
var btn2=document.getElementById("btn2");//取得btn2按钮对象
var btn3=document.getElementById("btn3");
var box=document.getElementById("box");
var go=document.getElementById("go");
btn2.onclick=function(){ //给btn2添加onclick属性
alert(‘Hello‘);
}
btn2.onclick=‘null‘;//消除onclick属性
// //(3)DOM2级事件处理
// var btn3=document.getElementById("btn3");
// btn3.addEventListener(‘click‘,showMes,false);
// btn3.addEventListener(‘click‘,function(){
// alert(this.value);
// },false);
// //删除事件
// //btn3.removeEventListener(‘click‘,showMes,false);
// //(4)IE事件处理
// var btn3=document.getElementById("btn3");
// btn3.attachEvent(‘onclick‘,showMes);
// btn3.detachEvent(‘onclick‘,showMes);
var eventUtil={
//添加句柄
addHandler:function(element,type,handler){
if (element.addEventListener) {
element.addEventListener(type,handler,false);
}else if (element.attachEvent) {
element.attachEvent(‘on‘+type,handler);
}else{
element[‘on‘+type]=handler;
}
},
//删除句柄
removeHandler:function(element,type,handler){
if (element.removeEventListener) {
element.removeEventListener(type,handler,false);
}else if (element.detachEvent) {
element.detachEvent(‘on‘+type,handler);
}else{
element[‘on‘+type]=‘null‘;
}
}
}
eventUtil.addHandler(btn3,‘click‘,showMes);//添加事件
eventUtil.addHandler(box,‘click‘,showBox);
eventUtil.addHandler(go,‘click‘,stopGoto);
// eventUtil.removeHandler(btn3,‘click‘,showMes);//删除事件
</script>
</body>
</html>
三、事件对象
(1)DOM中的事件对象
a.type属性:用于获取事件类型
b.target属性:用于获取事件目标
c.stopPropagation()方法 用于阻止事件冒泡
d.preventDefault()方法 阻止事件的默认行为
(2)IE中的事件对象
a.type属性:用于获取事件类型
b.srcElement属性:用于获取事件目标
c.cancelBubble()方法 用于阻止事件冒泡
d.returnValue()方法 阻止事件的默认行为
整理后的代码如下:
HTML文件.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="js/script.js"></script>
<script src="js/event.js"></script>
<title>事件处理程序</title>
</head>
<body>
<!-- <div id="box">
<input type="button" value="按钮" id="btn" onclick="alert(‘Hello‘)">
</div> -->
<div id="box">
<input type="button" value="按钮" id="btn" onclick="showMes()">
<input type="button" value="按钮2" id="btn2">
<input type="button" value="按钮3" id="btn3">
<a href="##" id="go">跳转</a>
</div>
</body>
</html>
event.js:
//跨浏览器解决
//事件对象
var eventUtil={
//添加句柄
//添加事件
addHandler:function(element,type,handler){
if (element.addEventListener) {
element.addEventListener(type,handler,false);
}else if (element.attachEvent) {
element.attachEvent(‘on‘+type,handler);
}else{
element[‘on‘+type]=handler;
}
},
//删除句柄
//删除事件
removeHandler:function(element,type,handler){
if (element.removeEventListener) {
element.removeEventListener(type,handler,false);
}else if (element.detachEvent) {
element.detachEvent(‘on‘+type,handler);
}else{
element[‘on‘+type]=‘null‘;
}
},
//获取兼容所有浏览器的事件对象
getEvent:function(event){
return event?event:window.event;
},
//获取事件的类型
getType:function(event){
return event.type;
},
//获取事件来自于哪个元素
getElement:function(event){
return event.target || event.srcElement;
},
//阻止取消事件的冒泡行为
preventDefault:function(event){
if (event.preventDefault) {
event.preventDefault();
}else{
event.returnValue=false;
}
},
//阻止事件冒泡
stopPropagation:function(event){
if(event.stopPropagation){
event.stopPropagation();
}else{
event.cancelBubble=true;
}
}
}
script.js:
window.onload=function(){
var go=document.getElementById("go");
var box=document.getElementById("box");
eventUtil.addHandler(box,‘click‘,function(){
alert(‘我是整个父盒子‘);
});
eventUtil.addHandler(go,‘click‘,function(e){
e = e || window.event;
alert(eventUtil.getElement(e));
eventUtil.stopPropagation(e);
eventUtil.preventDefault(e);
});
}
原文:http://www.cnblogs.com/td-tkzc/p/5788864.html