事件就是Web浏览器通知应用程序发生了什么事情。DOM定义了一些事件,允许开发者通过给事件绑定事件处理函数,来指定当触发了该事件时,所要调用的函数。首先理解什么是事件流:
事件流描述的是从页面中接受事件的顺序。事件流分为两种:事件冒泡流,事件捕获流。
<input type="button" <span style="color:#3333ff;">οnclick="alert('HTML事件处理程序')" value="按钮"/>
也可以将函数作为HTML标签属性,代码如下:
<input type="button" id="btn" <span style="color:#3333ff;">οnclick="showMessage();" value="按钮" />
<script type="text/javascript">
function showMessage(){
alert("HTML事件处理程序");
}
</script>
通过代码可以发现,HTML事件处理程序将HTML和JS混合在一起。而客户端编程的通用风格是保持HTML内容和JS行为分离,所以在开发过程中,应避免使用此方法。
<input type="button" id="btn1" value="按钮1" /></span>
<script type="text/javascript">
var btn1 = document.getElementById("btn1");
<span style="color:#3333ff;">btn1.onclick</span> = function(){
alert("DOM0级事件处理程序");
}
</script>
通过代码可以发现,DOM0级事件处理程序将HTML和JS分离开了,并且拥有跨浏览器的优势。
<input type="button" id="btn2" value="按钮2" />
var btn2 = document.getElementById("btn2");
btn2.addEventListener("click",showMessage1,false);
function showMessage1(){
alert("DOM2级事件处理程序");
}
要想删除注册了的事件处理程序,使用removeEventListener()方法,参数应该和注册事件处理程序时参数一样,代码如下:
btn2.removeEventListener("click",showMessage1,false);
<input type="button" id="btn3" value="按钮3" />
var btn3 = document.getElementById("btn3");
btn3.attachEvent("onclick",showMessage2);
function showMessage2(){
alert("IE事件处理程序");
}
要想删除注册了的事件处理程序,使用detachEvent()方法,参数应该和注册事件处理程序时参数一样,代码如下:
<span style="font-family:Comic Sans MS;font-size:14px;color:#3333ff;">btn3.detachEvent("onclick",showMessage2);</span>
<input type="button" id="btn4" value="按钮4" />
var domEvent = {
//注册事件处理程序,传入3个参数,表示对象,事件类型,函数
addListener:function(ele,type,hander){
if(ele.addEventListener){
ele.addEventListener(type,hander,false);
}else if(ele.attachEvent){
ele.attachEvent("on"+type,hander);
}else{
ele["on"+type] = hander;
}
},
//删除事件处理程序
removeListener:function(ele,type,hander){
if(ele.removeEventListener){
ele.removeEventListener(type,hander,false);
}else if(ele.detachEvent){
ele.detachEvent("on"+type,hander);
}else{
ele["on"+type] = null;
}
}
}
var btn4 = document.getElementById("btn4");
domEvent.addListener(btn4,"click",showMessage3);
function showMessage3(){
alert("跨浏览器的事件处理程序");
}
其中,有几个细节需要注意:
<div id="box">
<input type="button" id="btn5" value="按钮5" />
</div>
var box = document.getElementById("box");
var btn5 = document.getElementById("btn5");
domEvent.addListener(box,"click",showMessage5);
domEvent.addListener(btn5,"click",showMessage4);
function showMessage4(event){
alert(event.type);
alert(event.target);
}
function showMessage5(){
alert("这是box调用的方法");
}
发现:首先弹出click,然后弹出[object HTMLInputElement],最后弹出“这是box调用的方法”。可以看出,click事件从input节点冒泡到了其父节点div,并触发了该节点的click事件的事件处理程序。可以使用stopPropagation()方法来阻止事件冒泡,改变showMessage4(),代码如下:
function showMessage4(event){
alert(event.type);
alert(event.target);
event.stopPropagation();
}
<pre name="code" class="html">function showMessage4(event){
alert(event.type);
alert(event.srcElement);
event.cancelBubble;
}
var objectEvent = {
//跨浏览器注册事件处理程序
addListener:function(ele,type,hander){
if(ele.addEventListener){
ele.addEventListener(type,hander,false); //如果浏览器支持DOM2级事件处理程序,则调用DOM2级事件处理程序
}else if(ele.attachEvent){
ele.attachEvent("on"+type,hander); //IE事件处理程序
}else{
ele["on"+type] = hander; //DOM0级事件处理程序
}
},
//跨浏览器删除事件处理程序
removeListener:function(ele,type,hander){
if(ele.removeEventListener){
ele.removeEventListener(type,hander,false);
}else if(ele.detachEvent){
ele.detachEvent("on"+type,hander);
}else{
ele["on"+type] = null;
}
},
//跨浏览器获取事件对象event
getEvent:function(e){
return e = e || window.event; //由于DOM与IE中的时间对象有区别,并且在IE中必须通过window.event得到
// return e?e:window.event;
},
//跨浏览器获取事件对象的类型
getType:function(e){
return e.type;
},
//跨浏览器获取事件对象的目标
getTarget:function(e){
return e.target || e.srcElement;
// e.target?e.target:e.srcElement;
},
//跨浏览器阻止事件冒泡
stopPropagation:function(e){
if(e.stopPropagation){
e.stopPropagation();
}else if(e.cancelBubble){
e.cancelBubble;
}
},
//跨浏览器阻止事件的默认行为
preventDefault:function(e){
if(e.preventDefault){
e.preventDefault();
}else if(e.returnValue){
e.returnValue;
}
}
}
var btn5 = document.getElementById("btn5");
var box = document.getElementById("box");
objectEvent.addListener(box,"click",showMessage5);
objectEvent.addListener(btn5,"click",showMessage4);
function showMessage4(event){
event = objectEvent.getEvent(event);
alert(objectEvent.getType(event));
alert(objectEvent.getTarget(event).nodeName);
objectEvent.stopPropagation(event);
}
function showMessage5(){
alert("这是box的调用的方法");
}
因篇幅问题不能全部显示,请点此查看更多更全内容