今天想实现一个事件自动订阅到指定class的元素之上的功能。这句话很拗口,稍后解释!javascript
在翻阅了MDN上api说明,多明白了许多细节。java
一、event除了具备目标元素,事件类型,时间,位置等有效值 外,还有 bubbles cancelable
chrome
等 与冒泡相关的属性。在查找事件的来源元素时,chrome有 srcElement 属性, 火狐却没有 srcElement 属性,必须用target。 srcElement返回的是一个Element对象,可是target返回一个Node。 不过编程时,好像是互用的。编程
二、event具备preventDefault stopImmediatePropagation
stopPropagation
这三个方法。api
区别就是:preventDefault:当事件有cancelable=true时, 事件就取消了函数
stopPropagation :事件中止向DOM的上级传播。测试
stopImmediatePropagation: 在当前事件执行的函数中,当即中止传播。(即便当前元素还绑定着其它的函数,函数本应该稍后执行的状况, 后面的函数都会不执行,好霸气的方法) spa
三、用CustomEvent来实现自定义事件。code
假设让el来接收一个blockClicked事件,写法以下:对象
//首先 el.addEventListener("blockClicked", handler, false); //在以后的时间,你进行其它操做时,主动生成一个事件,并推送给el。 var bubble = doc.dispatchEvent( new CustomEvent("blockClicked", {detail: {data:'一些事件有用的信息'}}) );
注意:通过个人测试,dispatchEvent 时,并非将事件推入消息队列,而是同步执行!
执行顺序:
这样就有机会根据上次事件结果,来决定是否终止事件链!
四、dispatchEvent的返回值是boolean
若是事件cancelable=true,且至少有一个事件处理函数调用了Event.preventDefault()
的话,返回false。事件终止传播
其它时候都返回true,事件继续传播下去。
ev = new CustomEvent(eventName, { detail: target, cancelable: true }); result = el.dispatchEvent(ev) //在处理函数里,来决定result的值
五、IE11不支持new CustomEvent()方法。 window对象上存在CustomEvent,但就是不让用。必须用:
var event = document.createEvent('CustomEvent'); event.initCustomEvent('my-event', true, true, {some: '一些有用的信息'});
代替。