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 Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...