主頁 > 企業開發 > JS事件流、DOM事件流、IE事件處理、跨瀏覽器事件處理、事件物件與型別

JS事件流、DOM事件流、IE事件處理、跨瀏覽器事件處理、事件物件與型別

2020-10-03 04:34:12 企業開發

事件的移除

removeEventListener()

第二個引數需要指定要移除的事件句柄,不能是匿名函式,因為無法識別

想要移除成功,那么三個引數必須跟addEventListener中的三個完全一致

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
        input{
            display: block;
            margin-bottom:10px;
        }
        .active{
            color:orange;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var btn1 = document.querySelector("#btn1");

            function click1(){
                alert("hello1~");
            }

            btn1.addEventListener("click", click1, false);    

            //移除系結的事件
            btn1.removeEventListener("click", click1, false);                

        });
    </script>
</head>
<body>

    <button id="btn1">按鈕1</button>

</body>
</html>

IE事件流

attachEvent(event, function)   event都是on開頭的

瀏覽器兼容性主要就是指IE瀏覽器的兼容,尤其是低版本IE(IE6-8)

IE不支持事件捕獲,默認都是冒泡,所以沒有第三個引數

detachEvent()  移除事件


 

DOM0級   兼容所有瀏覽器

DOM2級   

addEventListener   主要兼容谷歌、火狐、IE9+

attachEvent  主要兼容IE6-8

attachEvent 可以系結多個事件型別,而且后系結的先執行

還有一個很逆天的知識點補充,匿名函式中的this指向window

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
        input{
            display: block;
            margin-bottom:10px;
        }
        .active{
            color:orange;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var btn1 = document.querySelector("#btn1");

            function click1(){
                alert("hello1~");
            }

            function click2(){
                alert("hello2~");
            }

            btn1.attachEvent("onclick", click1);
            btn1.attachEvent("onclick", click2);    //先彈出hello2,再彈出hello1    

            //移除系結的事件
            btn1.detachEvent("onclick", click1);    //解除系結hello1,只彈出hello2    

            //this指向window
            btn1.attachEvent("onclick", function(){
                alert(this===window);//true
            });        

        });
    </script>
</head>
<body>

    <button id="btn1">按鈕1</button>

</body>
</html>

跨瀏覽器事件處理

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
        input{
            display: block;
            margin-bottom:10px;
        }
        .active{
            color:orange;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var EventUtil={
                addHandler:function(ele, type, handler){
                    if(ele.addEventListener){
                        ele.addEventListener(type, handler, false);
                    }else if(ele.attachEvent){
                        ele.attachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=handler;
                    }
                },
                removeHandler:function(ele, type, handler){
                    if(ele.removeEventListener){
                        ele.removeEventListener(type, handler, false);
                    }else if(ele.detachEvent){
                        ele.detachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=null;
                    }
                }
            }

            var btn1=document.getElementById("btn1");
            var click=function(){
                alert("我被點擊啦!");
            }
            EventUtil.addHandler(btn1, "click", click);
            EventUtil.removeHandler(btn1, "click", click);
        });
    </script>
</head>
<body>

    <button id="btn1">按鈕1</button>

</body>
</html>

事件冒泡與事件捕獲

 

 

 直系親屬樹

事件冒泡:當某個元素的點擊事件被觸發之后,由于冒泡,它的直系親屬樹上的元素,只要被添加了事件的,都會被觸發(從下往上)

事件捕獲:當某個元素的點擊事件被觸發之后,由于捕獲,它的直系親屬樹上的元素,只要被添加了事件的,都會被觸發(從上往下)

大部分情況下,都是使用事件冒泡

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
        input{
            display: block;
            margin-bottom:10px;
        }
        .active{
            color:orange;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var parent=document.getElementById("parent");
            var child=document.getElementById("child");

            //事件冒泡,先出現child,再出現parent
            parent.addEventListener("click", function(){
                alert("parent");
            });
            child.addEventListener("click", function(){
                alert("child");
            });

            //事件捕獲,先出現parent,再出現child
            // parent.addEventListener("click", function(){
            //     alert("parent");
            // }, true);
            // child.addEventListener("click", function(){
            //     alert("child");
            // }, true);
        });
    </script>
</head>
<body>

    <div id="parent">
        <div id="child">點擊child</div>
    </div>

</body>
</html>

利用事件冒泡機制實作事件委托

事件系結會損耗性能,事件委托是一個很棒棒的選擇

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
        input{
            display: block;
            margin-bottom:10px;
        }
        .active{
            color:orange;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var ul=document.getElementById("ul");

            // 父 ul 系結事件
            // 子 li 沒有事件
            // 當子元素(li)被點擊時,在子元素直系親屬樹上的所有元素,凡是系結了事件的(ul)都會被觸發
            ul.addEventListener("click", function(event){
                // event,target可以獲取到點擊的那個元素
                console.log(event.target.innerHTML);

                if(event.target.id==="li1"){
                    alert("是1哦");
                }else if(event.target.id==="li2"){
                    alert("是2哦");
                }else if(event.target.id==="li3"){
                    alert("是3哦");
                }else if(event.target.id==="li4"){
                    alert("是4哦");
                }
            });
        });
    </script>
</head>
<body>

    <ul id="ul">
        <li id="li1">li1</li>
        <li id="li2">li2</li>
        <li id="li3">li3</li>
        <li id="li4">li4</li>
    </ul>

</body>
</html>

w3c 制定的 javascript 標準事件模型,先事件捕獲從windows > document 往下級直到 特定的事件節點,然后進行事件處理,再事件冒泡,從特定節點往上級,這個完整的程序,

事件捕獲->事件處理->事件冒泡


 

event物件常用的屬性和方法

事件句柄的引數event物件

event.type  事件型別

event.target  被點擊的元素

event.currentTarget  被系結事件的元素

event.preventDefault()  阻止默認行為

event.stopPropagation()  阻止事件捕獲或者冒泡,需要添加到子元素上

clientY 瀏覽器頂部底邊到滑鼠的位置

pageY 瀏覽器頂部底邊到滑鼠的位置+頁面滾動的距離

screenY 螢屏頂部到滑鼠的位置(如果瀏覽器縮小,screenY依然是根據電腦螢屏來計算,與瀏覽器無關)

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
        #scroll{
            height:1000px;
            background:#abcdef;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var ul=document.getElementById("ul");
            ul.addEventListener("click", function(event){
                console.log(event.type);//click
                console.log(event.target);//<li id="li3">li3</li>
                console.log(event.currentTarget);
                /*
                <ul id="ul">
                    <li id="li1">li1</li>
                    <li id="li2">li2</li>
                    <li id="li3">li3</li>
                    <li id="li4">li4</li>
                </ul>
                */
                            
                alert(event.target.innerHTML);

            });

            var a=document.getElementById("a");
            a.addEventListener("click", function(event){
                event.preventDefault();//阻止了a鏈接的跳轉
                alert("hello");
            })

            //阻止子元素執行時冒泡到父元素
            var parent=document.getElementById("parent");
            var child=document.getElementById("child");
            parent.addEventListener("click", function(event){
                alert("parent");
                event.stopPropagation();

            });
            child.addEventListener("click", function(event){
                alert("child");
                event.stopPropagation();
            });


            var scroll=document.getElementById("scroll");
            scroll.addEventListener("click", function(event){
                
                console.log(event.pageY);//813
                console.log(event.clientY);//480
                console.log(event.screenY);//535
            })
            
        });
    </script>
</head>
<body>

    <ul id="ul">
        <li id="li1">li1</li>
        <li id="li2">li2</li>
        <li id="li3">li3</li>
        <li id="li4">li4</li>
    </ul>

    <a id="a" href="http://www.baidu.com">點擊鏈接</a>

    <div id="parent">
        <div id="child">這是兒子</div>
    </div>

    <div id="scroll">這是滾動區域</div>
</body>
</html>

 

 

 IE中的event物件(attachEvent)

event.type 事件型別

event.returnValue=https://www.cnblogs.com/chenyingying0/p/false; 阻止默認行為

event.cancelBubble=true; 阻止冒泡,需要添加到子元素上

event.srcElement  被點擊的元素

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
        #scroll{
            height:1000px;
            background:#abcdef;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var ul=document.getElementById("ul");
            ul.attachEvent("onclick", function(event){
                alert(event.type);//click    
                alert(event.srcElement.innerHTML);//點擊li1,彈出li1

            });

            var a=document.getElementById("a");
            a.attachEvent("onclick", function(event){
                //阻止默認行為
                event.returnValue=false;
                alert("hello");
            });

            //阻止子元素執行時冒泡到父元素,需要添加到子元素上
            var parent=document.getElementById("parent");
            var child=document.getElementById("child");
            parent.attachEvent("onclick", function(event){
                alert("parent");

            });
            child.attachEvent("onclick", function(event){
                alert("child");
                event.cancelBubble=true;
            });

        });
    </script>
</head>
<body>

    <ul id="ul">
        <li id="li1">li1</li>
        <li id="li2">li2</li>
        <li id="li3">li3</li>
        <li id="li4">li4</li>
    </ul>

    <a id="a" href="http://www.baidu.com">點擊鏈接</a>

    <div id="parent">
        <div id="child">這是兒子</div>
    </div>

</body>
</html>

Event跨瀏覽器的兼容性寫法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:100%;
        }
        #scroll{
            height:1000px;
            background:#abcdef;
        }
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var EventUtil={
                addHandler:function(ele, type, handler){
                    if(ele.addEventListener){
                        ele.addEventListener(type, handler, false);
                    }else if(ele.attachEvent){
                        ele.attachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=handler;
                    }
                },
                removeHandler:function(ele, type, handler){
                    if(ele.removeEventListener){
                        ele.removeEventListener(type, handler, false);
                    }else if(ele.detachEvent){
                        ele.detachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=null;
                    }
                },
                mycurrentTarget:function(event){
                    return event.Target || event.srcElement;
                },
                mypreventDefault:function(event){
                    if(event.preventDefault()){
                        event.preventDefault();
                    }else{
                        event.returnValue=false;
                    }
                },
                mystopPropagation:function(event){
                    if(event.stopPropagation){
                        event.stopPropagation();
                    }else{
                        event.cancelBubble=true;
                    }
                }

            }


            var a=document.getElementById("a");
            EventUtil.addHandler(a, "click", function(event){
                alert("hello");
                EventUtil.mypreventDefault(event);//阻止默認行為
            });

            var parent=document.getElementById("parent");
            EventUtil.addHandler(parent, "click", function(event){
                alert("parent");
            });

            var child=document.getElementById("child");
            EventUtil.addHandler(child, "click", function(event){
                var target=EventUtil.mycurrentTarget(event);
                alert(target.id);//<div id="child">這是兒子</div>
                EventUtil.mystopPropagation(event);//阻止冒泡到父元素
            })

        });
    </script>
</head>
<body>

    <ul id="ul">
        <li id="li1">li1</li>
        <li id="li2">li2</li>
        <li id="li3">li3</li>
        <li id="li4">li4</li>
    </ul>

    <a id="a" href="http://www.baidu.com">點擊鏈接</a>

    <div id="parent">
        <div id="child">這是兒子</div>
    </div>

</body>
</html>

 

 

UI事件 load

window的load事件

img的load事件

script的load事件

css的load事件

window的unload事件  用戶從一個頁面切換到另一個頁面

window的resize事件 視窗大小調整

window的scroll事件  視窗滾動

由于resize和scroll是重復執行的,因此特別損耗性能

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
            height:2000px;
        }
        
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var EventUtil={
                addHandler:function(ele, type, handler){
                    if(ele.addEventListener){
                        ele.addEventListener(type, handler, false);
                    }else if(ele.attachEvent){
                        ele.attachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=handler;
                    }
                },
                removeHandler:function(ele, type, handler){
                    if(ele.removeEventListener){
                        ele.removeEventListener(type, handler, false);
                    }else if(ele.detachEvent){
                        ele.detachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=null;
                    }
                },
                mycurrentTarget:function(event){
                    return event.Target || event.srcElement;
                },
                mypreventDefault:function(event){
                    if(event.preventDefault()){
                        event.preventDefault();
                    }else{
                        event.returnValue=false;
                    }
                },
                mystopPropagation:function(event){
                    if(event.stopPropagation){
                        event.stopPropagation();
                    }else{
                        event.cancelBubble=true;
                    }
                }

            }

            // window的load事件
            EventUtil.addHandler(window, "load", function(){
                //alert("window的load事件!");
            });

            //img圖片加載完畢
            var img=document.createElement("img");
            EventUtil.addHandler(img, "load", function(){
                //alert("img圖片加載完畢!");
            });
            img.src="source/cat.jpg";

            //img圖片預加載(存入記憶體中)
            var img=new Image();
            EventUtil.addHandler(img, "load", function(){
                //alert("img圖片預加載完畢!");
            });
            img.src="source/cat.jpg";

            //動態加載js
            var script=document.createElement("script");
            EventUtil.addHandler(script, "load", function(){
                //alert("js加載完畢!");
            });
            script.src="jquery.js";
            //document.body.appendChild(script);

            //動態加載css
            var link=document.createElement("link");
            link.type="text/css";
            link.rel="stylesheet";
            EventUtil.addHandler(link, "load", function(){
                //alert("css加載完畢!");
            });
            link.href="style.css";
            //document.getElementsByTagName[0].appendChild(link);

            //window  unload
            EventUtil.addHandler(window, "unload", function(){
                //alert("unload!");
            });

            //window  resize
            EventUtil.addHandler(window, "resize", function(){
                //alert("resize");
            });

            //window  scroll
            EventUtil.addHandler(window, "scroll", function(){
                //alert("scroll");
            });
        });
    </script>
</head>
<body>

</body>
</html>

 

焦點事件

onfocus  得到焦點

onblur   失去焦點

滑鼠事件

onclick 滑鼠單擊

ondblclick  滑鼠雙擊

onmousedown  滑鼠按下

onmousemove  滑鼠在目標區域移動(重復執行影響性能)

onmouseup  滑鼠松開

mousedown+mouseup=click

onmouseover  滑鼠移入(進入元素或者元素的子元素)

onmouseout 滑鼠移出 (移出元素或者元素的子元素)

onmouseenter  滑鼠移入(進入元素本身)

onmouseleave 滑鼠移出(移出元素本身)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
        }
        #div{
            width:200px;
            height:200px;
            margin:50px auto;
            background:#abcdef;
            position: relative;
        }
        #child{
            width:80px;
            height:80px;
            background:pink;
            font-size:14px;
            position: absolute;
            left:50%;
            top:50%;
            margin-left:-40px;
            margin-top:-40px;
            line-height:80px;
            text-align: center;
        }
        
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var EventUtil={
                addHandler:function(ele, type, handler){
                    if(ele.addEventListener){
                        ele.addEventListener(type, handler, false);
                    }else if(ele.attachEvent){
                        ele.attachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=handler;
                    }
                },
                removeHandler:function(ele, type, handler){
                    if(ele.removeEventListener){
                        ele.removeEventListener(type, handler, false);
                    }else if(ele.detachEvent){
                        ele.detachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=null;
                    }
                },
                mycurrentTarget:function(event){
                    return event.Target || event.srcElement;
                },
                mypreventDefault:function(event){
                    if(event.preventDefault()){
                        event.preventDefault();
                    }else{
                        event.returnValue=false;
                    }
                },
                mystopPropagation:function(event){
                    if(event.stopPropagation){
                        event.stopPropagation();
                    }else{
                        event.cancelBubble=true;
                    }
                }

            }

            //獲得焦點
            var inout=document.getElementById("text");
            EventUtil.addHandler(inout, "focus", function(){
                //console.log("獲得焦點");
            });

            //失去焦點
            var inout=document.getElementById("text");
            EventUtil.addHandler(inout, "blur", function(){
                //console.log("失去焦點");
            });

            //滑鼠單擊
            var div=document.getElementById("div");
            EventUtil.addHandler(div, "click", function(){
                //console.log("滑鼠單擊");
            });

            //滑鼠雙擊
            var div=document.getElementById("div");
            EventUtil.addHandler(div, "dblclick", function(){
                //console.log("滑鼠雙擊");
            });

            //滑鼠按下
            var div=document.getElementById("div");
            EventUtil.addHandler(div, "mousedown", function(){
                //console.log("滑鼠按下");
            });

            //滑鼠松開
            var div=document.getElementById("div");
            EventUtil.addHandler(div, "mouseup", function(){
                //console.log("滑鼠松開");
            });

            //滑鼠移動
            var div=document.getElementById("div");
            EventUtil.addHandler(div, "mousemove", function(){
                //console.log("滑鼠移動");
            });

            //滑鼠進入
            var div=document.getElementById("div");
            EventUtil.addHandler(div, "mouseover", function(){
                console.log("mouseover滑鼠進入");
            });

            //滑鼠離開
            var div=document.getElementById("div");
            EventUtil.addHandler(div, "mouseout", function(){
                console.log("mouseout滑鼠離開");
            });

            //滑鼠進入
            var div=document.getElementById("div");
            EventUtil.addHandler(div, "mouseenter", function(){
                console.log("mouseenter滑鼠進入");
            });

            //滑鼠離開
            var div=document.getElementById("div");
            EventUtil.addHandler(div, "mouseleave", function(){
                console.log("mouseleave滑鼠離開");
            });
        });
    </script>
</head>
<body>

    <input type="text" id="text" value="text">
    <div id="div">
        <div id="child">這是子元素</div>
    </div>
</body>
</html>

event.shiftKey   shift+點擊

event.ctrlKey  ctrl+點擊

event.altKey  alt+點擊

event.metaKey   meta+點擊

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
        }
        #box{
            width:200px;
            height:200px;
            margin:50px auto;
            background:#abcdef;
            position: relative;
        }

        
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var EventUtil={
                addHandler:function(ele, type, handler){
                    if(ele.addEventListener){
                        ele.addEventListener(type, handler, false);
                    }else if(ele.attachEvent){
                        ele.attachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=handler;
                    }
                },
                removeHandler:function(ele, type, handler){
                    if(ele.removeEventListener){
                        ele.removeEventListener(type, handler, false);
                    }else if(ele.detachEvent){
                        ele.detachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=null;
                    }
                },
                mycurrentTarget:function(event){
                    return event.Target || event.srcElement;
                },
                mypreventDefault:function(event){
                    if(event.preventDefault()){
                        event.preventDefault();
                    }else{
                        event.returnValue=false;
                    }
                },
                mystopPropagation:function(event){
                    if(event.stopPropagation){
                        event.stopPropagation();
                    }else{
                        event.cancelBubble=true;
                    }
                }

            }

            var box=document.getElementById("box");
            EventUtil.addHandler(box, "click", function(e){
                var keys=[];
                if(e.shiftKey){
                    keys.push("shift");
                }
                if(e.ctrlKey){
                    keys.push("ctrl");
                }
                if(e.altKey){
                    keys.push("alt");
                }
                if(e.metaKey){
                    keys.push("meta");
                }
                console.log(keys.join(","));//陣列轉字串
            });
        });
    </script>
</head>
<body>

    <div id="box"></div>
</body>
</html>

 

針對mousedown,存在event.button

高級瀏覽器:

event.button=0  滑鼠左鍵

event.button=1 滑鼠中鍵

event.button=2 滑鼠右鍵

IE8及以下:

event.button=0  沒有按下滑鼠

event.button=1 按下左鍵

event.button=2 按下右鍵

event.button=3 同時按下左右鍵

event.button=4 按下中間鍵

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
        }
        #box{
            width:200px;
            height:200px;
            margin:50px auto;
            background:#abcdef;
            position: relative;
        }

        
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var EventUtil={
                addHandler:function(ele, type, handler){
                    if(ele.addEventListener){
                        ele.addEventListener(type, handler, false);
                    }else if(ele.attachEvent){
                        ele.attachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=handler;
                    }
                },
                removeHandler:function(ele, type, handler){
                    if(ele.removeEventListener){
                        ele.removeEventListener(type, handler, false);
                    }else if(ele.detachEvent){
                        ele.detachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=null;
                    }
                },
                mycurrentTarget:function(event){
                    return event.Target || event.srcElement;
                },
                mypreventDefault:function(event){
                    if(event.preventDefault()){
                        event.preventDefault();
                    }else{
                        event.returnValue=false;
                    }
                },
                mystopPropagation:function(event){
                    if(event.stopPropagation){
                        event.stopPropagation();
                    }else{
                        event.cancelBubble=true;
                    }
                }

            }

            var box=document.getElementById("box");
            EventUtil.addHandler(box, "mousedown", function(e){
                console.log(e.button);
            });
        });
    </script>
</head>
<body>

    <div id="box"></div>
</body>
</html>

鍵盤事件

keydown  按下任意鍵   keyup  松開鍵盤   event.keyCode 鍵碼(通過keydown獲取)

keypress 按下鍵盤上的字符鍵   charCode  ascii碼(通過keypress獲取)

textInput 文本輸入   data  輸入的文本

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
        }
        #box{
            width:200px;
            height:200px;
            margin:50px auto;
            background:#abcdef;
            position: relative;
        }

        
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var EventUtil={
                addHandler:function(ele, type, handler){
                    if(ele.addEventListener){
                        ele.addEventListener(type, handler, false);
                    }else if(ele.attachEvent){
                        ele.attachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=handler;
                    }
                },
                removeHandler:function(ele, type, handler){
                    if(ele.removeEventListener){
                        ele.removeEventListener(type, handler, false);
                    }else if(ele.detachEvent){
                        ele.detachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=null;
                    }
                },
                mycurrentTarget:function(event){
                    return event.Target || event.srcElement;
                },
                mypreventDefault:function(event){
                    if(event.preventDefault()){
                        event.preventDefault();
                    }else{
                        event.returnValue=false;
                    }
                },
                mystopPropagation:function(event){
                    if(event.stopPropagation){
                        event.stopPropagation();
                    }else{
                        event.cancelBubble=true;
                    }
                },
                getCharCode:function(event){
                    if(typeof event.charCode == "number"){
                        return event.charCode;
                    }else{
                        return event.keyCode;
                    }
                }

            }

            var input=document.getElementById("input");
            EventUtil.addHandler(input, "keydown", function(e){
                //console.log(e.keyCode+"keydown");
            });

            EventUtil.addHandler(input, "keyup", function(e){
                //console.log(e.keyCode+"keyup");
            });

            EventUtil.addHandler(input, "keypress", function(e){
                //console.log(e.charCode+"keypress");
            });

            EventUtil.addHandler(input, "textInput", function(e){
                console.log(e.data+"textInput");
            });
        });
    </script>
</head>
<body>

    <input type="text" id="input">
</body>
</html>

DOM 相關事件

DOMNodeRemoved  DOM中某元素被洗掉

DOMNodeRemovedFromDocument    從檔案中被洗掉前觸發(事件句柄必須加在被操作的元素上,瀏覽器支持性不好,不推薦)

DOMNodeInserted   DOM中某元素被添加

DOMNodeInsertedIntoDocument   從檔案中被添加之前觸發(事件句柄必須加在被操作的元素上,瀏覽器支持性不好,不推薦)

 

DOMSubtreeModified  DOM結構發生改變

 

DOMContentLoaded  DOM樹加載完即可

loaded  DOM樹加載完,并且影像+js+css等其他資源也加載完

因此DOMContentLoaded速度快于loaded

 

hashchange   #后面的值發生變化,只能給window物件系結

event.oldURL   原來的url

event.newURL   新的url

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body{
            width:100%;
        }
        #box{
            width:200px;
            height:200px;
            margin:50px auto;
            background:#abcdef;
            position: relative;
        }

        
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var EventUtil={
                addHandler:function(ele, type, handler){
                    if(ele.addEventListener){
                        ele.addEventListener(type, handler, false);
                    }else if(ele.attachEvent){
                        ele.attachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=handler;
                    }
                },
                removeHandler:function(ele, type, handler){
                    if(ele.removeEventListener){
                        ele.removeEventListener(type, handler, false);
                    }else if(ele.detachEvent){
                        ele.detachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=null;
                    }
                },
                mycurrentTarget:function(event){
                    return event.Target || event.srcElement;
                },
                mypreventDefault:function(event){
                    if(event.preventDefault()){
                        event.preventDefault();
                    }else{
                        event.returnValue=false;
                    }
                },
                mystopPropagation:function(event){
                    if(event.stopPropagation){
                        event.stopPropagation();
                    }else{
                        event.cancelBubble=true;
                    }
                },
                getCharCode:function(event){
                    if(typeof event.charCode == "number"){
                        return event.charCode;
                    }else{
                        return event.keyCode;
                    }
                }

            }

            var ul=document.getElementById("ul");

            //DOM中某元素被洗掉
            EventUtil.addHandler(document, "DOMNodeRemoved", function(e){
                //console.log("removed");//removed
            });
            //ul.removeChild(ul.children[3]);
            
            //DOM中某元素被添加
            var li=document.createElement("li");
            EventUtil.addHandler(document, "DOMNodeInserted", function(e){
                //console.log("inserted");//inserted
            });
            //ul.appendChild(li); 


            //DOM結構從檔案中被洗掉之前觸發
            //addHandler中填寫的是被洗掉的元素
            var li=ul.children[3];
            EventUtil.addHandler(li, "DOMNodeRemovedFromDocument", function(e){
                //console.log("DOM結構從檔案中被洗掉之前觸發");//DOM結構從檔案中被洗掉之前觸發
            });
            //ul.removeChild(li);
            
            //DOM結構從檔案中被添加之前觸發
            //addHandler中填寫的是被添加的元素
            var li=document.createElement("li");
            EventUtil.addHandler(li, "DOMNodeInsertedIntoDocument", function(e){
                //console.log("DOM結構從檔案中被添加之前觸發");//DOM結構從檔案中被添加之前觸發
            });
            //ul.appendChild(li);
            
            //DOM結構發生改變
            EventUtil.addHandler(document, "DOMSubtreeModified", function(e){
                //console.log("DOM結構發生改變");//DOM結構發生改變
            });
            //ul.removeChild(ul.children[3]);//4被洗掉  
            
            //DOM結構發生改變
            EventUtil.addHandler(document, "DOMSubtreeModified", function(e){
                //console.log("DOM結構發生改變");//DOM結構發生改變
            });
            //ul.removeChild(ul.children[3]);//4被洗掉
            
            //DOM樹加載完
            EventUtil.addHandler(document, "DOMContentLoaded", function(e){
                //console.log("DOM樹加載完");//DOM結構發生改變
            });

            //hash值改變
            EventUtil.addHandler(window, "hashchange", function(e){
                console.log(e.oldURL + "\n" + e.newURL);//DOM結構發生改變
                //file:///C:/Users/96579/Desktop/index.html#11
                //file:///C:/Users/96579/Desktop/index.html#
            });

        });

    </script>
</head>
<body>

    <ul id="ul">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
</body>
</html>

 

 移動端常用事件 型別

touchstart  手指接觸螢屏

touchmove  手指在螢屏上移動

touchend  手指離開螢屏

touchcancel  系統停止觸摸跟蹤時觸發

首先在head上添加移動端適配的設定:

<meta name="viewport" content="width=device-width, initial-scale=1.0">

touch的event物件

event.touches   螢屏上的觸摸點個數

event.changedTouches   螢屏上移動的觸摸點的個數

event.targetTouches   目標區域內的觸摸點的個數

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            width:100%;
        }
        #div{
            width:100px;
            height:100px;
            background:#abcdef;
        }
        
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var EventUtil={
                addHandler:function(ele, type, handler){
                    if(ele.addEventListener){
                        ele.addEventListener(type, handler, false);
                    }else if(ele.attachEvent){
                        ele.attachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=handler;
                    }
                },
                removeHandler:function(ele, type, handler){
                    if(ele.removeEventListener){
                        ele.removeEventListener(type, handler, false);
                    }else if(ele.detachEvent){
                        ele.detachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=null;
                    }
                },
                mycurrentTarget:function(event){
                    return event.Target || event.srcElement;
                },
                mypreventDefault:function(event){
                    if(event.preventDefault()){
                        event.preventDefault();
                    }else{
                        event.returnValue=false;
                    }
                },
                mystopPropagation:function(event){
                    if(event.stopPropagation){
                        event.stopPropagation();
                    }else{
                        event.cancelBubble=true;
                    }
                },
                getCharCode:function(event){
                    if(typeof event.charCode == "number"){
                        return event.charCode;
                    }else{
                        return event.keyCode;
                    }
                }

            }

            var div=document.getElementById("div");

            EventUtil.addHandler(div, "touchstart", function(e){
                console.log("touchstart");
                console.log(e.touches);
                console.log(e.changedTouches);
                console.log(e.targetTouches);
            });
            EventUtil.addHandler(div, "touchmove", function(e){
                console.log("touchmove");
            });
            EventUtil.addHandler(div, "touchend", function(e){
                console.log("touchend");
            });
            
        });

    </script>
</head>
<body>
    <div id="div"></div>
</body>
</html>

 

一個小案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            width:100%;
        }
        #div{
            width:400px;
            height:400px;
            border:1px solid;
            margin:50px;
        }
        #ul{
            list-style: none;
        }
        #ul li{
            width:100px;
            height:30px;
            line-height:30px;
            text-align: center;
            border-radius:5px;
            display: inline-block;
            cursor:pointer;
        }
        #ul li:hover{
            color:#fff;
        }
        #ul li:first-child{
            background:pink;
        }
        #ul li:nth-child(2){
            background:#abcdef;
        }
        #ul li:nth-child(3){
            background:lightgreen;
        }
        #ul li:last-child{
            background:orange;
        }
        
    </style>
    <script src="DomReady.js"></script>
    <script>
        myReady(function(){

            var EventUtil={
                addHandler:function(ele, type, handler){
                    if(ele.addEventListener){
                        ele.addEventListener(type, handler, false);
                    }else if(ele.attachEvent){
                        ele.attachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=handler;
                    }
                },
                removeHandler:function(ele, type, handler){
                    if(ele.removeEventListener){
                        ele.removeEventListener(type, handler, false);
                    }else if(ele.detachEvent){
                        ele.detachEvent("on"+type, handler);
                    }else{
                        ele["on"+type]=null;
                    }
                },
                mycurrentTarget:function(event){
                    return event.Target || event.srcElement;
                },
                mypreventDefault:function(event){
                    if(event.preventDefault()){
                        event.preventDefault();
                    }else{
                        event.returnValue=false;
                    }
                },
                mystopPropagation:function(event){
                    if(event.stopPropagation){
                        event.stopPropagation();
                    }else{
                        event.cancelBubble=true;
                    }
                },
                getCharCode:function(event){
                    if(typeof event.charCode == "number"){
                        return event.charCode;
                    }else{
                        return event.keyCode;
                    }
                }

            }

            var ul=document.getElementById("ul");
            var div=document.getElementById("div");

            EventUtil.addHandler(ul, "click", function(event){
                var e=event.target;//快取
                if(e.innerHTML=="仙女粉"){
                    div.style.background="pink";
                }else if(e.innerHTML=="氣質藍"){
                    div.style.background="#abcdef";
                }else if(e.innerHTML=="薄荷綠"){
                    div.style.background="lightgreen";
                }else if(e.innerHTML=="元氣橙"){
                    div.style.background="orange";
                }
            });
            
        });

    </script>
</head>
<body>
    <div id="div"></div>
    <ul id="ul">
        <li>仙女粉</li>
        <li>氣質藍</li>
        <li>薄荷綠</li>
        <li>元氣橙</li>
    </ul>
</body>
</html>

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/150290.html

標籤:JavaScript

上一篇:vuex原始碼簡析

下一篇:您的代碼聽起來如何?根據您的代碼生成音樂

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more