1. 程式人生 > >js基礎之冒泡和捕獲機制

js基礎之冒泡和捕獲機制

DOM事件所囊括的知識較為龐雜,本片文章總結一下冒泡和捕獲機制到底是怎麼運作的。

事件流

當我們點選頁面上的一個按鈕的時候,是按鈕最外層的父元素先收到事件並執行,還是這個被我們點選的按鈕先收到事件並執行?所以這兒引入了事件流的概念:事件流所描述的就是從頁面中接受事件的順序。(其實挺起來還是一臉懵懂的!沒錯我當時就是這樣子的。)
事件流也有兩種,分別是事件冒泡和事件捕獲,現行的主流是事件冒泡。下面一一來說:

1、事件冒泡
時間冒泡就是從我們上面提到的被我們點選的那個按鈕開始,先執行按鈕上繫結的事件,執行完之後,繼續往按鈕的父元素執行父元素上繫結的事件。
看這個簡單的程式碼:

<div
id="div1"> div1 <div id="div2"> div2 <div id="div3"> div3 </div> </div> </div>

div中嵌套了兩個div,js程式碼:

var div1 =document.getElementById('div1');
var div2 =document.getElementById('div2');
var div3 =document.getElementById('div3'
); div2.addEventListener('click',function(){ alert('div2'); },false); div1.addEventListener('click',function(){ alert('div1'); },false); div3.addEventListener('click',function(){ alert('div3'); },false);

注意:addEventListener這個方法的第三個引數選false,為冒泡事件,如果是true為我們後面講的捕獲事件。這裡我們執行的輸出為:
這裡寫圖片描述

當我點選div3的時候,會依次彈出div3,div2,div1。當我點選div2的時候,會依次彈出div2,div1。當我點選div1的時候,只彈出div1。
這個結果說明,事件冒泡是從我們當前點選到的那個div開始的,然後不斷往父元素冒泡。
2、事件捕獲
其實很簡單,我們只要把上面的程式碼中的false改為true:

 var  div1 =document.getElementById('div1');
 var  div2 =document.getElementById('div2');
 var  div3 =document.getElementById('div3');
      div2.addEventListener('click',function(){
        alert('div2');
      },true);
      div1.addEventListener('click',function(){
        alert('div1');
      },true);
      div3.addEventListener('click',function(){
        alert('div3');
      },true);

這樣我們點選div3的時候,會依次彈出div1,div2,div3。當我們點選div2的時候依次彈出div1,div2。當點選div1的時候,只彈出div1。這就是所謂的事件捕獲。
總結:事件捕獲跟冒泡方向是相反的。

這個時候你要問了,如果三個addEventListener中有第三個引數有false又有true怎麼辦?會不會打架?撞車?呵呵,當然不會。其中是有規則的,W3C明智地在這場爭鬥中選擇了一個折中的方案:任何發生在w3c事件模型中的事件,首是進入捕獲階段,直到達到目標元素,再進入冒泡階段。(w3c作為交警指揮了這個雜亂的交通)
當我們把程式碼改成:

var div1 =document.getElementById('div1');
var div2 =document.getElementById('div2');
var div3 =document.getElementById('div3');
    div1.addEventListener('click',function(){
        alert('div1');
      },true);
    div2.addEventListener('click',function(){
        alert('div2');
      },false);
    div3.addEventListener('click',function(){
        alert('div3');

這樣子三個div就有冒泡又有捕獲,這個時候
我們點選div3的時候,依次彈出div1、div3、div2;
點選div2的時候彈出次序為div1、div2。
分析:(認真看一下這個分析,如果有不準確的麻煩告訴寶寶一聲,謝謝)
這三個div有捕獲又又冒泡,根據交警w3c的規則,先找捕獲的,也就是div1,所以當我們點選div3的時候,先執行的是div1上的點選事件,div1執行完了往外走,看看還有沒有那個div是捕獲的,發現沒有了,那麼此時就開始尋找冒泡的。冒泡的順序是從最外一層的div開始往裡面走的,所以此時就找到了div3,執行完div3上的繫結事件之後就往父元素中找,發現誒有div2也是冒泡的哦!果斷執行了div2的事件。所以,最後的彈出順序就是div1–>div3–>div2。
到此我們應該都明白了其中的規律的吧!要是把程式碼改成這樣:


var div1 =document.getElementById('div1');
var div2 =document.getElementById('div2');
var div3 =document.getElementById('div3');
    div1.addEventListener('click',function(){
        alert('div1');
      },false);
    div2.addEventListener('click',function(){
        alert('div2');
      },true);
    div3.addEventListener('click',function(){
        alert('div3');
      },false);

大家應該都猜得到執行結果了吧!我不會告訴你們是div2–>div3–>div1

總結:
冒泡是從目標元素往父元素走,捕獲是從祖宗元素開始往目標元素走;兩個都有的話先捕獲再冒泡。

相關推薦

js基礎冒泡捕獲機制

DOM事件所囊括的知識較為龐雜,本片文章總結一下冒泡和捕獲機制到底是怎麼運作的。 事件流 當我們點選頁面上的一個按鈕的時候,是按鈕最外層的父元素先收到事件並執行,還是這個被我們點選的按鈕先收到事件並執行?所以這兒引入了事件流的概念:事件流所描述的就是

js事件流機制冒泡捕獲

JavaScript與HTML之間的互動是通過事件實現的。事件,就是文件或瀏覽器視窗中發生的一些特定的互動瞬間。 事件流 從頁面中接收事件的順序稱為事件流。 IE --> 事件冒泡流 Netscape --> 事件捕獲流 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件

js的事件冒泡事件捕獲

use 應用 ges color mouse 冒泡 code 元素事件 三個參數 一、定義 事件捕獲:從document到觸發事件的那個節點,自上而下觸發事件; 事件冒泡:從觸發事件節點依次向上觸發事件,直到document。 原聲js中,綁定事件方法addEventLis

徹底弄懂JS的事件冒泡事件捕獲

事件冒泡階段:事件從事件目標(target)開始,往上冒泡直到頁面的最上一級標籤。 假設一個元素div,它有一個下級元素p。 <div>   <p>元素</p> </div> 這兩個元素都綁定了click事件,如果使用者點

Python 基礎列表元組

bcp rtt fcn ott emd lns swe 二維數組 ttf list Python內置的一種數據類型是列表:list。list是一種有序的集合,可以隨時添加和刪除其中的元素。 比如,列出班裏所有同學的名字,就可以用一個list表示: >>

java基礎getpost的差別

oge tracking data- 宋體 行處理 art 其它 family 我們 上篇博文講到HTTP協議,本篇介紹HTTP請求方法中get和post的差別: 首先,最明顯的一點表象上的差別:GET 方式。將請求參數附加在url之後,POST將請求參數附加在請求頭

Java基礎finalstatic關鍵字

推薦 構造方法 其他 如果 靈活 位置 map 機制 lis 一、final 根據程序上下文環境,它可以修飾非抽象類、非抽象類成員方法和變量。 final類不能被繼承,沒有子類,final類中的方法默認是final的。 final

js基礎---parseInt()

pre spa 分解 解析 int 設置 ont bsp 返回 定義和用法 parseInt()可解析一個字符串,並返回一個整數 語法 parseInt(string, radix) 參數 描述 string 必需。要被解析的字符串。 radix

基礎shell makefile

靜默 兩種 1.4 如果能 內置 字符 為我 賦值運算 循環 2.2.1、shell介紹 (1)shell可以理解為軟件系統提供給用戶操作的命令行界面,可以說他是人機交互的一種方式 (2)我們可以使用shell和操作系統、uboot等軟件系統進行交互。具體來說就是我們通過

js基礎記憶的點

nan code 字母 6.0 字符串長度 3.1 實現 忽略 64位 64位存儲數字類型 0開頭表示八進制,有的js實現可能不支持 0x開頭表示十六進制0xff //15*16 + 15 = 255(十進制) 浮點數直接量3.14 6.02e23 //6.02 * 10的

js基礎引用數據類型

http 簡單 alt 獲得 操作 () blog function 對象類型 引用類型數據:   也就是對象類型Object type,比如:Object 、Array 、Function 、Data等。   javascript的引用數據類型是保存在堆內存中的對象。  

python基礎dictset

算法 dict name 區別 刪除元素 哈希算法 div 數學 blog dict dict是dictionary的縮寫,python內置了字典,在其他語言中也稱為map,使用鍵值對儲存,具有極快的查找速度。 如果是只用list來實現,就需要兩個list,先在第一個lis

Go基礎--排序查找操作

ear () ola 方法 math https swa blog png 排序操作主要都在sort包中,導入就可以使用了import("sort") 常用的操作 sort.Ints:對整數進行排序sort.Strings:對字符串進行排序sort.Float64s:對

web前端基礎BOMDOM

js DOM BOM一、介紹JavaScript分為ECMAScript,DOM,BOM。BOM(Browser Object Model)是指瀏覽器對象模型,它使JavaScript有能力與瀏覽器進行“對話”。DOM (Document Object Model)是指文檔對象模型,通過它,可以訪問HTML

算法基礎--冒泡排序算法

-- 基本 基礎 nbsp crm 技術分享 image RR power 一: 使用圖解 ,講解冒泡排序 二:代碼基本實現 /** * 對無序的數組進行冒泡排序 */ public static void sort(int[]

Java基礎thissuper關鍵字用法

鏈接 tps 事件 歧義 調用 數據 沒有 方法名 訪問 this 在java中,this是一個引用當前類對象的引用變量,主要有以下幾種用法: 引用當前類的實例變量· this關鍵字可以用來引用當前類的實例變量。如果實例變量和某個方法的參數之間存在歧義(實例變量和參數命名相

前端基礎BOMDOM

周期 引用 海澱區 寫到 直接 hist 接下來 height ctype 前戲 到目前為止,我們已經學過了JavaScript的一些簡單的語法。但是這些簡單的語法,並沒有和瀏覽器有任何交互。 也就是我們還不能制作一些我們經常看到的網頁的一

JS基礎傳參(值傳遞、對象傳遞)

rate ati 無效 over 並不是 undefined 字符 https cal 一、概念   我們需了解什麽是按值傳遞(call by value),什麽是按引用傳遞(call by reference)。在計算機科學裏,這個部分叫求值策略(Evaluation

Java 基礎 continue break

不執行 string In pre www ont ring str 如果 http://www.verejava.com/?id=17159306674727 public class Test2 { public static void main(String[

flask基礎請求處理核心機制(五)

sta while listen oca tp服務器 參數調用 corn adapt hasattr 前言 總結一下flask框架的請求處理流程。 系列文章 flask基礎之安裝和使用入門(一) flask基礎之jijia2模板使用基礎(二) flask基礎之jijia2