分享一个Vue输入框获取焦点自动选中指令

news2024/12/25 16:06:48

需求背景:最近项目中遇到很多输入类控件,且有频繁改动需求,如果数值过长,则需要一直按着删除键,于是想能不能获取焦点的时候,就直接选中,这样就可以直接删除了

1、思路分析

记得很早的时候做小程序,输入组件可以直接设置要选中的位数,于是想看看目前使用饿了么组件有无该功能,发现并没有提供,那就只有自己写了;接着之前的思路,想着是不是input聚焦后也需要选择选中的长度,于是查看了文档,刚好发现了这个api ,HTMLInputElement.select(),并且兼容性良好,那简单了直接开干

2、开干

有了上面这个api,那么只需要写一个指令,找到当前input节点,当其聚焦时,调用一下select方法即可,vue的自定义指令,也完美符合需求

Vue.directive('input-select', {
		inserted: function (el) {
			el._select_ = function (e) {
				e.target.select()
			}
			el.addEventListener('focus',el._select_)
		},
		unbind: function (el) {
			if (el._select_) {
				input.removeEventListener('focus',el._select_,false)
			}
		}
	})

经过简单测试,完美,没有任何问题,正当高兴时,准备给所有输入框都加上,突然发现,怎么饿了么输入框添加了之后无效呢(黑人问号脸???),于是看了下
在这里插入图片描述
原来,一般复杂的业务组件,输入框也会被嵌套几成的,而不是直接input标签裸奔,所有开始事件绑定就绑错了

3、优化

有了上面的问题,笔者想了一个办法,既然初始绑定不一定会帮到Input上,那么我直接找出当前节点所有input控件,挨个给他绑上,再挨个卸载,要注意一个小细节,通常开源的组件库,人家也是用原生的组件封装的,也就是说,有可能 switch 啥的也是input写的,所有我们在绑定的时候也可以按需过滤下,比如笔者这里,就指定text、number、tel、password、url、search这几种类型的输入框才绑定事件
完整如下:

Vue.directive('input-select', {
		inserted: function (el) {
			function addSelect(vnodes = []) {
				// 指定几种类型
				const types = ['text','number','tel','password','url','search']
				vnodes.forEach((input) => {
					if(types.includes(input.type) && !input.readOnly) {

						input._select_ = function (e) {
							//修复一个bug 当聚焦瞬间又失焦时,可能会造成事件多次调用
							// 故,选中前判断当前元素是否聚焦
							document.activeElement == e.target && e.target.select()
						}

						input.addEventListener('focus', input._select_, false)
						el._hasInputSelect = true
					}
				})
			}
			addSelect(el.tagName == 'INPUT' ? [el] : [...el.querySelectorAll('input')])
		},
		unbind: function (el) {
			if (el._hasInputSelect) {
				(el.tagName == 'INPUT' ? [el] : [...el.querySelectorAll('input')]).forEach((input) => {
					input._select_ && input.removeEventListener('focus',input._select_,false)
					input._select_ = null
					delete input._select_
				})
				delete el._hasInputSelect
			}
		}
	})

4、总结

看似一个小功能,其实也些许问题,其实还有可以扩展,比如:部分组件如果输入控件比较多,为了节约性能,有可能输入框是动态的,即,没有点击的时候是文本,当用户点了才切换成输入框,对于这种情况,目前笔者未进行探索,只是感觉可能需要围绕vue指令的生命周期进行操作,感兴趣的朋友可自行探索

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/426321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

顺序表的实现

思维导图: 一,顺序表 一,顺序表的创建(位置:头文件内) 1.1顺序表的结构体类型 要求:创建顺序表并使这个顺序表能够存放数据,能记录有效数据的个数,能够记录容量大小。…

记 ==> 首次使用rabbitMQ优化项目

昨天刚学习完了rabbitMQ,刚好我的项目有个模块挺符合使用rabbitMQ进行异步处理的。 这个模块大概功能是:用户发送的所有帖子都会添加到他的发件箱,当有个新用户关注了他,他发件箱内所有的博客都会被添加到关注他的用户的收件箱里…

binkw32dll缺失怎么办?如何解决binkw32dll修复问题

binkw32dll缺失怎么办?在使用某些计算机游戏或应用程序时,您可能遇到过binkw32dll缺失的问题。这意味着您的计算机无法找到该DLL文件,从而无法正常运行程序。在本文中,我们将探讨binkw32.dll缺失的可能原因并提供解决方案。 一.什…

python flask 接口平台开发

文章目录descFlaskFlask-SQLAlchemyflasggerdesc 考虑到开发的便捷性、生态的丰富程度,用Flask、Flask-SQLAlchemy、flasgger等编写一套简单易用的接口平台 这里记录以下这几个组件的使用方式 Flask 轻量、灵活,相比Django不用遵循太多的开发规范 F…

SSM整合的基本思路梳理

SSM整合的简单思路流程 基本思路 我在整合的时候一般习惯从MyBatis开始向上构建,也就是在开始一个项目的时候先将DAO层搭建起来,再向上整合Spring以及SpringMVC。按照这个流程,可以做出一个比较简单的大致流程作为参考,帮助我们…

企业为什么要做网站?这篇文章告诉你

在如今数字化的时代,企业为什么要做网站?这个问题一直都是企业主和市场营销人员必须要考虑的问题。本文将以一个真实的案例为例,解析为什么企业要做网站以及如何通过网站提升业务和品牌的影响力。 案例背景 以一家小型私人医疗诊所为例&…

【神经网络】tensorflow实验4--Matplotlib数据可视化

1. 实验目的 ①掌握Matplotlib绘图基础 ②运用Matplotlib,实现数据集的可视化 ③运用Pandas访问数据集 2. 实验内容 ①绘制散点图、直方图和折线图,对数据进行可视化 ②下载波士顿数房价据集,并绘制数据集中各个属性与房价之间的散点图&#…

人人可用的敏捷指标工具!Kyligence Zen 正式发布 GA 版

4 月 11 日,Kyligence 指标平台产品发布会成功召开。发布会上,一站式指标平台 Kyligence Zen 正式推出 GA 版,接下来这款人人可用的敏捷指标工具将以更加完善、成熟、稳定的产品性能与功能解决企业面临的指标管理、分析和应用痛点 &#xff0…

【信息论】一、信息与信息论

“The fundamental problem of communication is that of reproducing at one point either exactly or approximately a message selected at another point.” —— Claude Elwood Shannon 1.1 信息的定义 什么是信息?它与消息、信号之间有什么区别和联系&#…

指纹识别q

1、指纹传感器 FTIR(Frustrated Total Internal Reflection),受抑全内反射。在屏幕的夹层中加入LED光线,当用户按下屏幕时,使夹层的光线造成不同的反射效果,感应器接收光线变化而捕捉用户的施力点。 明显的缺点:体积太…

弹塑性力学--应变硬化

在单轴拉伸试验中,当应力超过屈服强度后,需要施加更大的载荷产生更大的应力,才会使材料发生更多的塑性变形。随着塑性应变的增加,材料变得更强、更难以变形了,因此这个阶段称为“应变硬化”(Strain Hardeni…

数据库----------唯一约束、默认约束、零填充约束

目录 1.唯一约束(Unique) 1.概念 2.语法 3.添加唯一约束 4.删除唯一约束 2.默认约束(default) 1.概念 2.语法 3.添加默认约束 4.删除默认约束 3.零填充约束(zerofill)了解即可 1.概念 2.操作 3.删除 1.唯一约束&…

如来十三掌(与佛论禅、Rot13编码)

下载附件打开是一串... 佛经 666 这个编码方式还真是第一次遇见----与佛论禅 对文本进行与佛论禅密码解密 得到 MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9 根据题目提示,如来十三掌,猜测是rot13加密,进行rot13解码 得到 Z…

Cloud computing

Cloud computing 可以看到右侧的容器虚拟化架构中,不需要运行额外的OS,这样启动的服务性能会相比于通过虚拟化软件实现的架构更优秀。但是虚拟机同样也有它的优点,比如它的安全、隔离性,可以运行不同的操作系统等等。 Virtualiz…

EasyCVR平台基于GB28181协议的语音对讲配置操作教程

EasyCVR基于云边端协同,具有强大的数据接入、处理及分发能力,平台可支持海量视频的轻量化接入与汇聚管理,可提供视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联等功能…

企业网站架构LAMP部署与优化(apache、mysql、php)

目录LAMP概述与简介编译安装Apache http服务1、关闭防火墙,将安装Apache所需软件包传到/opt/apache目录下2、在opt/apache目录下安装http所需软件包3、解压以下文件4、将解压的两个文件移到相应目录5、安装环境依赖包6、配置软件模块7、编译安装8、优化配置文件路径…

【linux】:linux下文件的使用以及文件描述符

文章目录 前言一、linux系统中的文件操作以及文件接口二、文件描述符 1.文件描述符的分配规则2.重定向总结前言 理解文件原理和操作: 我们先快速回忆下一C语言的文件操作: 首先看一下fopen函数的使用,然后我们写一段简单的C语言打开文件的代…

使用conda来管理虚拟环境

百度miniconda 下载windows版,安装的时候添加环境变量Conda -info -e 可以看到只有一个虚拟环境​ ​​​​​​3.Conda命令 (1&#x…

高效学习方法分享和学习工具推荐

方法不对,努力白费;方法对了,事半功倍! 口号喊起来,气氛拉满! 我现在是吉林大学计算机科学与技术大四在读(2023春季学期),刚好趁这个活动回顾一下我的大学生活。上过大学…

Android: 在wsl中使用libevent实现http服务器,并编写Android app 实现文件下载

在wsl中使用libevent实现http服务器,并编写Android app 实现文件下载 PC端: 在WSL中编译libevent-2.1.8-stable sample中的http-server.c,实现http测试用服务器 Makefile如下: #指定源文件为*.c src $(wildcard *.c) #通过src…