JavaScript中的事件模型

来源:https://www.cnblogs.com/princess-knight/archive/2018/07/12/9300196.html
-Advertisement-
Play Games

0. 事件與事件流 事件是瀏覽器與文檔交互的瞬間,如點擊按鈕、填寫表格等操作,它是Javascript與HTML之間溝通的橋梁。DOM是樹狀結構,如果同時給父節點都綁定事件時,當觸發子節點的時候,這兩個事件的發生順序就牽涉到事件流的內容,它描述的是頁面接受時間的順序。事件流描述的是從頁面接收事件的順 ...


0. 事件與事件流

        事件是瀏覽器與文檔交互的瞬間,如點擊按鈕、填寫表格等操作,它是Javascript與HTML之間溝通的橋梁。DOM是樹狀結構,如果同時給父節點都綁定事件時,當觸發子節點的時候,這兩個事件的發生順序就牽涉到事件流的內容,它描述的是頁面接受時間的順序。事件流描述的是從頁面接收事件的順序,但比較有意思的是IE和Netscape開發團隊居然提出了差不多完全相反的概念。IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕獲流。

       從而使得 事件流主要分為兩種:事件冒泡和事件捕獲。

        IE的事件流叫做事件冒泡,即事件開始時由最具體的元素(文檔中嵌套層次最深的那個節點)接收,然後逐級向上傳播到較為不具體的節點(文檔)。Netscape團隊提出的另一種事件流叫做事件捕獲(event capturing),事件捕獲的思想是不太具體的節點應該更早接收到事件,而最具體的節點應該最後接收到事件。捕獲的用意在於在事件到達預定目標前捕獲它。

        DOM2級事件規定的事件流包括三個階段:事件捕獲階段、處於目標階段、事件冒泡階段。首先發生的是事件捕獲,為截獲事件提供了機會。然後是實際的目標接收到事件。最後一個階段是冒泡階段,可以在這個階段對事件做出響應。

1. DOM0級事件模型   

        DOM0級事件模型是早期的事件模型,又稱為原始事件模型,在該模型中,事件不會傳播,即沒有事件流的概念。事件綁定監聽函數較為簡單,要使用Javascript指定事件處理程式,首先必須取得一個要操作的對象的引用。

        每個元素(包括window和document)都有自己的事件處理屬性,這些屬性通常全部小寫,如onclick。將這種屬性設置成函數就可以指定事件處理程式:

var btn = document.getElementById("myBtn");
btn.onclick = function() {
    alert("Clicked!");
};
btn.onclick = null; //刪除事件處理程式
//HTML事件處理程式
<form method="post">
    <input type="text" name="username" value="">
    <input type="button" value="Username" onclick = "alert(username.value)">
</form>

 2. DOM2級事件模型

        在這種模型中,分為三個過程:事件捕獲階段、處於目標階段7事件冒泡階段;

  • 事件捕獲階段(capturing phase)。事件從document一直向下傳播到目標元素, 依次檢查經過的節點是否綁定了事件監聽函數,如果有則執行。

  • 事件處理階段(target phase)。事件到達目標元素, 觸發目標元素的監聽函數。

  • 事件冒泡階段(bubbling phase)。事件從目標元素冒泡到document, 依次檢查經過的節點是否綁定了事件監聽函數,如果有則執行。

        DOM2級定義了兩個方法,用於處理指定和刪除事件處理程式的操作,addEventListener()和removeEventListener()。所有DOM節點都包含這兩個方法,並且有三個參數,要處理的事件名、作為事件處理程式的函數和一個布爾值。要在click事件添加事件處理程式,可以用:

var btn = document.getElementById("myBtn");
btn.addEventListener("click", functioin() {
    alert(this.id);
}, false);
btn.addEventListener("click", function() {
    alert("Hello Kid");
}, false);

        此時執行順序是順序執行:"myBtn"  "Hello kid"。IE中的話執行順序正好相反。

        移除事件監聽函數的方式如下:

var btn = document.getElementById("myBtn");
var handler = function() {
    alert(this.id);
};
btn.addEventListener("click", handler, false);
//
btn.removeEventListener("click", handler, false);

        這裡只能用函數表達式的形式作為事件處理程式,因為removeEventListener()移除的時候要求傳入的參數與添加應用程式時使用的參數相同。而通過匿名函數添加的事件監聽函數將無法被移除。

3. IE中的事件模型

        IE中使用與DOM中類似的兩個方法:attachEvent()和detachEvent()。這兩個方法接受相同的兩個參數,事件處理程式名稱和事件處理程式函數。由於IE8及更早的版本只支持事件冒泡,所以通過attachEvent()添加的事件處理程式都會被添加到冒泡階段。如果使用attachEvent()為按鈕添加一個事件處理程式可用:

var btn = document.getElementById("myBtn");
var handler = function() {
    alert(this.id);
};
btn.attachEvent("onclick", handler);//添加事件處理程式
btn.detachEvent("onclick", handler);//刪除事件處理程式

4. 事件對象

DOM中的事件對象

  • type表示被觸發的事件類型
  • target表示事件的目標
  • currentTarget表示事件處理程式當前正在處理事件的那個元素
  • cancelable (Boolean) 表明是否可以取消事件的預設行為
  • bubbles (Boolean)表明事件是否冒泡
  • perventDefault()取消事件的預設行為。如果cancelable為true,則可以使用這個方法
  • stopPropagation()取消事件的進一步捕獲或冒泡。如果bubbles為true,則可以使用這個方法。

IE中的事件對象

  • type表示被觸發的事件類型
  • srcElement表示事件的目標
  • cancelBubble (Boolean)預設是false,將其設為true就可以取消事件冒泡
  • returnValue (Boolean) 預設是true,將其設置為false就可以取消事件的預設行為

        有了上面的事件對象,就可以寫出跨瀏覽器的事件對象封裝成事件包裹了。

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

    removeHandler: function(element, type, handler){
        if (element.removeEventListener){                 //DOM2
            element.removeEventListener(type, handler, false);
        } else if (element.detachEvent){                  //IE
            element.detachEvent("on" + type, handler);
        } else {
            element["on" + type] = null;                  //DOM0
        }
    },

    getEvent: function(event){
        return event ? event : window.event;
    },

    getTarget: function(event){
        return event.target || event.srcElement;
    },

    preventDefault: function(event){
        if (event.preventDefault){
            event.preventDefault();
        } else {
            event.returnValue = false;
        }
    },

    stopPropagation: function(event){
        if (event.stopPropagation){
            event.stopPropagation();
        } else {
            event.cancelBubble = true;
        }
    }
};

 


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

-Advertisement-
Play Games
更多相關文章
  • 前戲 到目前為止,我們已經學過了JavaScript的一些簡單的語法。但是這些簡單的語法,並沒有和瀏覽器有任何交互。 也就是我們還不能製作一些我們經常看到的網頁的一些交互,我們需要繼續學習BOM和DOM相關知識。 JavaScript分為 ECMAScript,DOM,BOM。 BOM(Browse ...
  • 起初會想到使用keyup、keydown、keypress或者是onchange事件,onchange需要失去焦點才觸發, 其它三個有些對按住鍵盤某個鍵不放不生效,有些對使用中文輸入法正在輸入時統計不正確。 網上找到一種方法就是綁定事件input propertychange 效果如下: ...
  • 使用js來動態繪製svg圖片,首先就是要創建svg 節點。 使用createElementNS(),語法: 參數: 有效的命名空間URL有: 代碼舉例: ...
  • param:{ id:"", customerHead: "", } } } 如果修改頭像,向後臺傳base64字元串,否則會傳原圖片路徑,後臺判斷是否是base64字元串. 如果是base64字元串,則對base64字元串進行處理,在後臺伺服器生成圖片.此處需要對base64字元串進行處理,如圖所 ...
  • 當載入頁面時,“回到頂部” 預設不顯示,當拖滾動條後動態顯示;當點擊 “回到頂部” 時,勻減速回到頂部。 佈局效果如下: 1、首先在設置中的“頁面定製CSS代碼”中,添加如下css代碼(也可以修改成自己喜歡的樣式噢~): 2、然後在“博客側邊欄公告(支持HTML代碼)(支持JS代碼)”中,添加如下j ...
  • 微信的小程式是沒有分享到朋友圈的功能的。小程式目前只能分享到群里或者發給好友。但是業務需要方便推廣,需要分享到朋友圈。 經過度娘後,得出了以下思路:利用小程式canvas繪製圖片,將背景圖和二維碼繪製成一張圖片。百度過幾個好的demo,參考了一下,本以為會很簡單就解決這個問題,然而這個並不是小程式c ...
  • 一、數據類型 js中數據類型分為兩種,原始數據累次能夠和引用數據類型。 1.原始數據類型 2.引用數據類型 3.原始值和引用值 特別提醒的是,在js中,字元串被看做是原始類型,這意味著下麵的操作是非常耗記憶體的。 二、本地對象(內建對象) 1.Array對象 1.創建語法 2.屬性 3.方法 4.數組 ...
  • JavaScript概述 ECMAScript和JavaScript的關係 1996年11月,JavaScript的創造者--Netscape公司,決定將JavaScript提交給國際標準化組織ECMA,希望這門語言能夠成為國際標準。次年,ECMA發佈262號標準文件(ECMA-262)的第一版,規 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...