首頁 web前端 js教程 帶你快速理解javascript中的事件模型

帶你快速理解javascript中的事件模型

Jan 22, 2018 am 09:59 AM
javascript js 事件

這篇文章主要介紹了javascript中的事件模型,其中包括了DOM0級事件模型和DOM2級事件模型(事件捕獲和事件冒泡和DOM2級的註冊事件和解除事件) ,對JavaScript的朋友可以參考下這篇文章

javascript中有兩種事件模型:DOM0,DOM2。而對於這兩種的時間模型,我一直不是非常的清楚,現在透過網路查閱資料終於明白了一些。

  一.  DOM0級事件模型

  DOM0級事件模型是早期的事件模型,所有的瀏覽器都是支援的,而且其實作也是比較簡單。程式碼如下:

<p id = &#39;click&#39;>click me</p>
<script>
 document.getElementById(&#39;click&#39;).onclick = function(event){
  alert(event.target);
 }
</script>
登入後複製

  這種事件模型就是直接在dom物件註冊事件名稱,這段程式碼就是在p標籤上註冊了一個onclick事件,在這個事件函數內部輸出點擊的目標。而解除事件則更加簡單,就是將null複製給事件函數,如下:

document.getElementById('click'_).onclick = null;
#  由此我們可以知道dom0中,一個dom物件只能註冊一個同類型的函數,因為註冊多個同類型的函數的話,就會發生覆蓋,之前註冊的函數就會無效。

var click = document.getElementById(&#39;click&#39;);
click.onclick = function(){
 alert(&#39;you click the first function&#39;);
};
click.onclick = function(){
 alert(&#39;you click the second function&#39;)
}
登入後複製

  在這段程式碼中,我們為dom物件註冊了兩個onclick函數,但是結果是只執行了第二個註冊的函數,前面所註冊的函數被覆蓋了。

  二.   DOM2級事件模型

##  

1.  事件擷取與事件冒泡(capture,bubble)

  首先,IE8及以下是不支援這種事件模型的。事件捕獲和事件冒泡的機制如下圖:

  如上圖所示,123代表事件捕獲,4567代表事件冒泡。首先我們使用下面的程式碼:

<p id = &#39;outer&#39; style = &#39;margin: 100px 0 0 100px; width: 200px;height: 200px; background: red;&#39;>
 <p id="inner" style = &#39;margin-left:20px; width: 50px;height:50px; background: green;&#39;></p>
</p>
登入後複製

  假設我們點擊了ID為inner的p,那麼此時的事件流程就是,首先執行捕獲階段:document-html-body-p(outer) 。然後執行冒泡階段:p(inner)-p(outer)-body-html-document。

 

 2.   DOM2級的註冊事件和解除事件

  在DOM2級中使用addEventListener和removeEventListener來註冊和解除事件(IE8及之前版本不支援)。這種函數較之之前的方法好處是一個dom物件可以註冊多個相同類型的事件,不會發生事件的覆蓋,會依序的執行各個事件函數。

  addEventListener('事件名稱','事件回呼','捕獲/冒泡')。範例如下:

<p id = &#39;outer&#39; style = &#39;margin: 100px 0 0 100px; width: 200px;height: 200px; background: red;&#39;>
 <p id="inner" style = &#39;margin-left:20px; width: 50px;height:50px; background: green;&#39;></p>
</p>
<script>
 var click = document.getElementById(&#39;inner&#39;);
 click.addEventListener(&#39;click&#39;,function(){
  alert(&#39;click one&#39;);
 },false);
 click.addEventListener(&#39;click&#39;,function(){
  alert(&#39;click two&#39;);
 },false);
</script>
登入後複製

  首先我們要知道addEventListenr的第一個參數是事件名稱,與DOM0級不同的是沒有」on“,另外第三個參數代表捕獲還是冒泡,true代表捕獲事件,false代表冒泡事件。

  而在這段程式碼中,我們為inner的p註冊了兩個click事件函數,結果是瀏覽器會依序執行這兩個函數。

  下面我們示範如何使用事件流的發生機制。

<p id = &#39;outer&#39; style = &#39;margin: 100px 0 0 100px; width: 200px;height: 200px; background: red;&#39;>
 <p id="inner" style = &#39;margin-left:20px; width: 50px;height:50px; background: green;&#39;></p>
</p>
<script>
 var click = document.getElementById(&#39;inner&#39;);
 var clickouter = document.getElementById(&#39;outer&#39;);
 click.addEventListener(&#39;click&#39;,function(){
  alert(&#39;inner show&#39;);
 },true);
 clickouter.addEventListener(&#39;click&#39;,function(){
  alert(&#39;outer show&#39;);
 },true);
</script>
登入後複製

  這段程式碼,我們使用了捕獲事件,由於inner是嵌套在outer中的,所以我們知道當使用捕獲的時候outer是應該首先捕獲到這個事件的,其次inner才能捕獲到這個事件。那麼結果就是outer先執行,其次是inner執行。


  那麼我把outer的執行時機改為冒泡的階段呢?

alickouter.addEventListener(&#39;click&#39;,function(){
 alert(&#39;outer show&#39;); 
},false);
登入後複製

  這種情況下,就是先執行inner後執行outer了。同理我們把二者的事件執行時機都改為冒泡階段的話,依舊是先執行inner後執行outer。那麼還有個問題,就是如果我們把inner註冊兩個click事件,一個是在捕獲階段,另一個是在冒泡階段,也就是說把addEventListenter的第三個參數分別設為false和true,那麼執行的順序又是怎樣的呢。

<script>
 var click = document.getElementById(&#39;inner&#39;);
 var clickouter = document.getElementById(&#39;outer&#39;);
 click.addEventListener(&#39;click&#39;,function(){
  alert(&#39;capture show&#39;);
 },true);
 click.addEventListener(&#39;click&#39;,function(){
  alert(&#39;bubble show&#39;);
 },false);
</script>
登入後複製

  這種情況下首先這些的是capture show,其次是bubble show。但是這種結果是與註冊的順序有關係的,先註冊就先執行。因為我們在看事件捕捉和事件冒泡示意圖,發現最後具體的dom物件是只有一個的。


  那麼 如果我們給outer和inner都註冊了click事件但是我不希望outer執行怎麼辦呢?這時候我們就需要用到stopPropagation函數了,這個函數是用來阻止冒泡,言下之意是讓事件不再繼續冒泡下去,這樣接下來註冊同樣類型事件的dom物件就不會執行了。

例如在自製下拉框的時候,我們點擊瀏覽器的其他位置,我們需要下拉框的options隱藏,這時我們就要用到stopPropagation了。如下:

<script>
 var click = document.getElementById(&#39;inner&#39;);
 var clickouter = document.getElementById(&#39;outer&#39;);
 click.addEventListener(&#39;click&#39;,function(event){
  alert(&#39;inner show&#39;);
  event.stopPropagation();
 },false);
 clickouter.addEventListener(&#39;click&#39;,function(){
  alert(&#39;outer show&#39;);
 },false);
</script>
登入後複製

  正常的情况下,我们在不添加stopPropagation函数时,首先应该执行inner,然后执行outer,但是当我们在inner的事件函数中添加了stopPropagation函数之后,执行完inner的事件函数之后,就不会在执行outer的事件函数了,也可以理解为事件冒泡到inner之后就消失了,因此也就不会在执行接下来的事件函数了。

  由于事件捕获阶段没有可以阻止事件的函数,所以一般都是设置为事件冒泡。

相关推荐:

JavaScript实现为事件句柄绑定监听函数实例详解

JavaScript文件的同步和异步加载的实现代码

JavaScript 完成注册页面表单校验的实例

以上是帶你快速理解javascript中的事件模型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
建議:優秀JS開源人臉偵測辨識項目 建議:優秀JS開源人臉偵測辨識項目 Apr 03, 2024 am 11:55 AM

人臉偵測辨識技術已經是一個比較成熟且應用廣泛的技術。而目前最廣泛的網路應用語言非JS莫屬,在Web前端實現人臉偵測辨識相比後端的人臉辨識有優勢也有弱勢。優點包括減少網路互動、即時識別,大大縮短了使用者等待時間,提高了使用者體驗;弱勢是:受到模型大小限制,其中準確率也有限。如何在web端使用js實現人臉偵測呢?為了實現Web端人臉識別,需要熟悉相關的程式語言和技術,如JavaScript、HTML、CSS、WebRTC等。同時也需要掌握相關的電腦視覺和人工智慧技術。值得注意的是,由於Web端的計

PHP與JS開發技巧:掌握繪製股票蠟燭圖的方法 PHP與JS開發技巧:掌握繪製股票蠟燭圖的方法 Dec 18, 2023 pm 03:39 PM

隨著網路金融的快速發展,股票投資已經成為了越來越多人的選擇。而在股票交易中,蠟燭圖是常用的技術分析方法,它能夠顯示股票價格的變動趨勢,幫助投資人做出更精準的決策。本文將透過介紹PHP和JS的開發技巧,帶領讀者了解如何繪製股票蠟燭圖,並提供具體的程式碼範例。一、了解股票蠟燭圖在介紹如何繪製股票蠟燭圖之前,我們首先需要先了解什麼是蠟燭圖。蠟燭圖是由日本人

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

js和vue的關係 js和vue的關係 Mar 11, 2024 pm 05:21 PM

js和vue的關係:1、JS作為Web開發基石;2、Vue.js作為前端框架的崛起;3、JS與Vue的互補關係;4、JS與Vue的實踐應用。

如何在JavaScript中取得HTTP狀態碼的簡單方法 如何在JavaScript中取得HTTP狀態碼的簡單方法 Jan 05, 2024 pm 01:37 PM

JavaScript中的HTTP狀態碼取得方法簡介:在進行前端開發中,我們常常需要處理與後端介面的交互,而HTTP狀態碼就是其中非常重要的一部分。了解並取得HTTP狀態碼有助於我們更好地處理介面傳回的資料。本文將介紹使用JavaScript取得HTTP狀態碼的方法,並提供具體程式碼範例。一、什麼是HTTP狀態碼HTTP狀態碼是指當瀏覽器向伺服器發起請求時,服務

jQuery中如何實作select元素的改變事件綁定 jQuery中如何實作select元素的改變事件綁定 Feb 23, 2024 pm 01:12 PM

jQuery是一個受歡迎的JavaScript函式庫,可以用來簡化DOM操作、事件處理、動畫效果等。在web開發中,常常會遇到需要對select元素進行改變事件綁定的情況。本文將介紹如何使用jQuery實作對select元素改變事件的綁定,並提供具體的程式碼範例。首先,我們需要使用標籤來建立一個包含選項的下拉式選單:

如何使用 PHP 建立基於事件的應用程式 如何使用 PHP 建立基於事件的應用程式 May 04, 2024 pm 02:24 PM

在PHP中建構基於事件的應用程式的方法包括:使用EventSourceAPI建立事件來源,並在客戶端使用EventSource物件監聽事件。使用伺服器傳送的事件(SSE)傳送事件,並在客戶端使用XMLHttpRequest物件監聽事件。一個實用的例子是在電子商務網站中使用EventSource即時更新庫存計數,在伺服器端透過隨機更改庫存並發送更新來實現,客戶端則透過EventSource監聽庫存更新並即時顯示。

深入研究jQuery中的關閉按鈕事件 深入研究jQuery中的關閉按鈕事件 Feb 24, 2024 pm 05:09 PM

深入理解jQuery中的關閉按鈕事件在前端開發過程中,經常會遇到需要實現關閉按鈕功能的情況,例如關閉彈跳窗、關閉提示框等。而在使用jQuery這個流行的JavaScript函式庫時,實作關閉按鈕事件也變得異常簡單又方便。本文將深入探討如何利用jQuery來實現關閉按鈕事件,並提供具體的程式碼範例,幫助讀者更好地理解和掌握這個技術。首先,我們需要了解在HTML中如何定

See all articles