1. 程式人生 > >js 事件監聽原理,及相容寫法,jquer基本封裝原理

js 事件監聽原理,及相容寫法,jquer基本封裝原理

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>事件監聽原理,及相容寫法,jquer基本封裝原理</title>
</head>
<body>
<button>我綁定了多個事件</button>

<script>

// ---------------------------------------- 事件箭筒原理 ------------------------------

        var btn = document.getElementsByTagName("button")[0];
        fn("click",fn1,btn);
        fn("click",fn2,btn);
        fn("click",fn3,btn);
    
        function fn1(){
            console.log("九尺龍泉萬卷書,上天生我意何如。");
        }
        function fn2(){
            console.log("不能報國平天下,枉為男兒大丈夫。");
        }
        function fn3(){
            console.log("111111。");
        }
    
        function fn(str,fn,ele){
            //判斷位置要注意:如果進入繫結事件本身,那麼該事件已經本綁定了
            //所以獲取舊的事件必須在新的事件繫結之前
            var oldEvent = ele["on"+str];
            ele["on"+str] = function () {
                //不能直接執行函式,因為我們還不知道以前有沒有繫結我同樣的事件
                //進行判斷,如果以前有過繫結事件,那麼把以前的執行完畢在執行現在的事件,如果沒有就直接執行
                //如果沒有被定義過事件該事件源的該事件屬性應該是null對應的boolean值是false
                //如果已經定義過事件該事件源的該事件屬性應該是function本身對應的boolean值是true
                if(oldEvent){
                    //因為oldEvent本身他就是函式本身,那麼後面加一個();就是執行函式
                    oldEvent();
                    fn();
                }else{
                    //沒有繫結過事件
                    fn();
                }
            }
        }
    
    //------------------------------ 事件繫結與解綁的相容寫法 ----------------------------
    
        var btn = document.getElementsByTagName("button")[0];
    
        EventListen = {
            addEvent: function (ele,fn,str) {
                //通過判斷呼叫的方式相容IE678
                //判斷瀏覽器是否支援該方法,如果支援那麼呼叫,如果不支援換其他方法
                if(ele.addEventListener){ //火狐谷歌IE9+支援addEventListener
                    //直接呼叫
                    ele.addEventListener(str,fn);
                }else if(ele.attachEvent){ //IE678支援attachEvent
                    ele.attachEvent("on"+str,fn);
                }else{
                    //在addEventListener和attachEvent都不存在的情況下,用此程式碼
                    ele["on"+str] = fn;
                }
            },
            removeEvent: function (ele,fn,str) {
                if(ele.removeEventListener){
                    ele.removeEventListener(str,fn);
                }else if(ele.detachEvent){
                    ele.detachEvent("on"+str,fn);
                }else{
                    ele["on"+str] = null;
                }
            }
        }
    
        //    btn.addEventListener("click",fn); // 用什麼方式繫結 用什麼方式解綁
        EventListen.addEvent(btn,fn,"click");
        EventListen.removeEvent(btn,fn,"click");
    
        function fn(){
            alert(1);
        }
    
    
    
    
    // ------------------------- jquery 封裝基本原理 -----------------------
    
        // $ 與 _ 是js中能用來起名的特殊符號 jquery選擇了$
        // css在定義標籤的時候 可以用 div .ClassName #id 三種方式
        function $(str){
            var str1 = str.charAt(0); //擷取引數中第一個字元
            if(str1==="#"){             //說明是id
                return document.getElementById(str.slice(1));
            }else if(str1 === "."){     //說明是類
                return document.getElementsByClassName(str.slice(1));
            }else{                      //說明是標籤
                return document.getElementsByTagName(str);
            }
        }

</script>
</body>
</html>