【讀書筆記】:《編寫可維護的JavaScript》第07章 事件處理
編寫可維護的JavaScript
第07章 事件處理
7.1 典型用法
當事件觸發時,事件物件(event物件)會作為回撥引數傳入事件處理程式中。event物件包含所有和事件相關的資訊,包括事件的宿主(target)以及其他和事件型別相關的資料。滑鼠事件會將其位置資訊暴露在event物件上,鍵盤事件會將案件資訊暴露在event物件上,觸屏事件會將觸控位置和持續時間暴露在event 物件上。只有提供了所有這些資訊,UI才會正確地執行互動。
在很多場景中,你只是用到了event所提供資訊的一小部分,看下面這段程式碼。
// 不好的寫法
function handleClick(event) {
"use strick";
var popup = document.getElementById("popup");
popup.style.left = event.clientX + "px";
popup.style.top = event.clientY + "px";
popup.className = "reveal";
}
儘管這段程式碼看起來非常簡單並且沒什麼問題,但實際上是不好的寫法,因為這種做法有侷限性。
7.2 規則1:隔離應用邏輯
上段例項程式碼的第一個問題是事件處理程式包含了應用邏輯(application logic)。應用邏輯是和應用相關的功能性程式碼,而不是和使用者行為相關的。上段程式碼中,應用邏輯是在特定位置顯示一個彈出框。儘管這個互動應當是在使用者點選某個特定元素時發生,但情況並不總是如此。
將應用邏輯從所有事件處理程式中抽離出來的做法是一種最佳實踐,因為說不定什麼時候其他地方就會觸發同一段邏輯。比如,有時你需要使用者滑鼠移到某個元素上時判斷是否顯示彈出框,或者按下鍵盤的某個鍵時也作同樣的邏輯判斷。這樣多個時間的處理程式執行了同樣的邏輯,而你的程式碼卻不小心複製了多份。
如果對上段例項程式碼進行重構,第一步是將處理彈出框邏輯程式碼放入一個單獨的函式中,這個函式很可能掛載於為該應用定義的一個全域性物件上。事件處理程式應當總是在一個相同的全域性物件中,因此就有了以下兩個方法:
var MyApplication = {
handleClick: function (event) {
"use strict";
this.showPopup(event);
},
showPopup: function (event) {
"use strict";
var popup = document.getElementById("popup");
popup.style.left = event.clientX + "px";
}
};
addListener(element, "click", function (event) {
"use strict";
MyApplication.handleClick(event);
});
之前的事件處理程式中包含的所有應用邏輯現在轉移到了MyApplication.showPopup()方法中。現在MyApplication.handleClick()方法只做一件事情,即呼叫MyApplication.showPopup()。
7.3 規則2:不要分發事件物件
在剝離出應用邏輯之後,上段程式碼還存在一個問題,即event物件被無節制地分發。它從匿名的事件處理函式傳入了MyApplication.handleClick(),然後又傳入了MyApplication.showPopup()。正如上文提到的,event物件上包含很對和事件相關的額外資訊,而這段程式碼只用到了其中的兩個而已。
應用邏輯不應當依賴event物件來正確完成功能,原因如下:
如果你想測試這個方法,你必須重新建立一個event物件並將它作為引數傳入。
最佳的辦法是讓事件事件處理程式使用event物件來處理事件,然後拿到所有需要的資料傳給應用邏輯。例如 MyApplication.showPopup() 方法只需要使用兩個資料,x座標和y座標:
// 好的寫法
var MyApplication= {
handleClick: function (event) {
"use strict";
this.showPopup(event.clientX, event.clientY);
},
showPopup: function (x, y) {
"use strict";
var pupup = document.getElementById("popup");
pupup.style.left = x;
pupup.style.top = y;
pupup.className = "reveal";
}
};
addListener(element, "click", function (event) {
"use strict";
MyApplication.handleClick(event);
});
這段重寫的程式碼中,MyApplication.handleClick() 將 x 座標和 y 座標傳入了MyApplication.showPopup()。代替了之前傳入的事件物件。可以很清晰地看到MyApplication.showPopup()所期望傳入的引數,並且測試或程式碼的任意位置都可以很輕鬆地直接呼叫這段邏輯:
MyApplication. showPopup(10,20);
當處理事件時,最好讓事件處理城西稱謂接觸到event物件的唯一函式。事件處理程式應當在進入應用邏輯之前針對event物件執行任何必要的操作,包括阻止預設事件或事件冒泡,都應當直接包含在事件處理程式中。
var MyApplication = {
handleClick: function (event) {
"use strict";
// 假設事件支援 DOM Level2
event.preventDefault();
event.stopPropagation();
this.showPopup(event.clientX, event.clientY);
},
showPopup: function (x, y) {
"use strict";
var pupup = document.getElementById("popup");
pupup.style.left = x;
pupup.style.top = y;
pupup.className = "reveal";
}
};
addListener(element, "click", function (event) {
"use strict";
MyApplication.handleClick(event);
});
相關文章
- 編寫可維護的JavaScriptJavaScript
- 尋找頭緒:編寫可維護的 JavaScriptJavaScript
- 編寫可維護的JSJS
- 編寫可維護的CSSCSS
- 讀書筆記:編寫高質量javascript的68個方法筆記JavaScript
- 編寫可維護的JavaScript-程式設計風格JavaScript程式設計
- 如何編寫可維護的物件導向JavaScript程式碼物件JavaScript
- 維度處理-資料倉儲-讀書筆記(四)筆記
- 【讀書筆記】JavaScript高階程式設計(第3版)(第5-7章)筆記JavaScript程式設計
- 讀書筆記之《現代軟體工程》第5.5章、第6章、第7章筆記軟體工程
- 《APUE》第7章 程式環境-讀書筆記筆記
- 讀書筆記——《軟體工程》第10~12章筆記軟體工程
- 《Effective C++》第5章 實現-讀書筆記C++筆記
- 《編寫可讀程式碼的藝術》讀書筆記(上)表面層次的改進筆記
- mORMot 1.18 第07章 簡單的讀寫操作ORM
- 書寫可維護程式碼的重要性
- 《Python資料處理》讀書筆記Python筆記
- CCNA中文讀書筆記第1章:Internetworking(轉)筆記
- 讀書筆記:深入解析oracle-第5章 記憶體管理筆記Oracle記憶體
- 《精通JavaScript》讀書筆記JavaScript筆記
- 第6章:可維護性軟體構建方法 6.3可維護性構建技術
- 【演算法圖解】讀書筆記:第3章 遞迴演算法圖解筆記遞迴
- 《Effective C++》第3章 資源管理(2)-讀書筆記C++筆記
- 《Effective C++》第3章 資源管理(1)-讀書筆記C++筆記
- 讀書筆記:深入解析oracle-第4章 資料字典筆記Oracle
- Dave Cheney:編寫簡單,可讀,可維護的Go程式碼的十個工程建議Go
- 第6章:可維護性軟體構建方法 6.1可維護性的度量和構造原則
- 讀書筆記——讀《構建之法:現代軟體工程》第13~17章筆記軟體工程
- 程式碼整潔之道 讀書筆記(一) 第11章 系統筆記
- 程式碼整潔之道 讀書筆記(二)第12章 迭進筆記
- 《Effective C++》第4章 設計與宣告(2)-讀書筆記C++筆記
- 《Effective C++》第4章 設計與宣告(1)-讀書筆記C++筆記
- 讀《程式碼不朽:編寫可維護軟體的10大要則》C# 版C#
- 編譯原理讀書筆記編譯原理筆記
- JavaScript DOM 程式設計藝術(第2版) 讀書筆記JavaScript程式設計筆記
- 如何編寫高質量和可維護的程式碼
- 編寫更加穩定/可讀的javascript程式碼JavaScript
- ES 筆記三十七:處理併發讀寫操作筆記