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 - ...
随机推荐
- 网络知识: 物理层PHY 和 网络层MAC
PHY模块简介 物理层位于OSI最底层,物理层协议定义电气信号.线的状态.时钟要求.数据编码和数据传输用的连接器. 物理层的器件称为PHY. 上图里的灰色方框图里的就是PHY芯片内部模块图. MAC器 ...
- Android:内存控制及OOM处理
1. OOM(内存溢出)和Memory Leak(内存泄露)有什么关系? OOM可能是因为Memory Leak,也可能是你的应用本身就比较耗内存(比如图片浏览型的).所以,出现OOM不一定是Me ...
- 关于axis2.1.6与websphere7的包冲突问题的解决方式
1,复制axis2.1.6内的module目录内的全部文件到lib 并改动扩展名为.jar 2,删除module目录(可选,不删除也能够) 3,部署到was 4,设置was相应应用程序的类载入方案为父 ...
- 那条linq语句为啥这么慢
目前所在的项目大量使用了linq,结果有个地方出现了严重的性能问题.一个统计需要3.40秒.头头焦头烂额之际,也让我看看. 我向来喜欢性能调优,自诩编码极为注重性能.曾几何时,也动不动就把性能挂在嘴边 ...
- 第一个get请求的爬虫程序
一:urllib库: urllib是Python自带的一个用于爬虫的库,器主要作用就是可以通过代码模拟浏览器发送请求.其被用到子模块在Python3中的urllib.request和urllib.pa ...
- rip是典型的距离矢量动态路由协议。Ospf是链路状态型的协议
网络工程师十个常见面试问题-看准网 https://m.kanzhun.com/k-mianshiwenti/1465113.html 两者都属于IGP协议,rip是典型的距离矢量动态路由协议.Osp ...
- Win7下安装iMac系统
首先是灰常激动啊,一下午的努力最终在自己华硕的笔记本上安装了mac系统. 先上一个成果截图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXl4aGh4/ ...
- codeforces 125 A-E 补题
A Measuring Lengths in Baden 进制转换 水题 #include<bits/stdc++.h> using namespace std; int main() { ...
- hdu5335(搜索)
Walk Out Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- css3 vw -----解决页面滚动出现跳动的bug
100vw相对于浏览器的window.innerWidth,是浏览器的内部宽度,注意,滚动条宽度也计算在内!而100%是可用宽度,是不含滚动条的宽度. demo: h1{font-size:8vw;} ...