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、减少事件绑定,提高性能
更多建议: