在JS架構,事件系統的回調那個事件對象一般不是真正的事件對象。因為為了相容IE,我們要為了它加上許多W3C屬性,即使在標準瀏覽器下,也有許多事件也仿造出來,比如FF下的DOMMouseScroll要變mousewheel, chrome下的mouseover要變mouseenter……有太多東西要相容了,
<!DOCTYPE HTML><html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <style> html,body{ height:100%; background:green; } </style> <script> window.onload = function(){ Event.prototype.xxx = "自訂屬性1" document.addEventListener("click", function(e){ console.log(e); console.log(e.xxx); console.log(e.yyy) console.log(e.zzz) }); var event = document.createEvent("MouseEvent"); event.initEvent("click", true, true,"xxx"); event.yyy = "自訂屬性2" Object.defineProperty(event,"zzz", { value:"自訂屬性3", writable:true, configurable:true }); document.body.dispatchEvent(event) } </script> </head> <body> </body></html>
經測試只要是支援addEventListener的瀏覽器都能綁上這三個屬性。
我們甚至可以通過事件描述符修改事件類型
Object.defineProperty(event,"type", { value:"自訂屬性4", writable:true, configurable:true });