事件流
事件流描述的是从页面中接收事件的顺序。大家都知道,IE这家伙就是搞特殊,于是出现了两个版本,(不可忽视IE所带来的积极的作用,哈哈)
- IE的事件冒泡流
- Netscape的事件捕获流
实际上,这两个就是我后来晓得的DOM事件流,在DOM2级事件中,规定了事件流包括了的三个阶段,事件捕获阶段,处于目标阶段,事件冒泡阶段。(虽然DOM2中规定了事件从document开始,但大多数浏览器都是从window对象开始捕获的,还有也规定也要求捕获阶段不会涉及事件目标,但大多数浏览器也都在捕获阶段触发了对象上的事件,结果就是说,有两个机会在目标对象上面操作事件)-参考JS高级编程
--图片来自网络
事件处理程序
- HTML的事件处理程序,就是将js写在HTML中
- DOM0级的事件处理程序
element.click = function(){} - DOM2级的事件处理程序
element.addEventListTener('click',function(){},false)最后一个布尔参数代表是否在捕获阶段调用事件处理函数,一般为false,就是在冒泡阶段调用这个事件处理函数IEelement.attachEvent('onclick',function(){})(DOM2级的好处就是可以添加多个事件处理函数,但是如果想要调用removeEventListener来移除之前添加的事件,则需要将函数以函数变量的形式提取出来,只将函数名作为参数传入)
someFun = function(){}
element.addEventListener('click',someFun,false)
element.removeEventListener('click',someFun,false)
- DOM3级就是新添了很多时间,例如Keyup等
event事件对象
上面所说的事件的处理函数中,会有一个默认的event对象
element.click = function(event){
event.preventDefault() 取消事件的默认行为
event.stopPropagation() 取消事件的进一步的捕获或者冒泡
event.stopImmediatePropagation() 取消事件的进一步的捕获或者冒,同事阻止任务事件处理程序被调用,(就是加入这个元素绑定了两个处理函数,使用这个会阻止另一个触发)
event.currentTarget 事件绑定的那个元素上
event.target 当前点击的元素,它和上面那个大哥常用于事件委托优化
}
自定义事件
var eve = new Event('test')
element.addEventListener('test',function(){})
触发
element.dispatcher(eve)
有的时候面试会问Event和CustomEvent的区别,就是后者可以携带参数
// create and dispatch the event
var event = new CustomEvent("cat", {
detail: {
hazcheeseburger: true
}
});
// add an appropriate event listener
obj.addEventListener("cat", function(e) {});
obj.dispatchEvent(event);