您的位置:首頁>設計>正文

web前端學習之:JavaScript 流覽器事件解析

分享前還是先分享自己的web前端學習交流群:614315657群內不定時分享乾貨, 包括2017最新的web前端企業案例學習資料和零基礎入門教程, 歡迎初學和進階中的小夥伴入群學習交流

JavaScript、流覽器、工作之間的關係

JavaScript 程式採用了非同步工作驅動程式設計(Event-driven programming)模型, 維琪百科對它的解釋是:

工作驅動程式設計(英語:Event-driven programming)是一種電腦程式設計模型。 這種模型的程式運轉流程是由使用者的動作(如滑鼠的按鍵, 鍵盤的按鍵動作)或者是由其他程式的音訊來決議的。 相對於批次程式設計(batch programming)而言, 程式運轉的流程是由程式師來決議。

批量的程式設計在初級程式設計教育課程上是一種方式。 然而, 工作驅動程式設計這種設計模型是在交互程式(Interactive program)的情況下孕育而生的

簡頁言之, 在 web 前端程式設計裡邊 JavaScript 經過流覽器提供的工作模型 API 和使用者交互, 接納用戶的輸入

由於用戶的行為是不確定的,

也就是說不知道用戶什麼時分發作點擊、翻滾這些動作。 這種場景是傳統的同步程式設計模型沒法處理的, 由於你不可能等用戶操作完了才履行後邊的代碼

比方我們在 Python 裡邊調用接納用戶輸入的辦法 raw_input() 後終端就會一向等待使用者的輸入, 直到輸入完成才會履行後邊的代碼邏輯。 可是在下面這段 NodeJS 代碼中, 接納用戶輸入的辦法 process.stdin.read 是在一個工作中調用的。 後邊的代碼不會被堵塞(blocked)

JavaScript

'use strict';

process.stdin.on('readable', () => {

var chunk = process.stdin.read();

if (chunk !== null) {

process.stdout.write(`Async output data: ${chunk}`);

}

});

process.stdin.on('end', () => {

process.stdout.write('end');

});

console.log('Will not be blocked');

工作驅動程式模型基本的實現原理基本上都是運用 工作迴圈(Event Loop), 這部分內容涉及流覽器工作模型、回檔原理, 有興趣的去看連結裡邊的視頻學習下

需求說明的是在用戶端 JavaScript 中像 setTimeout, XMLHTTPRequest 這類 API 並不是 JavaScript 語言自身就有的。 而是 JavaScript 的宿主環境(在用戶端 JavaScript 中就是流覽器),

相同像 DOM、BOM、Event API 都是流覽器提供的

工作綁定的辦法

DOM 元素行內綁定

直接在 DOM 元素上經過設置 on + eventType 來綁定工作處理常式

XHTML

1

href="#none" onclick="alert('clicked.')">點擊我

這種綁定辦法是最原始的, 有兩個缺陷:

1 工作處理常式和 HTML 結構混雜在一同

前期在結構、樣式、體現分離的時代很忌諱這一點。

現在看來在許多 MVX 結構中將工作綁定和 DOM 結構放在一同處理, 這樣好像更便利保護(不用來回切換 HTML,JavaScript 檔), 並且也契合可預見(predictable)性的規矩

2 命名空間抵觸

由於 onclick 中的 JavaScript 代碼片段履行環境是大局效果域。 然而在 JavaScript 語言中並沒有相關的命名空間特性。 所以就很容易形成命名空間的抵觸, 非要用這種辦法綁定工作的話只能用目標來做一些封裝

陳舊的綁定辦法

運用 DOM Element 上面的 on + eventType 特點 API

注意這僅僅個示例, 生產環境很少會用到。 一般用 DOM Ready 就能夠了, 由於 JavaScript 的履行一般不用等到頁面資源全部載入完, DOM 載入完就能夠了

現代/規範的綁定辦法

規範的綁定辦法有兩種, addEventListener 和 attachEvent 前者是規範流覽器支援的 API, 後者是 IE 8 以下流覽器支持的 API。 一般需求我們做個相容封裝

JavaScript

href="javascript:alert(1)" onclick="alert(2)" id="link">click me

正確的結果應該是 3,4,5,1, 根據結果我們能夠得出以下結論:

連結上的 href 偽 javascript 協議相當於在流覽器位址欄履行了一段 JavaScript 代碼, 連結如果是這種格式, 點擊的時分相當於履行了這段 JavaScript 腳本

行內的工作綁定和元素調用 onclick 綁定工作會掩蓋

運用 jQuery(內部運用規範工作註冊 API)能夠綁定多個工作處理常式

工作冒泡

大部分工作會沿著工作觸發的目標元素往上傳播。 比方:body>div>p>span 如果他們都註冊了點擊工作, 那麼在 span 元素上觸發點擊工作後 p,div,body 各自的點擊工作也會按次序觸發

工作冒泡是能夠被中止的, 下面這個函數封閉了中止工作冒泡的辦法:

JavaScript

工作署理

有時分我們需求給 不存在的(可能將來會有)的一段 DOM 元素綁定工作,比方給一段 Ajax 請求完成後渲染的 DOM 節點綁定工作。一般綁定的邏輯會在渲染前履行,綁定的時分找不到元素所以並不能成功,當然你也能夠把綁定工作的代碼放在 Ajax 請求之後。這樣做在一些工作邏輯簡單的使用裡邊沒問題,可是會加重資料渲染邏輯和工作處理的邏輯耦合。一但工作處理常式特別多的時分,我們一般建議把工作的邏輯和其它代碼邏輯分離,這樣便利保護。

為了處理這個問題,我們一般運用工作署理/託付(Event Delegation )。並且一般來說運用 工作署理的功能會比獨自綁定工作高 許多

寫在最後:

篇幅有限,今天先分享這麼多,如果大家喜歡的話我會再更新,專注學習web前端技術的小夥伴可以進群(614315657)一起交流學習,群裡還有大量學習資料可供大家自行下載參看,歡迎大家一起來交流討論。

工作署理

有時分我們需求給 不存在的(可能將來會有)的一段 DOM 元素綁定工作,比方給一段 Ajax 請求完成後渲染的 DOM 節點綁定工作。一般綁定的邏輯會在渲染前履行,綁定的時分找不到元素所以並不能成功,當然你也能夠把綁定工作的代碼放在 Ajax 請求之後。這樣做在一些工作邏輯簡單的使用裡邊沒問題,可是會加重資料渲染邏輯和工作處理的邏輯耦合。一但工作處理常式特別多的時分,我們一般建議把工作的邏輯和其它代碼邏輯分離,這樣便利保護。

為了處理這個問題,我們一般運用工作署理/託付(Event Delegation )。並且一般來說運用 工作署理的功能會比獨自綁定工作高 許多

寫在最後:

篇幅有限,今天先分享這麼多,如果大家喜歡的話我會再更新,專注學習web前端技術的小夥伴可以進群(614315657)一起交流學習,群裡還有大量學習資料可供大家自行下載參看,歡迎大家一起來交流討論。

Next Article
喜欢就按个赞吧!!!
点击关闭提示