当前位置: 首页 > news >正文

input 超出maxlength限制后,输入框变红

一、前言

最近收到产品的一个需求:输入框限制了maxlength=“11”,需要在输入第12位时,输入框变红;当然,第12位是不能真正输入到输入框中的。

二、实现难点

其实,单纯的要监听 字母和数字以及字符 还是比较容易实现的,通过监听 keyup、input 基本都能做到。但是,有一个问题就是:在输入中文时,还是拼写,这时输入框也需要变红,上面的事件就监听不到。需要单独的事件 compositionstart、compositionend
实现难点有以下两个:

1. input 怎么区分输入的是中文 和 (英文或者数字)

方法一:监听 compositionstart、compositionend 和 input或者keyup 这三个事件

方法二:InputEvent:isComposing 属性 ==> MDN解释表示事件是否是在 compositionstart 之后且在 compositionend 之前触发的。

解析compositionstart、compositionend:

  • compositionstart 开始输入中文拼音,但没确定输入到输入框内
  • compositionend 介绍中午拼写,对于文字已录入到输入框
  • 输入英文和数字,特殊字符不会触发
2. vue自定义指令,在同时绑定多个事件时,怎么在多个事件中传参(可能用不到)

在绑定的事件中,对事件源进行处理;将参数放到 e.target.参数名 = '参数值' => 这样在每个事件源中都能获取到参数

三、自定义指令实现限制输入框最大长度,达到限制长度再次输入时,输入框变红
/*** 限制输入框最大长度,达到限制长度再次输入时,输入框变红* 用法:v-input-maxlength="6" 不能在标签上配置 maxlength 属性*/
Vue.directive('input-maxlength', {bind(el, binding, vnode) {const ele = el.tagName === 'INPUT' ? el : el.querySelector('input');ele.addEventListener('compositionend', maxInputCallback(el, ele, binding.value), false)ele.addEventListener('input', maxInputCallback(el, ele, binding.value), false);ele.addEventListener('focus', maxInputFocus(el, ele), false);ele.addEventListener('blur', maxInputBlur(el, ele), false);},unbind(el) {const ele = el.tagName === 'INPUT' ? el : el.querySelector('input');ele.removeEventListener('compositionend', maxInputCallback(el, ele), false);ele.removeEventListener('input', maxInputCallback(el, ele), false);ele.removeEventListener('focus', maxInputFocus(el, ele), false);ele.removeEventListener('blur', maxInputBlur(el, ele), false);}
});function maxInputCallback(el, ele, maxLength ) {function handler(e) {// 指令事件间传参,// e.target.test = '123';   => 这样在其他事件中就能通过e.target获取了if( maxLength === undefined ) return;let val = ele.value;if( val.length > maxLength && !e.isComposing ) {  // 这个条件有一个小问题,当输入达到限制后,正在拼中文时(e.isComposing = true)边框是蓝色的ele.value = val.substr(0, maxLength);ele.style.border = '1px solid #F00';} else {ele.style.border = '1px solid #409EFF';}}return handler;
}function maxInputFocus(el, ele) {function handler(e) {ele.style.border = '1px solid #409EFF';}return handler;
}
function maxInputBlur(el, ele) {function handler(e) {ele.style.border = '1px solid #DCDFE6';}return handler;
}------------分割线:如果监听keyup事件,可以参考下面代码,但会有很多问题。最好不要使用------------
function maxInputKeyup(el, ele ) {const maxLength = ele.getAttribute('maxlength');const regex = /^[a-zA-Z0-9~!@#$%^&*()-=_+{}<>?:"',./\[\]]$/;  // 不支持空格let oldLimitLength = false; // 上一次输入是否达到限制长度function handler(e) {let val = ele.value;/*** val.length >= maxLength 是当前输入是否达到限制长度* oldLimitLength 是上一次输入是否达到限制长度* 如果当前输入达到限制长度,并且上一次输入没有达到限制长度,则表示为正好输入到限制长度(只要一个条件无法判断这种情况)* 如果当前输入长度小于限制长度,但上一次输入达到限制长度,则表示为删除操作=>删除了限制字符的最后一个字符*/console.log('------>>> 333333333',e, regex.test(e.key), e.isComposing);// 在输入限制的最后一个字符并且是输入中文时会有问题 if( regex.test(e.key) && val.length >= maxLength && oldLimitLength ) {ele.style.border = '1px solid #F00';} else {ele.style.border = '1px solid #409EFF';}if (val.length >= maxLength) {oldLimitLength = true;} else {oldLimitLength = false;}}return handler;
}

文章仅为本人学习过程的一个记录,仅供参考,如有问题,欢迎指出!

相关文章:

input 超出maxlength限制后,输入框变红

一、前言 最近收到产品的一个需求&#xff1a;输入框限制了maxlength“11”&#xff0c;需要在输入第12位时&#xff0c;输入框变红&#xff1b;当然&#xff0c;第12位是不能真正输入到输入框中的。 二、实现难点 其实&#xff0c;单纯的要监听 字母和数字以及字符 还是比较容…...

Docker 构建镜像并搭建私人镜像仓库教程

构建镜像教程 步骤 1&#xff1a;安装 Docker #在安装 Docker 之前&#xff0c;建议先更新系统软件包。 sudo yum update -y # 移除旧的Docker版本和Podman、runc软件包及其相关依赖。 yum remove -y docker docker-client docker-client-latest docker-ce-cli docker-commo…...

doris:MySQL Dump

Doris 在 0.15 之后的版本已经支持通过 mysqldump 工具导出数据或者表结构 使用示例​ 导出​ 导出 test 数据库中的 table1 表&#xff1a;mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases test --tables table1 导出 test 数据库中的 table1 表结构&am…...

OpenBMC:通过qemu-system-arm运行编译好的image

OpenBMC&#xff1a;编译_openbmc meson.build file-CSDN博客 讲述了如何编译生成openbmc的image 完成编译后可以通过qemu-system-arm进行模拟加载&#xff0c;以便在没有BMC硬件的情况下进行调试 1.下载qemu-system-arm 在openbmc的上级目录上执行 wget https://jenkins.op…...

STM32的HAL库开发---通用定时器(TIMER)---定时器脉冲计数

一、脉冲计数实验原理 1、 外部时钟模式1&#xff1a;核心为蓝色部分的时基单元&#xff0c;时基单元的时钟源可以来自四种&#xff0c;分别是内部时钟PCLK、外部时钟模式1&#xff0c;外部时钟模式2、内部定时器触发&#xff08;级联&#xff09;。而脉冲计数就是使用外部时钟…...

动态规划LeetCode-121.买卖股票的最佳时机1

给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…...

网安三剑客:DNS、CDN、VPN

DNS&#xff08;网络地址转换系统&#xff09;的技术原理与安全应用 1. 网络地址转换系统的基本原理 DNS通过解析用户的访问URL&#xff08;超链接&#xff09;&#xff0c;将其映射到服务器上存储的信息。具体来说&#xff1a; 解析URL&#xff1a;DNS从URL中提取出 hostna…...

Linux在x86环境下制作ARM镜像包

在x86环境下制作ARM镜像包&#xff08;如qemu.docker&#xff09;&#xff0c;可以通过QEMU和Docker的结合来实现。以下是详细的步骤&#xff1a; 安装QEMU-user-static QEMU-user-static是一个静态编译的QEMU二进制文件&#xff0c;用于在非目标架构上运行目标架构的二进制文…...

Vue3+codemirror6实现公式(规则)编辑器

实现截图 实现/带实现功能 插入标签 插入公式 提示补全 公式验证 公式计算 需要的依赖 "codemirror/autocomplete": "^6.18.4","codemirror/lang-javascript": "^6.2.2","codemirror/state": "^6.5.2","cod…...

Lua中文语言编程源码-第十一节,其它小改动汉化过程

__tostring 汉化过程 liolib.c metameth[] {"__转换为字符串", f_tostring}, lauxlib.c luaL_callmeta(L, idx, "__转换为字符串") lua.c luaL_callmeta(L, 1, "__转换为字符串") __len 汉化过程 ltm.c luaT_eventname[] ltablib.c c…...

Safari常用快捷键

一、书签边栏 1、显示或隐藏书签边栏&#xff1a;Control-Command-1 2、选择下一个书签或文件夹&#xff1a;向上头键或向下头键 3、打开所选书签&#xff1a;空格键 4、打开所选文件夹&#xff1a;空格键或右箭头键 5、关闭所选文件夹&#xff1a;空格键或左箭头键 6、更…...

Git登录并解决 CAPTCHA

修改公司域账户密码之后&#xff0c;导致今天pull代码时显示&#xff1a;remote error: CAPTCHA required 本文将介绍如何解决 Git 中的常见错误“fatal: Authentication failed for git”。该问题通常出现在尝试访问远程 Git 仓库时&#xff0c;表示身份验证失败。以下是几种常…...

Websocket从原理到实战

引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议&#xff0c;它使得客户端和服务器之间能够进行实时、双向的通信&#xff0c;既然是通信协议一定要从发展历史到协议内容到应用场景最后到实战全方位了解 发展历史 WebSocket 最初是为了解决 HTTP 协议在实时…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_options函数

声明 就在 main函数所在的 nginx.c 中&#xff1a; static ngx_int_t ngx_get_options(int argc, char *const *argv); 实现 static ngx_int_t ngx_get_options(int argc, char *const *argv) {u_char *p;ngx_int_t i;for (i 1; i < argc; i) {p (u_char *) argv[i]…...

判断您的Mac当前使用的是Zsh还是Bash:echo $SHELL、echo $0

要判断您的Mac当前使用的是Zsh还是Bash&#xff0c;可以使用以下方法&#xff1a; 查看默认Shell: 打开“终端”应用程序&#xff0c;然后输入以下命令&#xff1a; echo $SHELL这将显示当前默认使用的Shell。例如&#xff0c;如果输出是/bin/zsh&#xff0c;则说明您使用的是Z…...

Centos执行yum命令报错

错误描述 错误&#xff1a;为仓库 ‘appstream’ 下载元数据失败 : Cannot prepare internal mirrorlist: Curl error (6): Couldn’t resolve host name for http://mirrorlist.centos.org/?release8&archx86_64&repoAppStream&infrastock [Could not resolve h…...

订单超时设计(1)--- 如何使用redis实现订单超时实时关闭功能

如何使用redis实现订单超时实时关闭功能 准备工作实现步骤解释注意事项&#xff08;重点&#xff09; 使用Redis实现订单超时实时关闭功能&#xff0c;可以利用Redis的延时队列&#xff08;使用Sorted Set实现&#xff09;和过期键&#xff08;使用TTL和Keyspace Notifications…...

485网关数据收发测试

目录 1.UDP SERVER数据收发测试 使用产品&#xff1a; || ZQWL-GW1600NM 产品||【智嵌物联】智能网关型串口服务器 1.UDP SERVER数据收发测试 A&#xff08;TX&#xff09;连接RX B&#xff08;RX&#xff09;连接TX 打开1个网络调试助手&#xff0c;模拟用户的UDP客户端设…...

RabbitMQ快速上手及入门

概念 概念&#xff1a; publisher&#xff1a;生产者&#xff0c;也就是发送消息的一方 consumer&#xff1a;消费者&#xff0c;也就是消费消息的一方 queue&#xff1a;队列&#xff0c;存储消息。生产者投递的消息会暂存在消息队列中&#xff0c;等待消费者处理 exchang…...

4种架构的定义和关联

文章目录 **1. 各架构的定义****业务架构&#xff08;Business Architecture&#xff09;****应用架构&#xff08;Application Architecture&#xff09;****数据架构&#xff08;Data Architecture&#xff09;****技术架构&#xff08;Technology Architecture&#xff09;*…...

SpringBoot+Vue民宿管理系统源码+论文

代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择&#xff1a; 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...

TLM通信:从基础操作到UVM高级连接模式

1. TLM通信基础&#xff1a;从信号级到事务级的跨越 第一次接触TLM这个概念时&#xff0c;我正被一堆信号线搞得焦头烂额。当时在做一个以太网MAC验证项目&#xff0c;每次调试都要跟踪几十根信号线的时序&#xff0c;简直像在解一团乱麻。直到同事提醒我&#xff1a;"为什…...

青岛X射线探伤机服务好的供应商

在工业检测领域&#xff0c;X射线探伤机并非一次性采购的设备——它需要持续的技术支持、稳定的运行保障&#xff0c;以及服务商在关键时刻的响应能力。选择一家服务好的供应商&#xff0c;往往比选择一台设备本身更需要慎重。在青岛&#xff0c;有一家名为华誉机电设备有限公司…...

Arm架构在中国市场的潜力与挑战:从技术选型到实践落地

1. 项目概述&#xff1a;从一次技术选型引发的深度思考最近在为一个边缘计算项目做硬件选型&#xff0c;团队里关于采用x86还是Arm架构的服务器争论了好几天。这让我想起&#xff0c;这几年在国内的云计算、数据中心、甚至个人消费电子领域&#xff0c;Arm架构的声音是越来越响…...

别再卡在‘Setup is running’了!PowerBuilder 9.0保姆级安装避坑指南(附安全模式备用方案)

PowerBuilder 9.0安装全攻略&#xff1a;从卡死困境到高效部署 "Setup is running"这个看似简单的提示框&#xff0c;曾让无数PowerBuilder开发者陷入漫长的等待和反复的重启循环。作为一款承载了二十余年企业级应用开发记忆的经典工具&#xff0c;PowerBuilder 9.0的…...

深入剖析QWidget鼠标追踪失效:从setMouseTracking到事件拦截的完整解决方案

1. 为什么鼠标移动事件会突然失效&#xff1f; 最近在做一个Qt项目时&#xff0c;遇到了一个让人抓狂的问题&#xff1a;明明已经调用了setMouseTracking(true)&#xff0c;但鼠标在某些区域移动时&#xff0c;mouseMoveEvent就是死活不触发。这让我百思不得其解&#xff0c;毕…...

深度解析DsHidMini:开源项目实现Windows平台DualShock 3控制器用户态驱动

深度解析DsHidMini&#xff1a;开源项目实现Windows平台DualShock 3控制器用户态驱动 【免费下载链接】DsHidMini Virtual HID Mini-user-mode-driver for Sony DualShock 3 Controllers 项目地址: https://gitcode.com/gh_mirrors/ds/DsHidMini DsHidMini是一款基于Win…...

不止是记事本!Win10右键新建菜单终极自定义指南:排序、删除、添加任意文件类型

不止是记事本&#xff01;Win10右键新建菜单终极自定义指南&#xff1a;排序、删除、添加任意文件类型 在Windows 10的日常使用中&#xff0c;右键新建菜单可能是最容易被忽视却高频使用的功能之一。想象一下这样的场景&#xff1a;你刚刚安装了一款专业设计软件&#xff0c;却…...

从YOLOv8到Heatmap:手把手教你搭建一个景区人员拥挤预警系统(含完整代码)

从YOLOv8到Heatmap&#xff1a;手把手教你搭建一个景区人员拥挤预警系统&#xff08;含完整代码&#xff09; 每到旅游旺季&#xff0c;景区管理者最头疼的问题之一就是如何有效监控人流密度&#xff0c;预防踩踏事故。传统的人工监控方式不仅效率低下&#xff0c;而且难以及时…...

YOLOv5实战:如何一键导出检测框的坐标、类别和置信度到TXT文件(附完整代码)

YOLOv5实战&#xff1a;结构化导出检测结果的工程化解决方案 在计算机视觉项目的实际落地过程中&#xff0c;我们常常需要将模型检测结果以结构化形式保存&#xff0c;用于后续的数据分析、系统集成或模型评估。本文将深入探讨如何通过YOLOv5高效导出检测框的坐标、类别和置信度…...