深刻理解JS的事件绑定和事件流模型
一、JS活动
(一)JS事件分类
1.鼠标事件:
click/db click/mouse over/mouse out
2.HTML事件:
on load/on nload/on submit/on resize/on change/on focus/on croll
3.键盘事件:
Keydown:键盘按下时触发按键:键盘按下抬起时瞬间触发。键盘向上键:键盘抬起触发器
[注意事项]
执行顺序:向下按键向上按键按键只能捕捉数字、字母、符号按键,不能捕捉功能键。长时间循环执行键下按键有键下,不一定有键上。长时间失去焦点时,将不再触发key up按键区分大小写,keydown和kewup也不会区分。
4.事件因素:
当事件被触发时,默认情况下,事件会将参数传递给事件调用的函数。
该参数是一个事件因子,包含事件的各种细节。
document . onkeydown=function(e){ console . log(e);} document . onkeydown=function(){ console . log(window . event);}//兼容浏览器编写:document . onkeydown=function(e){ e==e | | window . event;var Code=e . key Code | | e . what | | e . charcode;If(代码==13){//回车}}5。如何确定键盘按键?
(1)在启动功能中,接收事件因子e.您可以使用e.key直接转到按下的按键字符(不推荐)。可以使用key code/what/charCode一次获取密钥的ASCII值。
(兼容各种浏览器)
var Code=e . key Code | | e . what | | e . charcode;//判断组合键var isAlt=0,isEnt=0;document . onkeyup=function(e){ if(e . key code==18){ isAlt=1;} if(e . key code==13){ isEnt=1;} if(isAlt==1 send==1){ alert('同时按Alt和Enter键');} } document . onkeyup=function(){ console . log(' keyup ');} document . onkey press=function(){ console . log(' key press ');} document . onkeydown=function(){ console . log(' keydown ');} document . onkey press=function(){ console . log(window . event);}//判断是否按下了enter键document . onkeydown=function(e){ var code=e . key code;如果(代码==13){警报('您输入了回车键');}}
二、事件绑定模型
(一)DOM0事件模型绑定注意事项:
使用window.onload加载,然后绑定。
window . onload=function(){//event }
放在身体后面装订。
//正文内容正文按钮onclick='func()'内联模型绑定/按钮按钮id='btn1 '哈哈哈哈/按钮按钮id='btn2'DOM2模型绑定/按钮id='btn3 '取消DOM2/按钮/正文1。内联模型(内联绑定):直接使用函数名作为html标记中属性的属性值。
Button onclick='func()'内联模型绑定/button缺点:不符合w3c中内容和行为分离的基本规范。
2.脚本模型(动态绑定):在JS中选择一个节点,并向该节点添加onclick属性。
文件。getelementbyid(' BTN 1 ')=function(){ }优点:符合w3c中内容和行为分离的基本规范,实现了html和js的分离。缺点:同一类型的事件只能添加一次到同一个节点。多次添加,最后一次生效。
document.getElementById('btn1 ')。onclick=function(){ alert(1234);}document.getElementById('btn1 ')。onclick=function(){ alert(234);}//重复只能出现一次。3.DOM0有一个共同的缺点:事件一旦被DOM0绑定,就无法取消。
Document.getelementbyid ('btn3 ')。onclick=function(){//匿名函数if(BTN . separavent){ BTN . separavent(' onclick ',func1)无法取消;} else { BTN . removeeventlistener(' click ',func 1);}警报('取消DOM 2 ');} (2) DOM2事件模型
1.添加DOM2事件绑定:
(1)在IE8之前,使用。attachEvent('onclick ',函数);IE8之后,使用。addEventListener('click ',函数,true/false);参数3: false(默认值)表示事件正在冒泡,传入true表示事件被捕获。兼容所有浏览器:
var BTN=document . getelementbyid(' BTN 1 ');if(BTN . attachevent){ BTN . attachevent(' onclick ',func 1);//事件,事件要执行的函数IE8可以} else {BTN。attacheventlistener ('click ',func 1);} 2.dom2绑定的优势:
DOM2可以用于在同一个节点上绑定多个同类型的事件。DOM2绑定的事件可以通过特殊功能取消。3.解除绑定事件绑定:使用attachEvent绑定,使用separate vent取消。使用attachEventListener绑定,用removeEventListenter取消。注意:如果DOM2绑定的事件需要取消,那么在绑定事件时回调函数必须是函数名,不能是匿名函数,因为取消事件时,取消传入函数名即可取消。
第三,JS事件流模型
(一)JS中的事件流模型
1.事件冒泡(fasle/do not write):当触发节点的事件为时,将依次触发其祖先节点从当前节点到DOM根节点的同类型事件。2.事件捕获(true):当一个节点的事件被发送时,它将触发其祖先节点从DOM根节点到当前节点本身的相同类型的事件。3.事件是什么时候冒泡的?事件何时被捕获?(1)当使用addEventListener绑定事件时,第三个参数作为true传递,表示事件捕获;所有其他事件绑定都是事件冒泡。
4.防止事故冒泡:
(1)在ie10之前,e.cancelBubble=trueie10后,e . stopperpagation();
5.阻止默认事件:
ie10之前:e.returnValue=falseie10后:e . preventdefault();
//CSS # div 1 { width : 300 px;height: 300px背景色:粉蓝色;} # div2 { width: 200px高度: 200 px;背景-颜色:深粉色;} # div3 { width: 100px高度: 100像素;背景色-color : # A9a9a 9;}//html div id=' div 1 ' div id=' div 2 ' div id=' div 3 '/div/div/diva href=' 01-event notes . html ' rel=' external no follow ' onclick=' func()' hyperlink/adiv 1 . addevent listener(' click)},false);div2.addEventListener('click ',function(){ console . log(' div 2 click ');},false);Div3。addeventlistener ('click ',function(){//原来的顺序是:3-2-1。//MyParagraventHandler();//拦截事件流后,只触发3。但仍会从2开始冒泡。console . log(' div 3 click ');},false);结果(事件冒泡)(从小到大div 3-"div 2-"div 1):
div1.addEventListener('click ',function(){ console . log(' div 1 click ');},真);div2.addEventListener('click ',function(){ console . log(' div 2 click ');},真);div3.addEventListener('click '),function(){//myparagraventhandler();//拦截事件流后,只触发3。但仍会从2开始冒泡。console . log(' div 3 click ');},真);结果(事件捕获)(从小到大div 3-> div 2-> div 1):
//仍然遵循事件冒泡document . onclick=function(){ console . log(' document click ')}//截取事件流以防止事件冒泡function myparagravithandler(e){ e=e | | window . event;if(e . stopperpagation){ e . stopperpagation();//在//IE10之后} else { e.cancelBubble=true//before//IE10 } }//截取事件流,防止事件冒泡函数myparagravithandler(e){ e=e | | window . event;if(e . stopperpagation){ e . stopperpagation();//在//IE10之后} else { e.cancelBubble=true//之前//IE10 } }//阻塞默认事件functioneventhandler(e){ e=e | | window . event;//防止默认行为if(e . prevent default){ e . prevent default();//之后//IE10 } else { e . return value=false;//之前//IE10}}摘要
以上是边肖介绍的JS的事件绑定和事件流模型。希望对大家有帮助。如果你有任何问题,请给我留言,边肖会及时回复你的!
版权声明:深刻理解JS的事件绑定和事件流模型是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。