JS事件流、DOM事件流、IE事件處理、跨瀏覽器事件處理、事件對象與類型

来源:https://www.cnblogs.com/chenyingying0/archive/2020/02/08/12284919.html
-Advertisement-
Play Games

事件的移除 removeEventListener() 第二個參數需要指定要移除的事件句柄,不能是匿名函數,因為無法識別 想要移除成功,那麼三個參數必須跟addEventListener中的三個完全一致 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...


事件的移除

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>

    <
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Shell腳本基礎入門 Bash註釋 Bash只支持單行註釋,使用 開頭的都被當作註釋語句: 通過Bash的一些特性,可以取巧實現多行註釋: 所以,預設情況下讀寫數據都是終端,例如: 改變文件描述符對應的目標,可以改變數據的流向。比如標準輸入fd=1預設流向是終端設備,若將其改為/tmp/a.log ...
  • redis中壓縮列表ziplist相關的文件為:ziplist.h與ziplist.c 壓縮列表是redis專門開發出來為了節約記憶體的記憶體編碼數據結構。源碼中關於壓縮列表介紹的註釋也寫得比較詳細。 一、數據結構 壓縮列表的整體結構如下(借用redis源碼註釋): 1 /* 2 <zlbytes> < ...
  • 實例代碼: import React, { Component , PropTypes} from 'react'; import { AppRegistry, StyleSheet, Text, View, TextInput, TouchableOpacity } from 'react-nat ...
  • 慕課網- LovelyChubby-Jetpack全組件實戰 開發短視頻應用App-348元 筆記 微雲:https://share.weiyun.com/81aa12bb98016e200add31fb8e191cdf百度網盤:鏈接:https://pan.baidu.com/s/1IiClTkQ ...
  • Kotlin Android項目可用的靜態檢查工具: Android官方的Lint, 第三方的ktlint和detekt. ...
  • SublimeText3 Emmet安裝問題網上已經很多帖子了,這個簡單,主要對win7 64位我本人遇到的Emmet好多快捷功能無法用(比如ul>li*4 Tab無法生成)問題做了整理!搜了好多文章最終找到問題所在! 希望能幫到大家,也給自己做個記錄! 軟體下載: 這篇文章提供的是Windows ...
  • 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 256M,其他語言512M 小易給你一個包含n個數字的數組。你可以對這個數組執行任意次以下交換操作: 對於數組中的兩個下標i,j(1<=i,j<=n),如果為奇數,就可以交換和。 現在允許你使用操作次數不限,小易希望你能求出在所有能通過 ...
  • 作為開發人員,我喜歡在編碼時聽音樂。管弦樂使我可以更加專註於自己的工作。有一天,我註意到我的手指隨著音樂節奏在鍵盤上跳舞。喜歡彈鋼琴。代碼中的每個單詞或符號都和諧地書寫。然後我想...聽起來如何...我每天編寫的代碼? 這個想法誕生了。 ⭐️ 繼續在soundcode.now.sh上 直播,放置您的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...