如何绑定事件
1、ele.onxxx = function (event) {}
1)兼容性很好,但是一个元素只能绑定一个事件处理程序
2)基本等同于写在 HTML 行间上
2、ele.addEventListener(type, fn, false);里面可以填三个参数,IE9 以下不兼容,可以为一个事件绑定多个处理程序
ele.addEventListener 不能给同一个函数绑定多次,重复的绑定一个函数就不能用了
3、ele.attachEvent(‘on’ + type, fn);
IE 独有,一个事件同样可以绑定多个处理程序,同一个函数绑定多次都可以
事件处理程序的运行环境
1、ele.onxxx = function (event) {}
程序 this 指向是 dom 元素本身(指向自己)
2、obj.addEventListener(type, fn, false);
程序 this 指向是 dom 元素本身(指向自己)
3、obj.attachEvent(‘on’ + type, fn);
程序 this 指向 window
解除事件处理程序
1、ele.onclick = false/‘’/null; ==> 解除 ele.onxxx = function (event) {}
2、ele.removeEventListener(type, fn, false);==>解除 addEventListener(type, fn, false)
3、ele.detachEvent(‘on’ + type, fn); ==> obj.attachEvent(‘on’ + type, fn);
注:若绑定匿名函数,则无法解除
事件处理模型 — 事件冒泡、捕获(不能同时存在)
1、事件冒泡:
结构上(非视觉上)**嵌套关系的元素,会存在事件冒泡的功能,即同一事件,自子元素冒泡向父元素。(自底向上)
结构上存在父子关系的元素,如果点击到子元素,会一级级向父元素传递这个事件(从代码的角度是自底向上一层层冒泡的)
2、事件捕获:(只有谷歌有,最新火狐有)
1)结构上(非视觉上)嵌套关系的元素,会存在事件捕获的功能,即同一事件,自父元素捕获至子元素(事件源元素)。(自底向上)
2)IE 没有捕获事件
一个对象的一个事件类型,只能存在一个事件处理模型(冒泡或捕获)obj.addEventListener(type, fn, true);第三个参数为 true 就是事件捕获
3、触发顺序,先捕获,后冒泡
同一个对象的一个事件处理类型,上面绑定了两个事件处理,分别执行事件冒泡和事件执行
4、focus,blur,change,submit,reset,select 等事件不冒泡
取消冒泡和阻止默认事件
2)IE 独有 event.cancelBubble = true;【实际上谷歌也实现了】
2、阻止默认事件:
1)默认事件 — 表单提交,a 标签跳转,右键菜单等
2)return false; 兼容性非常好,以对象属性的方式注册的事件才生效(这是句柄的方式阻止默认事件,只有句柄的方式绑定事件才好使)
3)event.preventDefault(); W3C 标注,IE9 以下不兼容
4)event.returnValue = false; 兼容 IE
事件对象
非 ie 浏览器会把事件对象(记载了数据发生时的状态和信息)打包传到参数里面去。ie 浏览器在 window.event 里面储存事件对象。
1、event || window.event 用于 IE
window.event 用于 IE,event 只能用于非 ie 浏览器
2、事件源对象:(找事件源对象的方法)
event.target 火狐独有的
event.srcElement Ie 独有的
这俩 chrome 都有
事件委托