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限制后,输入框变红
一、前言 最近收到产品的一个需求:输入框限制了maxlength“11”,需要在输入第12位时,输入框变红;当然,第12位是不能真正输入到输入框中的。 二、实现难点 其实,单纯的要监听 字母和数字以及字符 还是比较容…...
Docker 构建镜像并搭建私人镜像仓库教程
构建镜像教程 步骤 1:安装 Docker #在安装 Docker 之前,建议先更新系统软件包。 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 表:mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases test --tables table1 导出 test 数据库中的 table1 表结构&am…...
OpenBMC:通过qemu-system-arm运行编译好的image
OpenBMC:编译_openbmc meson.build file-CSDN博客 讲述了如何编译生成openbmc的image 完成编译后可以通过qemu-system-arm进行模拟加载,以便在没有BMC硬件的情况下进行调试 1.下载qemu-system-arm 在openbmc的上级目录上执行 wget https://jenkins.op…...
STM32的HAL库开发---通用定时器(TIMER)---定时器脉冲计数
一、脉冲计数实验原理 1、 外部时钟模式1:核心为蓝色部分的时基单元,时基单元的时钟源可以来自四种,分别是内部时钟PCLK、外部时钟模式1,外部时钟模式2、内部定时器触发(级联)。而脉冲计数就是使用外部时钟…...
动态规划LeetCode-121.买卖股票的最佳时机1
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…...
网安三剑客:DNS、CDN、VPN
DNS(网络地址转换系统)的技术原理与安全应用 1. 网络地址转换系统的基本原理 DNS通过解析用户的访问URL(超链接),将其映射到服务器上存储的信息。具体来说: 解析URL:DNS从URL中提取出 hostna…...
Linux在x86环境下制作ARM镜像包
在x86环境下制作ARM镜像包(如qemu.docker),可以通过QEMU和Docker的结合来实现。以下是详细的步骤: 安装QEMU-user-static QEMU-user-static是一个静态编译的QEMU二进制文件,用于在非目标架构上运行目标架构的二进制文…...
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、显示或隐藏书签边栏:Control-Command-1 2、选择下一个书签或文件夹:向上头键或向下头键 3、打开所选书签:空格键 4、打开所选文件夹:空格键或右箭头键 5、关闭所选文件夹:空格键或左箭头键 6、更…...
Git登录并解决 CAPTCHA
修改公司域账户密码之后,导致今天pull代码时显示:remote error: CAPTCHA required 本文将介绍如何解决 Git 中的常见错误“fatal: Authentication failed for git”。该问题通常出现在尝试访问远程 Git 仓库时,表示身份验证失败。以下是几种常…...
Websocket从原理到实战
引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议,它使得客户端和服务器之间能够进行实时、双向的通信,既然是通信协议一定要从发展历史到协议内容到应用场景最后到实战全方位了解 发展历史 WebSocket 最初是为了解决 HTTP 协议在实时…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_options函数
声明 就在 main函数所在的 nginx.c 中: 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,可以使用以下方法: 查看默认Shell: 打开“终端”应用程序,然后输入以下命令: echo $SHELL这将显示当前默认使用的Shell。例如,如果输出是/bin/zsh,则说明您使用的是Z…...
Centos执行yum命令报错
错误描述 错误:为仓库 ‘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实现订单超时实时关闭功能 准备工作实现步骤解释注意事项(重点) 使用Redis实现订单超时实时关闭功能,可以利用Redis的延时队列(使用Sorted Set实现)和过期键(使用TTL和Keyspace Notifications…...
485网关数据收发测试
目录 1.UDP SERVER数据收发测试 使用产品: || ZQWL-GW1600NM 产品||【智嵌物联】智能网关型串口服务器 1.UDP SERVER数据收发测试 A(TX)连接RX B(RX)连接TX 打开1个网络调试助手,模拟用户的UDP客户端设…...
RabbitMQ快速上手及入门
概念 概念: publisher:生产者,也就是发送消息的一方 consumer:消费者,也就是消费消息的一方 queue:队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理 exchang…...
4种架构的定义和关联
文章目录 **1. 各架构的定义****业务架构(Business Architecture)****应用架构(Application Architecture)****数据架构(Data Architecture)****技术架构(Technology Architecture)*…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
Qt的学习(一)
1.什么是Qt Qt特指用来进行桌面应用开发(电脑上写的程序)涉及到的一套技术Qt无法开发网页前端,也不能开发移动应用。 客户端开发的重要任务:编写和用户交互的界面。一般来说和用户交互的界面,有两种典型风格&…...
