自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

盤點(diǎn)JavaScript focus/blur(聚焦)實(shí)際應(yīng)用

開發(fā) 前端
本文基于JavaScript基礎(chǔ),介紹了focus/blur(聚焦)實(shí)際應(yīng)用。通過事件以及對(duì)方法的講解。在元素獲得/失去焦點(diǎn)時(shí)會(huì)觸發(fā) focus和 blur事件,通過 document.activeElement來獲取當(dāng)前所聚焦的元素。

[[414324]]

大家好,我進(jìn)階學(xué)習(xí)者。

一、前言

當(dāng)用戶點(diǎn)擊某個(gè)元素或使用鍵盤上的 Tab 鍵選中時(shí),該元素將會(huì)獲得聚焦(focus)。當(dāng)網(wǎng)頁加載時(shí),HTML-特性(attribute)。

autofocus也可以讓一個(gè)焦點(diǎn)落在元素上,不僅如此,還有其它途徑可以獲得焦點(diǎn)。

二、focus/blur 事件

當(dāng)元素聚焦時(shí),會(huì)觸發(fā) focus事件,當(dāng)元素失去焦點(diǎn)時(shí),會(huì)觸發(fā) blur事件。讓使用它們來校驗(yàn)一個(gè) input字段。

1. 案例分析

blur事件處理程序檢查這個(gè)字段是否輸入了電子郵箱,如果沒有輸入,則顯示一個(gè) error。

focus事件處理程序隱藏 error 信息(在blur事件處理程序上會(huì)被再檢查一遍)。

2. 代碼

  1. <style> 
  2.   .invalid { border-color: red; } 
  3.   #error { color: red } 
  4. </style> 
  5. Your email please:  
  6. <input type="email" id="input"
  7. <div id="error"
  8. </div> 
  9. <script> 
  10. input.onblur = function() { 
  11.   if (!input.value.includes('@')) { // not email 
  12.     input.classList.add('invalid'); 
  13.     error.innerHTML = 'Please enter a correct email.' 
  14.   } 
  15. }; 
  16. input.onfocus = function() { 
  17.   if (this.classList.contains('invalid')) { 
  18.     // 移除 "error" 指示,因?yàn)橛脩粝胍匦螺斎胍恍﹥?nèi)容 
  19.     this.classList.remove('invalid'); 
  20.     error.innerHTML = ""
  21.   } 
  22. }; 
  23. </script> 
圖片

注:

現(xiàn)代 HTML 允許使用 input特性(attribute),進(jìn)行許多驗(yàn)證:required,pattern等。

有時(shí)它們正是所需要的。當(dāng)需要更大的靈活性時(shí),可以使用 JavaScript。如果數(shù)據(jù)是正確的,可以把它自動(dòng)發(fā)送到服務(wù)器。

三、focus/blur 方法

elem.focus()和 elem.blur()方法可以設(shè)置和移除元素上的焦點(diǎn)。

例:

如果輸入值無效,可以讓焦點(diǎn)無法離開這個(gè) input字段:

  1. <body style="background-color: aqua;"
  2. Your email please:  
  3.   <input type="email" id="input"
  4.     <input type="text" style="width:220px" placeholder="make email invalid and try to focus here"
  5.     <script> 
  6.         input.onblur = function() { 
  7.             if (!this.value.includes('@')) { // not email 
  8.                 // 顯示 error 
  9.                 this.classList.add("error"); 
  10.                 // ...將焦點(diǎn)放回來 
  11.                 input.focus(); 
  12.             } else { 
  13.                 this.classList.remove("error"); 
  14.             } 
  15.         }; 
  16. </script> 
  17. </body> 
圖片

注:

如果在 input中輸入一些內(nèi)容,然后嘗試使用 Tab 鍵或點(diǎn)擊遠(yuǎn)離 <input>的位置,那么 onblur事件處理程序會(huì)把焦點(diǎn)重新設(shè)置到這個(gè) input字段上。

四、focus/blur 委托

focus和blur事件不會(huì)向上冒泡。

例如,不能把 onfocus放在 <form>上來對(duì)其進(jìn)行高亮,像這樣:

  1. <!-- on focusing in the form -- add the class --> 
  2. <form onfocus="this.className='focused'"
  3.   <input type="text" name="name" value="Name"
  4.   <input type="text" name="surname" value="Surname"
  5. </form> 
  6. <style>  
  7.   .focused {  
  8.      
  9.     outline: 1px solid red;  
  10.   }  
  11. </style> 

當(dāng)用戶聚焦于 <input>時(shí),focus事件只會(huì)在該 <input>上觸發(fā)。它不會(huì)向上冒泡。所以 form.onfocus永遠(yuǎn)不會(huì)觸發(fā)。

form.onfocus永遠(yuǎn)不會(huì)觸發(fā),(兩個(gè)解決方案)。

1. 方案一

有一個(gè)遺留下來的有趣的特性(feature):focus/blur不會(huì)向上冒泡,但會(huì)在捕獲階段向下傳播。

  1. <form id="form"
  2.   <input type="text" name="name" value="Name"
  3.   <input type="text" name="surname" value="Surname"
  4. </form> 
  5. <style>  
  6.   .focused { 
  7.     outline: 1px solid red;  
  8.   }  
  9. </style> 
  10. <script> 
  11.   // 將處理程序置于捕獲階段(最后一個(gè)參數(shù)為 true) 
  12.   form.addEventListener("focus", () => form.classList.add('focused'), true); 
  13.   form.addEventListener("blur", () => form.classList.remove('focused'), true); 
  14. </script> 

2. 方案二

可以使用 focusin和 focusout事件 —— 與 focus/blur事件完全一樣,只是它們會(huì)冒泡。

注意:必須使用 elem.addEventListener來分配它們,而不是 on<event>。

所以,這是另一個(gè)可行的變體:

  1. <form id="form"
  2.   <input type="text" name="name" value="Name"
  3.   <input type="text" name="surname" value="Surname"
  4. </form> 
  5. <style>  
  6.   .focused {  
  7.     outline: 1px solid red;  
  8.   }  
  9. </style> 
  10. <script> 
  11.   form.addEventListener("focusin", () => form.classList.add('focused')); 
  12.   form.addEventListener("focusout", () => form.classList.remove('focused')); 
  13. </script> 

一樣的結(jié)果:

圖片

五、總結(jié)

本文基于JavaScript基礎(chǔ),介紹了focus/blur(聚焦)實(shí)際應(yīng)用。通過事件以及對(duì)方法的講解。在元素獲得/失去焦點(diǎn)時(shí)會(huì)觸發(fā) focus和 blur事件,通過 document.activeElement來獲取當(dāng)前所聚焦的元素。focus/blur 委托時(shí)遇到的問題,提供了兩個(gè)有效的解決方案。

歡迎大家積極嘗試,有時(shí)候看到別人實(shí)現(xiàn)起來很簡(jiǎn)單,但是到自己動(dòng)手實(shí)現(xiàn)的時(shí)候,總會(huì)有各種各樣的問題,切勿眼高手低,勤動(dòng)手,才可以理解的更加深刻。

通過代碼的演示,運(yùn)行效果圖的展示,能夠讓讀者更直觀的理解,更好的學(xué)習(xí)。

代碼很簡(jiǎn)單,希望能夠幫助你更好的學(xué)習(xí)。

 

責(zé)任編輯:姜華 來源: 前端進(jìn)階學(xué)習(xí)交流
相關(guān)推薦

2024-06-21 13:37:09

JavaScript開發(fā)

2024-07-30 14:40:35

avaScript聚焦應(yīng)用

2011-06-30 13:49:00

Qt 鍵盤 聚焦

2024-08-27 08:35:43

JavaScriptPromise模式

2012-08-20 14:17:27

JavaScript

2009-10-14 19:22:30

多路服務(wù)器曙光

2012-10-23 17:16:16

企業(yè)云寶德云計(jì)算

2009-12-18 10:58:17

Linux應(yīng)用程序

2021-04-21 09:55:24

Redis應(yīng)用限流

2010-03-09 19:07:01

Python語法

2021-07-20 10:26:12

JavaScriptasyncawait

2010-03-30 14:32:38

Oracle Date

2010-06-03 08:59:50

MySQL Query

2010-03-17 10:01:12

Python安裝

2010-06-07 10:08:52

MySQL FLUSH

2024-01-26 13:07:20

綜合布線數(shù)據(jù)中心未來電網(wǎng)

2010-04-08 18:33:46

Oracle VARR

2010-06-24 14:08:25

Linux Cat命令

2010-05-24 09:57:08

2010-03-01 13:06:49

WCF繼承
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)