JavaScript 原生事件

一、原生事件的綁定: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 (試了下,好像一直沒有觸發這個事件)


 

JavaScript事件

一、事件流

二、DOM0級事件處理程序(相似jQuery事件的快捷)

三、DOM2級事件處理程序(相似jQuery事件的on方式)

四、IE事件處理程序    (  attachEvent() 和 detachEvent()  )

五、事件對象

 參考:http://www.javashuo.com/article/p-zzphkdox-h.html

jQuery事件

一、快捷方式

二、on方式

三、JQuery的事件對象屬性與方法

相關文章
相關標籤/搜索