JavaScript 事件绑定与解绑,事件委托
B站关联视频教程:https://www.bilibili.com/video/BV1RA41137yd?p=20
目录:
一、事件的构成 (事件源 事件动作 事件处理动作)
3、addEventListener事件侦听绑定 为同一个对象的同一个事件绑定多个事件处理程序
4、for/event属性方式定义【废弃,不推荐】
事件委托原理: 利用冒泡的原理,把事件加到父级上,触发执行效果。
事件委托的好处:
1、实现对未来元素事件的绑定
未来元素:绑定事件时,页面上还不存在的元素
2、减少事件绑定,提高性能。
内容:
<a onClick="abc();">onClick点击</a> <script> function abc(){ alert('iT问答网欢迎您'); } </script>
<a>就是事件源
onClick就是事件动作
abc就是处理动作【注:这里abc是自定义函数】
onClick 单击 alert("hello"); onDblClick双击 contextmenu文本菜单 只有火狐支持 onMouseOver onMouseOut
<a onClick="alert('iT问答网欢迎您');">onClick点击</a>
onkeypress //兼容性不太好,如ie10不行 onkeyup //键盘弹起 onkeydown //键盘按下 <script> document.onkeydown=function(){ alert("it问答网"); } </script>
如下:按键盘"任意键"都会弹出 it问答网
<script> document.onkeydown=function(){ alert("it问答网"); } </script>
如下:只有按下键盘”回车键“会弹出 it问答网
<script> document.onkeydown=function(e){ //e参数必填项 if(e.keyCode==13){ alert("it问答网:你已经按下回车键盘了"); } } </script>
onload //文档加载完成之后就会触发该事件 onunload //关闭当前页面前执行的动作 beforeunload //替换当前页之前执行的动作,提醒问你是不是要离开这个页面 提示:onunload、beforeunload浏览器兼容性不好,测试火狐不行,ie10可以 window.onload=function(){ //alert("dd"); } //window.onload是一个事件,当文档加载完成之后就会触发该事件
onFocus 获得焦点时发生的事件 onBlur 失去焦点 onSubmit 提交(事件会在表单中的确认按钮被点击时发生) onChange 改变(select标签值改变)
onFocus
做一个输入框,给输入框绑定一个onFocus事件,当用户触发事件的时候将输入框的背景变为黄色,代码如下:
<input type="text" name="itwenda" onfocus="this.style='background:#cccccc;'" />
onBlur
针对上述的案例,用户失去对input操作的时候激发一个事件
<input type="text" name="itwenda" onfocus="this.style='background:#cccccc;'" onblur="this.style='background:none;'" /> <input type="text" name="itwenda.com"/> <br/> 你先点击第一个input,会看到背景色变灰色; 然后点击第二个input,你会发现第一个背景色就没了。
输入完信息后,我们希望紧跟着就进行判断数据格式是否满足等。也可以用onBlur事件。
绑定:
<a onClick="abc();">学习js-onClick</a> function abc(){ alert("标签上写的"); }
解绑:
取消绑定:document.getElementById("id名").onclick=null; 提示:标签上写的类似js语法,所以结尾加;,当然省略也是可以的。
<h1>绑定与解绑</h1> <a onClick="fangfa1();" id="b1">标签内绑定</a><br/> <a onClick="document.getElementById('b1').onclick=null;alert('解绑成功');">标签内绑定-解绑</a> <script> function fangfa1(){ alert("标签内绑定"); } </script>
绑定:
<a id="ab">对象绑定</a><br/> var ab2=document.getElementById("ab"); ab2.onclick=function(){ alert("对象绑定"); }
解绑:
取消绑定:ab2.onclick=null;
<h1>对象绑定与解绑</h1> <div id="b2">对象b2绑定</div><br/> <div id="b22">对象b2解绑</div> <script> document.getElementById("b2").onclick=function(){ alert("对象b2绑定"); } document.getElementById("b22").onclick=function(){ document.getElementById("b2").onclick=null; alert("解绑成功"); } </script>
ab2.onclick=aa;//aa是函数名
ab2.onclick=bb;//bb是函数名 onclick事件函数会替换
为同一个对象的同一个事件绑定多个事件处理程序。
绑定:
document.addEventListener("click",quxiaoguanbi);
解绑:
document.getElementById("kf").removeEventListener("click",quxiaoguanbi)
<h1>事件侦听绑定与解绑</h1> <div id="b3">事件侦听b3绑定</div><br/> <div id="b32">事件侦听b3解绑</div> <script> document.getElementById("b3").addEventListener("click",quxiao); document.getElementById("b32").addEventListener("click",quxiao2); function quxiao(){ alert(11); } function quxiao2(){ document.getElementById("b3").removeEventListener("click",quxiao); alert("取消事件侦听b3绑定"); } </script>
提示:绑定事件的另一种方法是用 addEventListener() 或 attachEvent() 来绑定事件监听函数。
attachEvent 火狐不支持 ,ie下支持。
var x = document.getElementById("myBtn");
if (x.addEventListener) {
//所有主流浏览器,除了 IE 8 及更早 IE版本
x.addEventListener("click", myFunction);
}else if (x.attachEvent) {
// IE 8 及更早 IE 版本
x.attachEvent("onclick", myFunction);
}
<a id="a1">for/event属性方式定义一个事件过程</a> <script type="text/javascript" for="a1" event="onclick"> alert("t"); </script>
提示:
1、兼容性差,有的浏览器不支持,如:火狐、谷歌浏览器不支持。
2、这种形式中定义的函数将无效。
如何理解事件委托:
有三个同事预计会在周一收到快递。为签收快递,有两种办法:一是三个人在公司门口等快递;二是委托给前台MM代为签收。现实当中,我们大都采用委托的方案(公司也不会容忍那么多员工站在门口就为了等快递)。前台MM收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚至代为付款。这种方案还有一个优势,那就是即使公司里来了新员工(不管多少),前台MM也会在收到寄给新员工的快递后核实并代为签收。
这里其实还有2层意思的:
第一,现在委托前台的同事是可以代为签收的,即程序中的现有的dom节点是有事件的;
第二,新员工也是可以被前台MM代为签收的,即程序中新添加的dom节点也是有事件的。
事件委托原理: 利用冒泡的原理,把事件加到父级上,触发执行效果。
事件委托的好处:
1、实现对未来元素事件的绑定
未来元素:绑定事件时,页面上还不存在的元素
2、减少事件绑定,提高性能。
只在内存中开辟了一个内存空间,节省资源减少DOM操作,提高性能,对于新添加的元素也会有之前的事件(可以把事件绑定给未来元素)
常规写法:
<div id="box"> <input type="button" id="add" value="添加" /> <input type="button" id="remove" value="删除" /> <input type="button" id="move" value="移动" /> <input type="button" id="select" value="选择" /> </div> <script> window.onload = function(){ var Add = document.getElementById("add"); var Remove = document.getElementById("remove"); var Move = document.getElementById("move"); var Select = document.getElementById("select"); Add.onclick = function(){ alert('添加'); }; Remove.onclick = function(){ alert('删除'); }; Move.onclick = function(){ alert('移动'); }; Select.onclick = function(){ alert('选择'); } } </script>
事件委托写法:
一般都是使用 jquery写法。原生的这里只做了解。
<div id="box"> <input type="button" id="add" value="添加" /> <input type="button" id="remove" value="删除" /> <input type="button" id="move" value="移动" /> <input type="button" id="select" value="选择" /> </div> <script> window.onload = function(){ var oBox = document.getElementById("box"); oBox.onclick = function (e) { var e = e || window.event; var target = e.target || e.srcElement; if(target.nodeName.toLocaleLowerCase() == 'input'){ switch(target.id){ case 'add' : alert('添加'); break; case 'remove' : alert('删除'); break; case 'move' : alert('移动'); break; case 'select' : alert('选择'); break; } } } } </script>
总结:什么是事件监听、事件绑定、事件委托?
事件监听: 为同一个对象的同一个事件绑定多个事件处理程序
事件绑定: 对DOM元素绑定事件处理函数 一般分为三种
1、在DOM元素中直接绑定
2、在js中绑定
3、绑定事件监听函数
事件委托: 利用冒泡的原理,把事件加到父级上,触发执行效果
事件委托的好处:
1、实现对未来元素事件的绑定
未来元素:绑定事件时,页面上还不存在的元素
2、减少事件绑定,提高性能
更多建议: