ES之事件绑定,解除绑定以及事件冒泡、事件捕获
绑定事件的处理方法
任何元素都有事件属性,而绑定事件就是将这个事件与一个函数相连接。
①句柄事件
dom.onXXX = function () {代码块} 以on开头的事件属于句柄事件
兼容性非常好,但是一个事件只能绑定一个处理函数。当绑定多个时后面的会覆盖前面的。
这种方法相当于在HTML的行间添加事件。
在行间的写法<div onclick = "fun();或者'函数里面的执行语句'"></div>
②
dom.addEventListener(事件类型,触发函数,false) IE9以下不兼容
该方法的两种写法:
div.addeventlistener('click',function(){},false)
div.addeventlistener('click',函数引用,false)
一个元素的事件可以绑定多个触发函数,当绑定多个处理事件时,后面的不会覆盖前面的。
如: 下面的两个处理函数不是同一个
div.addeventlistener('click',function(){},false)
div.addeventlistener('click',function(){},false)
但是同一种事件类型用同一个处理事件,只执行一次:
div.addEventListener('click',test,false)
div.addEventListener('click',test,false)
原理:addeventlistenner里面的绑定函数如果是同一个函数,那么后面的覆盖前面的。
③IE独有事件
dom.attachEvent('on'+事件类型,处理函数);
和addeventlistener功能类似,区别是绑定多少个事件就执行多少次。
__________________________________________________________________________
①和②中的处理函数的this指向调用的那个元素,而③中的处理函数的this指向window
解决③中的this指向问题
dom.attachEvent('on' + 事件类型, function (){ 处理函数test.call(dom);})
function test(){console.log(this)//这个this指向dom}
————————————————————————————————————————————————————————————
解除事件绑定方法:
针对①:
dom['on' + type] = null/false; 将这句放在处理函数里面的末尾
针对②:
dom.removeEventListenner(原绑定事件类型,原处理函数引用名,false);//若原处理函数是匿名函数,则无法解除绑定。
针对③:
dom.detachEvent('on' + 事件类型,原处理函数引用名);//若原处理函数是匿名函数,则无法解除绑定。
————————————————————————————————————————————————————————————
鼠标事件:
click点击、mousedown按下、mousemove移动、mouseup松开、
contextmenu右键菜单、mouseover经过、mouseout离开、mouseenter经过、mouseleave离开(后两种是html5的)
click == mousedown + mouseup;
在事件对象中有一个代表鼠标左键或右键或滑轮的属性,当属性值为0,代表左键,为1代表滑轮,为2代表右键。
DOM3规定:click只能监听鼠标左键,要想判断鼠标是按得左键或右键只能用mousedown或mouseup监听
键盘事件:
keydown、keypress、keyup
执行顺序: keydown > keypress > keyup
keydown可以监测到除了fn辅助键之外的其他键,但是keydown无法识别字符的大小写
keypress只能检测到字符类的按键(只要该字符在ascaii码中,就能被监测到),能区分字符大小写。
String.fromCharCode(变量.charcCode) 返回ascaii代码,如果变量时keypress的事件对象,那么按那个键就返回相应的字符。
文本操作事件:
input事件:当在文本框中每进行一次输入或每进行一次删除时,都会触发该事件。
change事件:判断文本框聚焦和失去聚焦时,状态是否发生改变,若改变则执行处理函数。
focus事件 聚焦
bulr事件 失去焦点
—————————————————————————————————————————————————————————————
事件冒泡:
在结构上(非视觉上)嵌套的元素,会存在事件冒泡功能,即同一个事件事件源的子元素会冒泡向父代元素(自底向上)
事件捕获:
在结构上(非视觉上)嵌套的元素,会存在事件捕获功能,即同一个事件从父代元素会捕获至事件源的子元素(自顶向下)
注意点:IE没有捕获功能,并且除了Chrome,其他浏览器的旧版本也没有,新版有捕获功能是因为涉及到了Chrome的webkit内核。
触发顺序:先捕获再冒泡
捕获的写法:dom.addEventListenner(事件类型,处理函数,ture)
冒泡的写法:dom.addEventListenner(事件类型,处理函数,fasle)
不具备冒泡的事件:focus(聚焦)、blur()、change、submit、reset、select。
总结:不是所有事件都会冒泡。
在解决元素拖拽问题时也涉及到另一个“捕获”,为元素设置一个鼠标事件,当鼠标离开该元素,事件就失效了,两种解决办法,
第一种鼠标移动事件放在document元素上,无论鼠标怎么移动该事件都不会失效。
第二种就是“捕获”事件了,但是只有IE能用,为目标元素dom添加setCaputure()方法,无论鼠标在哪儿,
它都会捕获过来,所以为了不干扰其他元素的执行,还需要加上releaseCapture()方法。
————————————————————————————————————————————————————————————
取消事件的冒泡:
方法①:事件对象.stopPropagation(); W3C官方标准,IE9及以下不支持
事件对象:
在每个事件处理函数里面写一个形参,这个形参对我们来说没用,但是系统会自动传递一个事件对象给形参,
这个事件对象里面有很多属性,每一个属性都记载了事件发生时的关键性数据,同时该对象里面还有
一个stopPropagation方法,该方法是用来取消冒泡事件。
方法②:事件对象.cancelBubble = true; IE独有的一个属性。(现在的Chrome也支持)
取消浏览中的默认事件:
方法①:在处理函数的后面加上 return false;//兼容性非常好,但只有句柄绑定能使用。
注意点:该方法只能用于句柄事件,否则无效。比如: dom.onclick = function(){}
方法②:event.preventDefault();//W3C官方标准,IE9及以下不支持
注意点:该方法来也来自同一个事件对象,并且只针对非IE浏览器,
对IE来说,事件发生时的数据保存在window对象的event属性中,所以在处理函数中需要添加一句
var event = e || window.event//e代表保存事件发生时存储数据的那个对象。(只有在全局时,window可以省略不写)
方法③:event.returnValue = false;//兼容IE
a标签的跳转功能就是一个默认事件,可以通过方法①去掉,
也可以这样:<a href = "script:void(false)"></a>//void相当于return,里面的值只要让boolean值为假就行。
————————————————————————————————————————————————————————————
事件源对象 :是事件对象中的其中一个属性。比如点击事件,它记录了鼠标点击的位置,返回的是某个元素,
该元素后面接的是能唯一标识这个元素的选择器。
获取事件源对象的方法:
event.target firefox只有这个方法
event.srcElement IE只有这个方法
这两个方法Chrome浏览器都支持。
在获取事件源对象时,考虑兼容性,应写为 var event = event.target || event.srcElement;
————————————————————————————————————————————————————————————
事件委托:
利用事件冒泡、事件源对象进行处理
优点:
1.性能方面,不需要循环所有的元素,一个个绑定事件。
2.灵活,当有新的子元素时,不需要再为新子元素绑定事件。
例如:一个ul元素里面有无数个li元素,li元素的内容为该元素所在的顺序数字,当点击某个li元素,实现打印该li元素的数字。
实现:在ul上面写一个onclick事件,由于点击li元素会冒泡到ul元素,所以触发了ul的点击事件的处理函数,
而在处理函数中写上获取事件源对象的方法。
ES之事件绑定,解除绑定以及事件冒泡、事件捕获的更多相关文章
- js、jq事件绑定方式总结——以click事件为例
一.JavaScript点击事件绑定方法 1.1 HTML onclick事件属性 <button onclick="clickMe(this)">click me&l ...
- 一个DOM元素绑定多个事件时,先执行冒泡还是捕获
绑定在被点击元素的事件是按照代码顺序发生,其他元素通过冒泡或者捕获“感知”的事件,按照W3C的标准,先发生捕获事件,后发生冒泡事件.所有事件的顺序是:其他元素捕获阶段事件 -> 本元素代码顺序事 ...
- jQuery 学习笔记(5)(事件绑定与解绑、事件冒泡与事件默认行为、事件的自动触发、自定义事件、事件命名空间、事件委托、移入移出事件)
1.事件绑定: .eventName(fn) //编码效率略高,但部分事件jQuery没有实现 .on(eventName, fn) //编码效率略低,所有事件均可以添加 注意点:可以同时添加多个相同 ...
- DOM0级事件绑定之js的onclick事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 页面内部DIV让点击外部DIV 事件不发生(阻止冒泡事件)
如标题的情况,经常发生,尤其是在一些弹出框上面之类的. <script> function zuzhimaopao(){ e.stopPropagation(); } </scrip ...
- 微信小程序~事件绑定和冒泡
[1]事件绑定和冒泡 事件绑定的写法同组件的属性,以 key.value 的形式. key 以bind或catch开头,然后跟上事件的类型,如bindtap.catchtouchstart.自基础库版 ...
- 微信小程序 事件绑定 bind和catch 区别
转自:https://blog.csdn.net/xiaoqiang_0719/article/details/79729592 本文以冒泡事件tap(手指触摸后马上离开,也就是点击事件)为例子来区别 ...
- 微信小程序--阻止冒泡事件
微信小程序事件的使用方式 在组件中绑定一个事件处理函数. 如bindtap,当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数. <view id="tapTest ...
- 微信小程序(16)-- bindtap,catchtap事件绑定的区别
bindtap,catchtap事件绑定的区别,这里就涉及冒泡事件了.bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡. logs.wxml <view cl ...
- 微信小程序学习笔记二 数据绑定 + 事件绑定
微信小程序学习笔记二 1. 小程序特点概述 没有DOM 组件化开发: 具备特定功能效果的代码集合 体积小, 单个压缩包体积不能大于2M, 否则无法上线 小程序的四个重要的文件 *js *.wxml - ...
随机推荐
- 2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016) E.Passwords AC自动机+dp
题目链接:点这里 题意: 让你构造一个长度范围在[A,B]之间 字符串(大小写字母,数字),问你有多少种方案 需要满足条件一下: 1:构成串中至少包含一个数字,一个大写字母,一个小写字母: 2:不 ...
- hadoop第一个例子WordCount
hadoop查看自己空间 http://127.0.0.1:50070/dfshealth.jsp import java.io.IOException; import java.util.Strin ...
- java操作json
import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class ReadJson { public static v ...
- go string []byte相互转换
string 不能直接和byte数组转换 string可以和byte的切片转换 1,string 转为[]byte var str string = "test" var data ...
- mac toad下建表问题
mac toad下创建表,表名会自动多一个双引号,如:tb_test => "tb_test",这个应该是mac系统智能引号问题导致的,目前还没找到解决办法,只能手动用sql ...
- C语言-1.static 和 extern使用,2.文件,3.数据块读写
1.static 和 extern使用, 1)修饰局部变量 static修饰局部变量特点:延长局部变量的生命周期 ,static修饰的局部变量只会被执行一次 extern不能修饰局部变量 2)修饰全局 ...
- 计算机设计思想 —— 代理(proxy)
0. 理解 两个说着不同母语国家的人想要交流通话,各人说着各自的母语显然是无法沟通的,此时需要一个翻译,一个媒介(medium).中介,或者一个代理(proxy),比如通用的国际语言英语,比如全世界人 ...
- 认识虚拟化(virtualization)
0. 基本定义 虚拟化的本质是将现有的计算机资源通过虚拟化的技术分割成若干个计算机资源,这些计算机资源互相独立:其最终目标是提高计算机的利用效率以最大化计算机的灵活性: 虚拟化为数据.计算能力.存储资 ...
- Java:目录
ylbtech-Java:目录 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http://ylbtech. ...
- idea设置控制台不打印日志
这样做的好处是当想打印数据到控制台查看就特别方便,这个在大数据spark sql使用的多.当然如果代码报错也会打印,这个不必担心. 方案Ⅰ 方法是将这个log日志文件放到idea的资源目录里即可 lo ...