13章

< body >
< button id= "mybtn" value= "hi" ></ button >
</ body >
< script >
var btn= document. getElementById( "mybtn");
btn. onclick= function(){ alert( this. id);}
< / script >

btn.οnclick=null;  //删除事件处理程序,再点击按钮不会有任何动作发生

addEventListener()

< body >
< button id= "mybtn" value= "hi" >fvfvfv </ button >
</ body >
< script >
var btn= document. getElementById( "mybtn");
btn. addEventListener( "click", function(){ alert( this. id);}, false);
btn. addEventListener( "click", function(){ alert( "hello");}, false); //这两个事件处理程序会按照添加它们的顺序触发,,因此首先显示元
素的ID,其次会显示“hello”的消息。
< body >
< button id= "mybtn" value= "hi" >fvfvfv </ button >
</ body >
< script >
var btn= document. getElementById( "mybtn");
btn. addEventListener( "click", function(){ alert( this. id);}, false);
btn. addEventListener( "click", function(){ alert( "hello");}, false);

通过addEventListener()添加的事件处理程序只能使用removeEventListener()来移除

btn.removeEventListener("click",function(){alert(this.id);},false);//由于第二个参数是匿名函数,所以第二个参数删除无效。


< body >
< button id= "mybtn" value= "hi" >fvfvfv </ button >
</ body >
< script >
var btn= document. getElementById( "mybtn");
var handler= function (){ alert ( this . id );}
btn. addEventListener( "click",handler, false); //有效

attachEvent()与DOM0级方法的区别:

1.作用域。前者作用域会在全局作用域中运行,后者作用域会在其所属元素的作用域内运行。

2.执行顺序。前者是以相反的顺序被触发,后者是以添加它们的顺序执行。

3.前者第一个参数click,后者第一个参数onclick.

4.前者2个参数,默认是false(冒泡),后者三个参数。

< body >
< button id= "mybtn" value= "hi" >fvfvfv </ button >
</ body >
< script >
var btn= document. getElementById( "mybtn");
btn. attachEvent( "onclick", function(){ alert( this=== window);});
btn. attachEvent( "onclick", function(){ alert( "hello");}); //这两个事件处理程序会按照添加它们的顺序相反顺序触发,,因此首先显示“hello”,其次会显示 this=== window
btn.detachEvent("onclick",function(){alert("hello");});
< / script >

detachEvent()移除attachEvent().

var hanlder= function(){ alert( "hello");}
btn. detachEvent( "onclick", hanlder);

跨浏览器的的事件处理程序

< body >
< button id= "mybtn1" value= "hi" >11111 </ button >
< button id= "mybtn2" value= "hi" >2222 </ button >
< button id= "mybtn3" value= "hi" >3333 </ button >

</ body >
< script >
function handler(){
alert( "wudagou");
}
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; }

}
}
var btn1 = document. getElementById( "mybtn1");
var btn2 = document. getElementById( "mybtn2");

var btn3 = document. getElementById( "mybtn3");
btn2. onclick = function () { EventUtil. addHandler( btn1, "click", handler); }

btn3. onclick= function(){ EventUtil. removeHandler( btn1, "click", handler);}

< / script >

事件类型

< script >
var issupport= document. implementation. hasFeature( "HTMLEvents", "2.0");
alert( issupport); //返回true 确定浏览器是否支持DOM2级事件规定的HTML事件
< / script >


< script >
var issupport= document. implementation. hasFeature( "UIEvent", "3.0");
alert( issupport); //返回true 确定浏览器是否支持DOM3级事件规定的HTML事件
< / script >


scroll事件(会在文档滚动期间重复被触动,所以有必要尽量保持事件处理代码的简单)

< script >
EventUtil. addHandler( window, "scroll", function( event){
if( document. compatMode== "CSS1Compat")
{
alert( document. documentElement. scrollTop);
}
else
{
alert( document. body. scrollTop); //safari3.1

};
});
< / script >


确定浏览器是否支持:获得焦点focus和失去焦点blur事件

< script >
var isSupported= document. implementation. hasFeature( "focusEvent", "3.0");
< / script >


鼠标与滚轮事件

click单击

dbclick双击

mousedown按下鼠标按钮时触发

mouseup释放鼠标按钮时触发

mouseenter 鼠标光标首次移入到一个元素范围内时触发

mouseleave 鼠标光标首次移出一个元素范围外时触发

mousemove鼠标移动到一个元素上方时触发

mouseout  鼠标光标移动到一个元素上方,然后用户将其移入另一个元素(可能是前一个元素的外部也可能是这个元素的子元素)时触发



< script >
var isSupported= document. implementation. hasFeature( "MouseEvent", "2.0"); //检验浏览器是否支持上面鼠标事件(除
dbclick/mouseenter/mouseleave外)
< / script >

< script >
var isSupported= document. implementation. hasFeature( "MouseEvent", "3.0"); //检验浏览器是否支持上面所有鼠标事件
< / script >


一个函数处理多个事件,可以使用type属性,通过检测event.type属性,让函数能够确定发生了什么事件

< body >
< button id= "mybtn" >vvvv </ button >
</ body >
< script >
var btn= document. getElementById( "mybtn");
var handler= function( event){
switch( event. type){
case "click":
alert( "clicked");
break;
case "mouseover":
event. target. style. backgroundColor= "red";
break;
case "mouseout":
event. target. style. backgroundColor= "";
break;

}
}
btn. onclick= handler;
btn.on mouseover= handler;
btn.on mouseout= handler;
< / script >


DOM阻止事件的默认行为:preventDefault()或cancelable=true

< body >
< link rel= "stylesheet" href= "http://www.baidu.com" id= "mylink" >
</ body >
< script >
var link= document. getElementById( "mylink");
link. onclick= function( event){
event. preventDefault();
}
< / script >

stopPropagation()立即停止事件在dom层次中的传播

< body >
< button id= "mybtn" ></ button >
</ body >
< script >
var btn= document. getElementById( "mybtn");
btn. onclick= function( event){
alert( "clicked");
event. stopPropagation(); //弹出
};
document. body. onclick= function(){
alert( "body clicked"); //不弹出
}
< / script >


事件对象的eventPhase属性,用来确定事件当前位于事件流的哪个阶段。

< body >
< button id= "mybtn" ></ button >
</ body >
< script >
var btn= document. getElementById( "mybtn");
btn. onclick= function( event){
alert( event.event phase); //2
};
btn. addEventListener( "click", function(){
alert( event. eventphase); //1
}, true);
document. body. onclick= function(){
alert( event. eventphase); //3
}
< / script >

DOM0中,event对象作为window对象的一个属性存在。

< body >
< button id= "mybtn" ></ button >
</ body >
< script >
var btn= document. getElementById( "mybtn");
btn. onclick= function(){
var event= window. event;
alert( event. type); //"click"
}
< / script >

IE中使用attachEvent()添加的,那么event对象作为参数被传入事件

< body >
< button id= "mybtn" ></ button >
</ body >
< script >
var btn= document. getElementById( "mybtn");
btn. attachEvent( "onclick", function( event){
alert( event. type); //"click"
});
< / script >

IE阻止默认行为returnvalue=false

< script >
var link= document. getElementById( "mylink");
link. onclick= function(){
event. returnValue= false);
}
< / script >


< script >
var EventUtil={
addHandler: function( element, type, handler){
//省略
},
getEvent: function(){
return event? event: window. event;
},
getTarget: function( event){
return event. target|| event. srcElement;
},
preventDefault: function( event){
if( event. preventDefault){
event. preventDefault();
} else{
event. returnValue= false;
}},
removeHandler: function( element, type, handler){
//省略的代码
},
stopPropagation: function( event){
if( event. stopPropagation){
event. stopPropagation();
} else{
event. canceclBubble= true;
}

}
}
< / script >


< body >
< button id= "mybtn" >dd </ button >
</ body >
< script >
btn. onclick= function(){
event= EventUtil. getEvent( event);
var target= EventUtil. getTarget( event);
}
< / script >


< script >
link. onclick= function(){
event= EventUtil. getEvent( event);
EventUtil. preventDefault( event);
}
< / script >



< body >
< button id= "mybtn" >dd </ button >
</ body >
< script >
btn. onclick= function(){
alert( "gg");
event= EventUtil. getEvent( event);
EventUtil. stopPropagation( event);
}
document. body. onclick= function( event){
alet( "bbbb");
}
< / script >



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值