web開發中事件處理規則有哪些
這次帶給大家web開發中事件處理規則有哪些,web開發中事件處理的注意事項有哪些,下面就是實戰案例,一起來看一下。
事件處理
我們知道事件觸發時,事件物件(event物件)會作為回呼參數傳入事件處理程序中,舉例說明:
// 不好的写法function handleClick(event) { var pop = document .getElementById('popup'); popup.style.left = event.clientX + 'px'; popup.style.top = event.clientY + 'px'; popup.className = 'reveal'; }// 你应该明白addListener函数的意思addListener(element, 'click', handleClick);
這段程式碼只用到了event物件的兩個屬性:clientX和clientY。在將元素顯示在頁面里之前先用這兩個屬性個它作定位。儘管這段程式碼看起來非常簡單且沒有什麼問題,但實際上是不好的寫法,因為這種做法有其限制。
規則1:隔離應用邏輯
上段實例程式碼的第一個問題是事件處理程序包含了應用程式用邏輯(application logic)。應用邏輯是和應用相關的功能性程式碼,而不是和使用者行為相關的。上段實例程式碼中應用邏輯是在特定位置顯示一個彈出框。儘管這個互動應該是在使用者點擊某個特定元素時發生,但情況並不總是如此。
將應用程式邏輯從所有事件處理程序中抽離出來的做法是一種最佳實踐,因為說不定什麼時候其他地方就會觸發同一段邏輯。例如,有時你需要在使用者將滑鼠移到某個元素上時判斷是否顯示彈出框,或者當按下鍵盤上的某個鍵時也作同樣的邏輯判斷。這樣多個事件的處理程序執行了同樣的邏輯,而你的程式碼卻被不小心複製了多份。
將應用程式邏輯放置在事件處理程序中的另一個缺點是和測試有關的。測試時需要直接觸發功能程式碼,而不必透過模擬對元素的點擊來觸發。如果將應用邏輯放置於事件處理程序中,唯一的測試方法是製造事件的觸發。儘管某些測試框架可以模擬觸發事件,但實際上這不是測試的最佳方法。呼叫功能性程式碼最好的做法就是單一的函數呼叫。
你總是需要將應用邏輯和事件處理的程式碼分開。如果要對上一段實例程式碼進行重構,第一步是將處理彈出框邏輯的程式碼放入單獨的函數中,這個函數很可能會掛載於為該應用程式定義的一個全域物件上。事件處理程序應總是在一個相同的全域物件中,因此就有了以下兩個方法。
// 好的写法 - 拆分应用逻辑var MyApplication = { handleClick: function (event) { this.showPopup(event); }, showPopup: function (event) { var pop = document.getElementById('popup'); popup.style.left = event.clientX + 'px'; popup.style.top = event.clientY + 'px'; popup.className = 'reveal'; } }; addListener(element, 'click', function (event) { MyApplication.handleClick(event); });
之前在事件處理程序中包含的所有應用邏輯現在轉移到了MyApplication.showPopup()方法中。現在MyApplication.handleClick()方法只做一件事情,也就是呼叫MyApplication.showPopup()。若應用邏輯被剝離出去,對同一段功能代碼的呼叫可以在多點發生,則不需要一定依賴某個特定事件的觸發,這顯然更加方便。但這只是拆解事件處理程序程式碼的第一步。
規則2:不要分發事件物件
在剝離出應用邏輯之後,上段實例程式碼還存在一個問題,就是event物件被無節制地分發。它從匿名的事件處理函數傳入了MyApplication.handleClick(),然後又傳入了MyApplication.showPopup()。如同上文所提到的,event物件上包含很多和事件相關的額外信息,而這段程式碼只用到了其中的兩個而已。應用邏輯不應依賴event物件來正確完成功能,原因如下:
方法介面並沒有顯示哪些資料是必要的。好的API一定是對於期望和依賴都是透明的。將event物件作為參數並不能告訴你event的哪些屬性是有用的,用來幹什麼?
因此,如果你想測試這個方法,你必須重新建立一個event物件並將它作為參數傳入。所以,你需要確切地知道這個方法使用了哪些訊息,這樣才能正確地寫出測試程式碼。
這些問題(指介面格式不清晰且自行建構event物件來用於測試)在大型Web應用程式中都是不可取的。程式碼不夠明晰就會導致bug。
最佳的方法是讓事件處理程序使用event物件來處理事件,然後拿到所有需要的資料傳給應用邏輯。例如,MyApplication.showPopup()方法只需要兩個數據,x座標和y座標。這樣我們將方法重寫一下,讓它來接收這兩個參數。
// 好的写法var MyApplication = { handleClick: function (event) { this.showPopup(event.clientX, event.clientY); }, showPopup: function (x, y) { var pop = document.getElementById('popup'); popup.style.left = x + 'px'; popup.style.top = y + 'px'; popup.className = 'reveal'; } }; addListener(element, 'click', function (event) { MyApplication.handleClick(event); });
在这段新重写的代码中,MyApplication.handleClick()将x坐标和y坐标传入了MyApplication.showPopup(),代替了之前传入的事件对象。可以很清晰地看到MyApplication.showPopup()所期望传入的参数,并且在测试或代码的任意位置都可以很轻易地直接调用这段逻辑,比如:
// 这样调用非常棒MyApplication.showPopup(10, 10);
当处理事件时,最好让事件处理程序成为接触到event对象的唯一的函数。事件处理程序应当在进入应用逻辑之前针对event对象执行任何必要的操作,包括阻止默认事件或阻止事件冒泡,都应当直接包含在事件处理程序中。比如:
// 好的写法var MyApplication = { handleClick: function (event) { // 假设事件支持DOM Level2 event.preventDefault(); event.stopPropagation(); // 传入应用逻辑 this.showPopup(event.clientX, event.clientY); }, showPopup: function (x, y) { var pop = document.getElementById('popup'); popup.style.left = x + 'px'; popup.style.top = y + 'px'; popup.className = 'reveal'; } }; addListener(element, 'click', function (event) { MyApplication.handleClick(event); });
在这段代码中,MyApplication.handleClick()是事件处理程序,因此它在将数据传入应用逻辑之前调用了event.preventDefault()和event.stopPropagation(),这清除地展示了事件处理程序和应用逻辑之间的分工。因为应用逻辑不需要对event产生依赖,进而在很多地方都可以轻松地使用相同的业务逻辑,包括写测试代码。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上是web開發中事件處理規則有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

一、日誌輸出到檔案使用模組:logging可以產生自訂等級日誌,可以輸出日誌到指定路徑日誌等級:debug(偵錯日誌)=5){clearTimeout(time)//如果連續10次取得的都是空日誌清除定時任務}return}if(data.log_type==2){//如果取得到新日誌for(i=0;i

Caddy簡介Caddy是一款功能強大,擴展性高的Web伺服器,目前在Github上已有38K+Star。 Caddy採用Go語言編寫,可用於靜態資源託管和反向代理。 Caddy具有以下主要特性:比較Nginx複雜的配置,其獨創的Caddyfile配置非常簡單;可以透過其提供的AdminAPI實現動態修改配置;預設支援自動化HTTPS配置,能自動申請HTTPS憑證並進行配置;能夠擴展到數以萬計的站點;可以在任意地方執行,沒有額外的依賴;採用Go語言編寫,內存安全更有保證。安裝首先我們直接在CentO

表單驗證是Web應用程式開發中非常重要的環節,它能夠在提交表單資料之前對資料進行有效性檢查,避免應用程式出現安全漏洞和資料錯誤。使用Golang可以輕鬆實現網頁應用程式的表單驗證,本文將介紹如何使用Golang來實作網頁應用程式的表單驗證。一、表單驗證的基本要素在介紹如何實作表單驗證之前,我們需要知道表單驗證的基本要素是什麼。表單元素:表單元素是指

JavaAPI開發中使用Jetty7進行Web伺服器處理隨著互聯網的發展,Web伺服器已經成為了應用程式開發的核心部分,同時也是許多企業所關注的焦點。為了滿足日益增長的業務需求,許多開發人員選擇使用Jetty進行Web伺服器開發,其靈活性和可擴展性受到了廣泛的認可。本文將介紹如何在JavaAPI開發中使用Jetty7進行We

i34150搭配1G獨顯能玩哪些遊戲能玩lol等小遊戲。 GTX750和GTX750TI是非常適合的顯示卡選擇。如果只是玩一些小遊戲或不玩遊戲,建議使用i34150的整合式顯示卡就可以了。一般來說,顯示卡和處理器的搭配差價並不是很大,所以選擇合理的搭配是很重要的。若需要2G顯存,建議選擇GTX750TI;若只需要1G顯存,直接選擇GTX750即可。 GTX750TI可以看作是GTX750的增強版本,具有超頻功能。 i34150可以搭配什麼顯示卡依需求,如果你打算玩單機遊戲,建議你考慮更換顯示卡。你可以選擇

首先你會有個疑惑,frp是什麼呢?簡單的說frp就是內網穿透工具,配置客戶端以後,可以透過伺服器來存取內部網路。現在我的伺服器,已經用nginx做站了,80端口只有一個,那如果frp的服務端也想使用80端口,那該怎麼辦呢?經過查詢,這個是可以實現的,就是利用nginx的反向代理來實現。補充一下:frps就是伺服器端(server),frpc就是客戶端(client)。第一步:修改伺服器中nginx.conf設定檔在nginx.conf中http{}裡加入以下參數,server{listen80

防擋臉彈幕,即大量彈幕飄過,但不會遮擋視訊畫面中的人物,看起來像是從人物背後飄過去的。機器學習已經火了好幾年了,但很多人都不知道瀏覽器中也能運行這些能力;本文介紹在視頻彈幕方面的實踐優化過程,文末列舉了一些本方案可適用的場景,期望能開啟一些腦洞。 mediapipeDemo(https://google.github.io/mediapipe/)展示主流防擋臉彈幕實現原理點播up上傳視訊伺服器後台計算提取視訊畫面中的人像區域,轉換成svg儲存用戶端播放視訊的同時,從伺服器下載svg與彈幕合成,人像

Web標準是一組由W3C和其他相關組織制定的規範和指南,它包括HTML、CSS、JavaScript、DOM、Web可訪問性和性能優化等方面的標準化,透過遵循這些標準,可以提高頁面的兼容性、可訪問性、可維護性和效能。 Web標準的目標是使Web內容能夠在不同的平台、瀏覽器和裝置上一致地展示和交互,提供更好的使用者體驗和開發效率。
