一、原生事件的綁定:http://www.javashuo.com/article/p-eoykugzs-x.htmljavascript
a、DOM0級事件:html
1. 行內事件java
2. 元素.on事件名=函數segmentfault
b、DOM2級事件:addEventListener 【removeEventListener,不能移除匿名添加的函數】 。瀏覽器
注意:addEventListener 綁定事件的第三個參數,有過修改。http://www.javashuo.com/article/p-fggfawdm-ec.html 或 https://segmentfault.com/a/1190000017247263?utm_source=tag-newestdom
阻止默認行爲是配合passive使用,http://www.mamicode.com/info-detail-2306048.html函數
二、即時反應的input和propertychange方法 :http://www.javashuo.com/article/p-yjrfalhm-x.htmlpost
三、js自定義一個事件 : 測試
爲何要自定義事件:https://juejin.im/entry/5ad070b56fb9a028db591d49 (事件本質是一種消息)spa
自定義事件的實現: http://www.jb51.net/article/83911.htm 或 http://chayangge.com/2016/04/29/javascript%E8%87%AA%E5%AE%9A%E4%B9%89%E4%BA%8B%E4%BB%B6/ (推薦)
自定義事件須要用到函數Event 和 dispatchEvent。內置的事件會由瀏覽器根據某些操做進行觸發,自定義的事件就須要 js程序 觸發(如,dispatchEvent)。
總結:基於DOM的自定義事件 和 純js實現自定義事件。他們的區別就是,基於DOM的自定義事件,須要addEventListener註冊一個自定義的事件名稱,js控制這個事件觸發。而,
純js實現的事件,就是一個函數的封裝(事件容器)。須要DOM的話,就是DOM原有的事件觸發後調用這個事件容器的函數。其實,原有事件的疊加,也能夠變成自定義的事件。以下面的 3次點擊事件。
四、3次點擊事件實現 :https://blog.csdn.net/xiazhiqiang01/article/details/52527478
原有的事件,結果疊加封裝在一個方法裏,就能夠自定義一個事件。
去掉一些兼容性的處理,簡化後的代碼:
var button = document.getElementById('button'); // 鼠標3擊事件 function click3Event(dom, fn) { var handler = function (event) { var target = event.target; var handler = function (event) { var target = event.target; target.removeEventListener('click', handler, false); // 執行內容 fn(); }; target.addEventListener('click', handler, false) // 爲防止雙擊後較長時間再次單擊執行事件 setTimeout(function () { target.removeEventListener('click', handler, false); }, 300); }; dom.addEventListener('dblclick', handler, false) } click3Event(button, function (event) { // 函數綁定自定義事件,及事件函數。函數內部綁定事件仍是使用原生的事件綁定 console.log('3 click'); });
五、元素事件傳遞 問題:
一、事件冒泡和事件捕獲(標準文檔流中);
二、固定和絕對定位元素z-index比標準文檔流的大,會遮擋下面元素的事件觸發(CSS屬性:pointer-events:none;可讓事件傳遞下去。);
體會:pointer-events:none;這個屬性至關於告訴瀏覽器,全部的事件都把我忽略了吧,對於事件而言我是不存在的,即不阻擋也不反應。
三、相對定位的z-inde屬性失效,因此不存在遮擋下面元素;
四、定位元素的子元素,若是再定位的話,不能阻止事件傳遞到這個父定位元素中(這個方法就無法實現點擊模態框空白部分,隱藏模態框的效果)。
五、在js中給一個元素DOM綁定事件,能夠阻止事件冒泡,從而阻止事件傳遞。
六、在CSS中有一個 pointer-events: none;屬性,可讓當前標籤徹底沒有事件,裏面子標籤的事件也被禁掉了。(這個感受在阻止事件傳遞上不實用,
既然給這個標籤綁定了事件,又讓它不能被觸發 比較矛盾,咱們只是不想讓子元素的事件,傳遞到父元素中。)
七、兄弟標籤的重疊部分,怎麼讓兩個標籤的事件都觸發呢。(事件冒泡和事件捕獲的事件傳播,說的都是祖先關係的dom元素)
說明:暫時沒有找到能夠實現這個功能的方法,實際項目基本不會有這種狀況出現(把它們變成祖先關係的標籤就能夠解決)。可是特定狀況會有這個需求,如在手機左下角,放一個隱藏的標籤div,連續點擊8次,顯示 vconsole 面板。
若是這個div標籤下面的標籤是有點擊事件的話,則會遮擋下面標籤的點擊事件(不是祖先關係的兩個標籤,沒法實現兩個都能觸發)。只能把隱藏的標籤放到沒有事件的標籤上面,避免這種狀況出現。
一、popstate事件(瀏覽器前進、回退事件):http://www.javashuo.com/article/p-ucrzwumo-x.html
總結:popstate 事件,不一樣的環境,處理觸發有的區別。使用這個要注意測試不一樣的環境,效果是否一致。
二、hashchange事件(監聽瀏覽器連接的hash值變化):https://www.jianshu.com/p/100242c095e7 (試了下,好像一直沒有觸發這個事件)
一、事件流
二、DOM0級事件處理程序(相似jQuery事件的快捷)
三、DOM2級事件處理程序(相似jQuery事件的on方式)
四、IE事件處理程序 ( attachEvent() 和 detachEvent() )
五、事件對象
參考:http://www.javashuo.com/article/p-zzphkdox-h.html
一、快捷方式
二、on方式
三、JQuery的事件對象屬性與方法