前端 JavaScript 焦點事件處理

  • 何謂聚焦?
  • focus/blur 事件
  • focus/blur 方法
  • 允許在任何元素上聚焦 : tabindex

何謂聚焦?

所謂聚焦(focus)通常是在說聚焦到一個元素上,而聚焦到一個元素上通常意味著 “準備要此處接受輸入”,所以,這正是我們可以用代碼來初始化一些我們所需的功能的時刻。

失去焦點(blur)可能還更重要一些,這個事件可能發生在當用戶點擊頁面其他地方,或是跑去做別的事情等等。所以失去焦點通常意味著 “數據輸入都已經完成了”,所以我們就可以用代碼來檢查這些輸入,甚至是將其發到服務器上存起來。

處理這些焦點事件是前端很常見,很 basic 的功能,也有一些重要的特性,接下來就來一一做了解。

focus/blur 事件

當元素被聚焦到時,就會觸發 focus 事件,而當元素失去焦點時,就會觸發 blur 事件。

我們用一個 input 輸入框來感受一下。在下面示例中:

  • focus 事件隱藏 error 信息,因為我們要在 blur 事件再檢查一遍
  • blur 事件檢查這個字段是否輸入了郵箱,如果沒有則顯示一個 error
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>focus test</title>
</head>
<body>Your email : <input type="email" id="email" required><div id="info"></div>
</body>
<style>.invalid {border-color: red;}.error {color: red;}.pass {color: green;}
</style>
<script>let email = document.getElementById('email')let info = document.getElementById('info')email.onfocus = function() { // 對 email DOM 添加 focus 事件if(this.classList.contains('invalid')) {this.classList.remove('invalid')info.innerHTML = ''}}email.onblur = function() { // 對 email DOM 添加 blur 事件if(!this.value.includes('@')) { // not emailthis.classList.add('invalid')if(info.classList.contains('pass'))info.classList.remove('pass')info.classList.add('error')this.focus()info.innerHTML = 'Please enter a correct email!'}else {if(info.classList.contains('error'))info.classList.remove('error')info.classList.add('pass')info.innerHTML = 'Email passed!'}}
</script>
</html>

效果如下:

focus/blur 方法

除了通過 onfocusonblur 添加事件以外,我們也可以通過 ele.focus()ele.blur() 方法來設置和移除元素上的焦點。

繼續上面的例子,如果輸入的郵箱無效,我們可以讓焦點無法離開 input 元素,直到輸入格式沒問題。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>focus test</title>
</head>
<body>Your email : <input type="email" id="email" required><div id="info"></div>
</body>
<style>.invalid {border-color: red;}.error {color: red;}.pass {color: green;}
</style>
<script>let email = document.getElementById('email')let info = document.getElementById('info')email.onblur = function() {if(!this.value.includes('@')) { // not emailthis.classList.add('invalid')if(info.classList.contains('pass'))info.classList.remove('pass')info.classList.add('error')info.innerHTML = 'Please enter a correct email!'this.focus()}else {if(info.classList.contains('error'))info.classList.remove('error')info.classList.add('pass')this.classList.remove('invalid')info.innerHTML = 'Email passed!'}}
</script>
</html>

效果如下:

注意一下細微的區別,可以看到,當我們所輸入的郵箱格式不包含 @ 時,除了同樣會提示用戶一些錯誤信息和效果以外,注意到焦點還是再輸入框上(浮標還在跳),也就表示還在等待用戶輸入,直到正確。這就是因為我們用 this.focus() 讓焦點重新被拉回來,而不是直接 blur 掉。

這邊要注意的一點就是,焦點是有可能會丟失的!

其中之一有可能用戶就亂點了其他位置,或是 js 自身的其他事件也可能會導致焦點丟失,譬如:

  1. alert 會把焦點移到自身,從而觸發其他元素的 blur 事件,而當 alert 對話框被取消後,焦點又會回到本來得元素上。
  2. 如果一個 DOM 元素被刪除了,那麼焦點也會消失。即使之後又把 DOM 元素加回去,焦點仍然不會回到他身上。

所以就是,當我們要使用 focusblur 事件時要更加小心,確認好焦點到底在誰身上,且要注意焦點轉移的邏輯是否正確。

允許在任何元素上聚焦 : tabindex

默認情況下,其實很多元素都是不支持聚焦的。

通常,focusblur 事件都支持那些與用戶交互相關的元素,像是 button, a, select, input 等等。

另一方面,像是 div, span 等等其實默認是不能被聚焦的,也就表示 focus, blur 事件並不適用於他們,當然 ele.focus(), ele.blur() 也不用說。

不過,使用一個 Html 屬性 tabindex 可以解決這種情況。

任何被設置了 tabindex 的元素都會變得可聚焦,而 tabindex 的值是當切換元素時聚焦的順序號,這邊注意下,這個值要從 1 開始,等於 0 的話相當於沒有設置 tabindex,而如果小於 0 則不會被受理。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>focus test</title>
</head>
<body><ul><li tabindex="1">one</li><li tabindex="3">three</li><li tabindex="2">two</li><li tabindex="0">zero</li><li tabindex="-1">minus one</li></ul>
</body>
<style>li {cursor: pointer;}:focus {outline: 2px dashed green;}
</style>
<script>const lists = document.querySelectorAll('li')for(let i=0; i<lists.length; i++) {lists[i].onfocus = function() {console.log(lists[i].innerHTML)}}
</script>
</html>

效果如下:

可以看到,後面都是通過按 Tab 來切換焦點,順序就是 1-3-2-0。且設置了 tabindex 後也支持 onfocus

前端 JavaScript 焦點事件處理相关推荐

  1. 前端JavaScript之DOM事件操作~都是干货

    下面是对DOM操作事件的整理,希望可以帮助到有需要的小伙伴~ 文章目录 DOM事件操作 JavaScript的基础 事件 代码书写步骤 1.获取绑定事件的元素 2.绑定事件 3.编写事件 注意事项 D ...

  2. Web前端Javascript笔记(5)事件

    1. 什么是事件:事件是指发生并得到处理的操作 JavaScript中的事件是由访问web页面的用户引起的一系列操作,例如,用户的点击操作,JavaScript中有两种事件模型:内联模型,脚本模型. ...

  3. 【前端学习】前端学习第十五天:JavaScript中的事件模型

    在各种浏览器中存在三种事件模型:原始事件模型.DOM事件模型和IE事件模型: 一.原始事件模型: 原始事件模型被所有浏览器支持: 在原始事件模型中.事件一旦发生就直接调用事件处理函数,事件不会向别的对 ...

  4. ASP.NET的錯誤類型及錯誤處理方式

    一﹑常見的錯誤類型﹕ 語法錯誤﹑邏輯錯誤﹑編譯錯誤﹑運行時錯誤以及配置錯誤 二﹑錯誤的處理﹕ 1﹑使用驗証.具體操作步驟點選方案按右鍵選屬性,組態屬性﹐建置中的檢查算朮溢位/反向溢位設為True, V ...

  5. XMD RAC(Oracle 9i) 存儲修復處理

    處理技朮﹕ [root@DELL-RAC02 root]# powermt display dev=all Pseudo name=emcpoweri CLARiiON ID=CK2000407000 ...

  6. 【笔记-面试】《imooc -前端跳槽面试技巧》、《imooc- 揭秘一线互联网企业 前端javaScript高级面试》、《imooc-前端javascript面试技巧》

    20190204:<imooc -前端跳槽面试技巧> 第01章 课程介绍 01-01 课程导学 一.一面知识点 1.面试技巧 页面布局类 2.css盒模型dom事件类 3.http协议类 ...

  7. matlab fir工具箱,用MATLAB信號處理工具箱進行FIR濾波器設計的三種方法

    摘  要 介紹了利用MATLAB信號處理工具箱進行FIR濾波器設計的三種方法:程序設計法.FDATool設計法和SPTool設計法,給出了詳細的設計步驟,並將設計的濾波器應用到一個混和正弦波信號,以驗 ...

  8. Exchange 2016 證書無效如何處理?

    我也是勒個去,搞了一大輪之後,人家跟我說,不好意思,你的證書無效喔~~~~怎麼刷新都沒用-- 我的測試環境架構: AD Windows 2016 Windows 2016 + Exchange 201 ...

  9. 姍姍遲來的iPhone文檔處理功能

    以下這些文字是我在蘋果iPhone上利用一個功能齊全的文字處理軟件打出來的.這是一個第三方應用軟件﹐你可以創建Word或Excel文檔﹐進行編輯.排版﹐然後發送到個人電腦或Mac電腦上後在電腦的Wor ...

最新文章

  1. SQLAlchemy简介与入门
  2. Golang-简洁的并发
  3. Gevent异步服务类实现多姿势WEB实时展示
  4. 分布式--ActiveMQ 消息中间件(一) https://www.jianshu.com/p/8b9bfe865e38
  5. Java Springboot+VUE前后端分离网上手机商城平台系统设计和实现以及论文报告
  6. Struts action-mapping 元素讲解
  7. FreeBSD常用操作
  8. 【Hoxton.SR1版本】Spring Cloud Stream消息驱动
  9. 用命令提示符使用MySQL
  10. navicat15 安装
  11. oracle 绑定变量语法,Delphi使用绑定变量法操作Oracle
  12. SpringCloud ——@RefreshScope
  13. 2022年要知悉的9大互联网前沿科技
  14. Threejs实现酷炫3D地球技术点汇总
  15. RealWin Server HMI 漏洞复现与恶意攻击链分析
  16. 万万没想到:西游篇--高速下载-12.19更新/真正可看的TC版/抢鲜版/高清版/超清版-高速下载
  17. linux 如何通过进程号找到文件路径
  18. 中国大学MOOC课程《程序设计入门——C语言》 期末考试编程题
  19. yjk只算弹性的不计算弹塑性_ABAQUS弹塑性时程分析注意事项 -
  20. 以user_1用户身份登录mysql_创建MySQL用户帐户和授予权限

热门文章

  1. html js日历制作视频,时间轴、纯js日历特效
  2. 基于ChatGLM-Med与HuaTuo的微调部署
  3. 关于FTP服务器出现227 Entering Passive Mode的解决方法
  4. Centos 6.x grub 进入系统
  5. 用 Graphlab Create 构建歌曲推荐系统
  6. 易查分生成查询后,如何快速通知用户查询成绩?一文读懂
  7. 北京两限房政策出炉 限定北京户口未提绿卡
  8. 漫画:程序员调 bug 的真实写照哈哈哈
  9. 知识分享之Ubuntu——修改DNS
  10. 酷炫的android手机界面作品