国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【重溫基礎】20.事件

Blackjun / 1544人閱讀

摘要:本文是重溫基礎系列文章的第二十篇。事件捕獲為截獲事件提供機會,然后實際的目標接收到事件,最后事件冒泡,對事件作出響應。事件處理事件處理,即響應某個事件。包括導致事件的元素事件類型等其他信息。

本文是 重溫基礎 系列文章的第二十篇。

這是第三個基礎系列的第一篇,歡迎持續關注呀!
重溫基礎 系列的【初級】和【中級】的文章,已經統一整理到我的【Cute-JavaScript】的JavaScript基礎系列中。

今日感受:電影有時候看的是緣分。

系列目錄:

【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理)

【重溫基礎】1-14篇

【重溫基礎】15.JS對象介紹

【重溫基礎】16.JSON對象介紹

【重溫基礎】17.WebAPI介紹

【重溫基礎】18.相等性判斷

【重溫基礎】19.閉包

本章節復習的是JS中的事件,事件冒泡捕獲代理模擬等等。

前置知識:
JavaScript與HTML的交互式通過事件來實現的,是文檔或瀏覽器窗口中發生的一些特定的交互瞬間。

1.事件流

事件流描述的是從頁面中接收事件的順序,通常有這樣兩種完全相反的事件流概念:事件冒泡流(IE團隊提出)和事件捕獲流(網景團隊提出)。

1.1 事件冒泡

冒泡事件(Event Bubbling):事件開始時由最具體的元素接收(文檔中嵌套層次最深的那個節點),然后逐層向上傳播到較為不具體的節點(文檔),看下示例代碼:




    leo 事件冒泡


    
點擊

點擊頁面中

元素,這個click事件就會按照下面順序傳播:

document

由此可見,元素綁定的事件會通過DOM樹向上傳播,每層節點都會發生,直到document對象,如圖展示了冒泡過程:

1.2 事件捕獲

事件捕獲(Event Capturing):讓不太具體的節點更早接收事件,而最具體的節點最后接收事件,即在事件到達預定目標之前捕獲到,看下示例代碼(HTML代碼和前面一樣),事件捕獲的過程是這樣的:

document

看得出,document對象最新接收事件,然后沿DOM樹依次向下,直到最后的實際目標

元素,如圖展示了捕獲過程:

注意:由于老版本的瀏覽器不支持,因此很少人使用事件捕獲,不過如果特殊需求還是可以使用事件捕獲,建議還是使用事件冒泡。

1.3 DOM事件流

“DOM2級事件”規定的事件流包含三個階段:事件捕獲階段處于目標階段事件冒泡階段。
事件捕獲為截獲事件提供機會,然后實際的目標接收到事件,最后事件冒泡,對事件作出響應。按照前面的HTML代碼,整個流程是這樣的:

在DOM事件流中,實際目標(

元素)在捕獲階段不接收事件,即在捕獲階段,事件從document對象再到后就停止,進入“處于目標”階段,事件在
元素上發生,然后才進入冒泡階段,將事件傳回給文檔。

注意:目前主流瀏覽器都支持DOM事件流,只有IE8和之前版本不支持。

2.事件處理

事件處理,即響應某個事件。我們把事件處理的函數,稱為“事件處理程序”。
事件處理程序的名稱一般都以on開頭,如click事件的事件處理程序就是onclick,load事件的事件處理程序就是onload。
我們將事件處理程序,分為這么幾類:

HTML事件處理程序

DOM0級事件處理程序

DOM2級事件處理程序

IE事件處理程序

跨瀏覽器事件處理程序

2.1 HTML事件處理程序

某個元素支持的事件,都可以用一個與相應事件處理程序同名的HTML特性來指定,這個特性的值應該是能夠執行的JavaScript代碼。比如:

也可以把需要執行的具體事件多帶帶定義出來,可以放置與多帶帶.js文件,也可以在文檔內用

我們可以使用event中的對象和方法:

阻止事件的默認行為

var leo = document.getElementById("leo");
leo.onclick = function(event){
    // 只有當 event 中的 cancelable 屬性為true的事件
    event.preventDefault();
}

立即停止事件在DOM的傳播

通過調用event.stopPropagation()方法避免彈框出現兩次。

var leo = document.getElementById("leo");
leo.onclick = function(event){
    alert("leo");
    event.stopPropagation();
}
document.body.onclick = function(event){
    alert("hello leo");
}
3.2 IE中的事件對象

訪問IE中的事件對象event,方法有多種,取決于事件處理程序的方法:

DOM0級方法,使用window.event

var leo = document.getElementById("leo");
leo.onclick = function(){
    var event = window.event;
    alert(event.type);   // "click"
}

IE的attachEvent方法,event作為參數傳入(也可以使用window.event

var leo = document.getElementById("leo");
leo.attachEvent("onclick",function(event){
    alert(event.type);   // "click"
},false);
3.3 跨瀏覽器的事件對象

雖然DOM和IE中event對象不同,但我們也可以和前面的 跨瀏覽器事件處理程序 處理一樣,通過他們之間的區別,實現映射:

var my_event = {
    myAddFun : function(element, type, handler){
        // do some thing
    },
    // 返回對event的引用
    getMyEvent : function(event){
        return event?event:window.event;
    },
    // 返回事件的目標
    getMyTarget : function(event){
        return event.target || event.srcElement;
    },
    // 取消事件的默認行為
    preventDefault : function(event){
        if(event.preventDefault){
            event.preventDefault();
        }else {
            event.returnValue = false;
        }
    },

    myRemoveFun : function(element, type, handler){
        // do some thing
    },

    // 阻止事件流
    stopPropagetion : function(event){
        if(event.stopPropagetion){
            event.stopPropagetion();
        }else {
            event.cancelBubble = true;
        }
    }
}

var leo = document.getElementById("leo");
leo.onclick = function(event){
    alert("leo");
    event = my_event(event);
    my_event.stopPropagation(event);
}

leo.onclick = function(event){
    alert("hello world");
}
4.事件類型

Web瀏覽器中的事件類型有很多,DOM3級事件規定有以下幾類事件類型:

UI事件:當用戶與頁面上元素交互時觸發;

焦點事件:當元素失去或獲取焦點時觸發;

鼠標事件:當用戶通過鼠標在頁面操作時觸發;

滾輪事件:當使用鼠標滾輪(或類似設備)時觸發;

文本事件:當在文檔中輸入文本時觸發;

鍵盤事件:當用戶通過鍵盤操作時觸發;

合成事件:當為IME輸入字符時觸發;

變動事件:當底層DOM結構變動時觸發;

具體每個方法的詳細介紹,可以查看W3school HTML DOM Event 對象
或者查看《JavaScript高級程序設計(第三版)》的第362頁開始。
我后面會多帶帶整理一篇,介紹這些事件的文章。

5.事件委托

簡單理解就是講一個響應事件委托到另一個元素。
事件委托利用事件冒泡,指定一個事件處理程序來管理某一類型的所有事件,比如我們通過一個函數來代替其他三個函數:

  • 按鈕1
  • 按鈕2
  • 按鈕3
var btn1 = document.getElementById("btn1");
var btn2 = document.getElementById("btn2");
var btn3 = document.getElementById("btn3");
// my_event 在前面定義了
my_event.myAddFun(btn1, "click", function(event){
    alert("btn1點擊");
});
my_event.myAddFun(btn2, "click", function(event){
    alert("btn2點擊");
});
my_event.myAddFun(btn3, "click", function(event){
    alert("btn3點擊");
});

下面我們在DOM樹層級更高的元素上添加一個事件處理函數,來做事件委托,我們這么重寫這段代碼:

var btn = document.getElementById("btn");
my_event.myAddFun(btn, "click", function(event){
    event = my_event.getMyEvent(event);
    var target = my_event.getMyTarget(event);
    switch(target.id){
        case "btn1":
            alert("btn1點擊");
            break;
        case "btn2":
            alert("btn2點擊");
            break;
        case "btn3":
            alert("btn3點擊");
            break;
    }
});

最適合采用事件委托技術的事件包括:click/mousedown/mouseup/keyup/keydown/keypress,雖然mouseovermouseout事件也有冒泡,但因為不好處理它們并且經常需要重新計算元素位置。

可以看出,事件委托有以下優點:

減少內存消耗

動態綁定事件

6.事件模擬

JavaScript的事件模擬主要用來在任意時刻觸發特定事件。

6.1 DOM中的事件模擬

document對象上使用createEvent()方法創建一個event對象。
createEvent()接收一個參數,即要創建的事件類型的字符串。
DOM2級中,所有這些字符串都使用英文復數形式,DOM3級中都變成單數,也可以是下面中的字符串:

UIEvents : 一般化的UI事件(鼠標和鍵盤事件都繼承自UI事件)(DOM3級中UIEvent

MouseEvents : 一般化的鼠標事件(DOM3級中MouseEvent

MutationEvents : 一般化的DOM滾動事件(DOM3級中MutationEvent

HTMLEvents : 一般化的HTML事件(DOM3級中HTMLEvent

創建event之后,我們需要使用dispatchEvent()方法去觸發這個事件,需要傳入一個參數,參數是需要觸發事件的event對象。

所有支持事件的DOM節點都支持這個方法。事件觸發之后,事件就能照樣冒泡并引發響應事件處理程序的執行。

6.1.1 模擬鼠標事件

使用createEvent()方法傳入MouseEvents創建一個鼠標事件,返回的對象有一個initMouseEvent()方法,用于指定與該鼠標事件相關的信息,有15個參數:

type : 字符串,表示觸發的事件類型,如click

bubble : 布爾值,表示是否冒泡,為了精確模擬鼠標事件,通常設置為true

cancelable :布爾值,表示是否可以取消,為了精確模擬鼠標事件,通常設置為true

view : 與事件關聯的視圖,基本都設置為document.defaultView

detail : 整數,與事件有關的詳細信息,基本設置為0

screenX : 整數,事件相對屏幕的X坐標

screenY : 整數,事件相對屏幕的Y坐標

clientX : 整數,事件相對視口的X坐標

clientY : 整數,事件相對視口的Y坐標

ctrlKey : 布爾值,表示是否按下Ctrl鍵,默認false

altKey : 布爾值,表示是否按下Alt鍵,默認false

shiftKey : 布爾值,表示是否按下Shift鍵,默認false

metaKey : 布爾值,表示是否按下Meta鍵,默認false

button : 整數,表示按下哪個鼠標鍵,默認0

relatedTarget : 對象,表示與事件相關的對象,只在mouseovermouseout時使用

案例:

var btn = document.getElementById("btn");
var myEvent = document.createEvent("MouseEvents");
myEvent.initMouseEvent(
    "click", true, true, document.defaultView, 
    0, 0, 0, 0, 0,
    false, false, false, false, 0, null
)
btn.dispatchEvent(myEvent);
6.1.2 模擬鍵盤事件

DOM3級規定,使用createEvent()方法傳入KeyboardEvent創建一個鍵盤事件,返回的對象有一個initKeyEvent()方法,有8個參數:

type : 字符串,表示觸發的事件類型,如keydown

bubble : 布爾值,表示是否冒泡,為了精確模擬鍵盤事件,通常設置為true

cancelable :布爾值,表示是否可以取消,為了精確模擬鍵盤事件,通常設置為true

view : 與事件關聯的視圖,基本都設置為document.defaultView

key : 整數,表示按下的鍵的鍵碼

localtion : 整數,表示按下哪里的鍵,默認0表示主鍵盤,1表示左,2表示右,3表示數字鍵盤,4表示移動設備(即虛擬鍵盤),5表示手柄

modifiers : 字符串,空格分隔的修改件列表,如"shift"

repeat : 整數,在一行中按了多少次這個鍵

由于DOM3級不提倡使用keypress事件,因此只能用這個方式來模擬keyup/keydown事件。

模擬按住Shift和A鍵的案例:

var btn = document.getElementById("btn");
var myEvent;

// 以DOM3級方式創建
if(document.implementation.hasFeature("KeyboardEvents", "3.0")){
    myEvent = document.createEvent("KeyboardEvent");
    myEvent.initKeyboardEvent(
        "keydown", true, true, document.defaultView,
        "a", 0, "Shift", 0
    );
}
btn.dispatchEvent(myEvent);
6.1.3 模擬其他事件

如模擬變動事件HTML事件。

模擬變動事件

通過createEvent()傳入MutationEvents參數創建,返回一個initMutationEvent()方法,這個方法接收參數包括:type/bubbles/cancelable/relatedNode/preValue/newValue/attrName/attrChange,下面模擬一個案例:

var btn = document.getElementById("btn");
var myEvent = document.createEvent("MutationEvents");
myEvent.initMutationEvent(
    "DOMNodeInserted", true, false, someNode, "", "", "", 0
);
btn.dispatchEvent(myEvent);

模擬HTML事件

通過createEvent()傳入HTMLEvents參數創建,返回一個initEvent()方法,下面模擬一個案例:

var btn = document.getElementById("btn");
var myEvent = document.createEvent("HTMLEvents");
myEvent.initEvent("focus", true, false);
btn.dispatchEvent(myEvent);
6.1.4 自定義DOM事件

通過createEvent()傳入CustomEvent參數創建,返回一個initCustomEvent()方法,有4個參數:

type : 字符串,表示觸發的事件類型,如keydown

bubble : 布爾值,表示是否冒泡,為了精確模擬鍵盤事件,通常設置為true

cancelable :布爾值,表示是否可以取消,為了精確模擬鍵盤事件,通常設置為true

detail : 對象,任意值,保存在event對象的detail屬性中

案例:

var btn = document.getElementById("btn");
var myEvent;

// my_event在前面定義 2.6 跨瀏覽器事件處理程序
my_event.addMyEvent(btn, "myevent", function(event){
    alert("btn detail ", event.detail);
});

my_event.addMyEvent(document, "myevent", function(event){
    alert("document detail ", event.detail);
});


// 以DOM3級方式穿件
if(document.implementation.hasFeature("CustomEvents", "3.0")){
    myEvent = document.createEvent("CustomEvent");
    myEvent.initCustomEvent(
        "myevent", true, false, "hello leo",
    );
    btn.dispatchEvent(myEvent);
}
6.2 IE中的事件模擬

IE8及之前的版本模擬事件和DOM中模擬思路相似:想創建event對象再指定信息,最后觸發。
區別在于,IE中使用document.createEventObject()方法創建event對象,并且不接收參數,返回一個通用event對象,我們要做的就是給這個event對象添加信息,最后在目標上調用fireEvent()方法,并接受兩個參數(事件處理程序的名稱和event對象)。
在調用fireEvent()方法會自動添加srcElementtype屬性,我們需要手動添加其他屬性,下面模擬一個click事件:

var btn = document.getElementById("btn");
var myEvent = document.createEventObject();

myEvent.screenX = 100;
myEvent.screenY = 0;
myEvent.clientX = 100;
myEvent.clientY = 0;
myEvent.ctrlKey = false;
myEvent.altKey = false;
myEvent.shiftKey = false;
myEvent.button = 0;

btn.fireEvent("onclick", event);
參考文章

《JavaScript高級程序設計》第13章 事件

本部分內容到這結束

Author 王平安
E-mail pingan8787@qq.com
博 客 www.pingan8787.com
微 信 pingan8787
每日文章推薦 https://github.com/pingan8787...
JS小冊 js.pingan8787.com

歡迎關注微信公眾號【前端自習課】每天早晨,與您一起學習一篇優秀的前端技術博文 .

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108871.html

相關文章

  • 重溫基礎】21.高階函數

    摘要:歡迎您的支持系列目錄復習資料資料整理個人整理重溫基礎篇重溫基礎對象介紹重溫基礎對象介紹重溫基礎介紹重溫基礎相等性判斷重溫基礎閉包重溫基礎事件本章節復習的是中的高階函數,可以提高我們的開發效率。 本文是 重溫基礎 系列文章的第二十一篇。 今日感受:想家。 本人自己整理的【Cute-JavaScript】資料,包含:【ES6/ES7/ES8/ES9】,【JavaScript基礎...

    wua_wua2012 評論0 收藏0
  • 重溫基礎】22.內存管理

    摘要:內存泄露內存泄露概念在計算機科學中,內存泄漏指由于疏忽或錯誤造成程序未能釋放已經不再使用的內存。判斷內存泄漏,以字段為準。 本文是 重溫基礎 系列文章的第二十二篇。 今日感受:優化學習方法。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1-14篇 【重溫基礎】15.JS對象介紹 【重溫基礎】16.JSON對象介紹 【重溫基礎】1...

    Pandaaa 評論0 收藏0
  • 重溫基礎】7.時間對象

    摘要:本文是重溫基礎系列文章的第七篇。系列目錄復習資料資料整理個人整理重溫基礎語法和數據類型重溫基礎流程控制和錯誤處理重溫基礎循環和迭代重溫基礎函數重溫基礎表達式和運算符重溫基礎數字本章節復習的是中的時間對象,一些處理的方法。 本文是 重溫基礎 系列文章的第七篇。今日感受:做好自律。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1.語法和數據類型...

    YuboonaZhang 評論0 收藏0
  • 重溫基礎】17.WebAPI介紹

    摘要:本文是重溫基礎系列文章的第十七篇。系列目錄復習資料資料整理個人整理重溫基礎篇重溫基礎對象介紹重溫基礎對象介紹本章節復習的是中的關于相關知識,介紹的比較多。表示在給定的時間的相關設備的位置。所有現代瀏覽器均支持對象和使用。 本文是 重溫基礎 系列文章的第十七篇。今日感受:挑戰。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1-14篇 【...

    android_c 評論0 收藏0
  • 重溫基礎】14.元編程

    摘要:本文是重溫基礎系列文章的第十四篇。元,是指程序本身。有理解不到位,還請指點,具體詳細的介紹,可以查看維基百科元編程。攔截,返回一個布爾值。 本文是 重溫基礎 系列文章的第十四篇。 這是第一個基礎系列的最后一篇,后面會開始復習一些中級的知識了,歡迎持續關注呀! 接下來會統一整理到我的【Cute-JavaScript】的JavaScript基礎系列中。 今日感受:獨樂樂不如眾樂樂...

    cc17 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<