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

Vue 自定义指令输入校验过滤


/*** 过滤字符串* @param {*} filterCharRule* @param {*} newVal* @returns*/
function filterCharForValue(filterCharRule, newVal) {if(!filterCharRule || !newVal) returnconst isArray = filterCharRule instanceof Arrayconst isRegExp = filterCharRule instanceof RegExpif (isArray) {for (let i = 0; i < filterCharRule.length; i++) {const ele = filterCharRule[i]const regrex = new RegExp(ele, 'g')newVal = String(newVal).replace(regrex, '')}} else if (isRegExp) {newVal = String(newVal).replace(filterCharRule, '')}return newVal
}/*** 转换大小写* @param {*} type* @param {*} newVal* @returns*/
function transformCharCase(type, newVal) {if (!type || !['upper', 'lower'].includes(type)) return newValif (type === 'upper') {newVal = newVal.toLocaleUpperCase()} else {newVal = newVal.toLocaleLowerCase()}return newVal
}/*** 获取光标当前位置* @param {*} inputNode* @returns*/
function getInputCursorPos(inputNode) {if (!inputNode) return 0return inputNode.selectionStart || 0 // 记录当前光标位置
}/*** 修正输入光标* @param {*} inputNode* @param {*} result* @param {*} newVal* @returns*/
function fixInputCursorPos(inputNode, result, newVal) {if (result === newVal) returnif(inputNode !== document.activeElement) return // 没focus绝对不能修正,因为会setSelectionRange,导致某些场景永远失焦不了// 因为filterCharForValue和transformCharCase会导致光标踢到末尾去,所以需要修正光标let cursorPos = getInputCursorPos(inputNode)// 修正偏移 - 记录原来光标位置// 如果filterCharForValue过滤了某些字符,比如银行卡号输入框不允许输入`.`,光标这时取到的还会是`.`之后的坐标,所以需要修正// 如果为经过formatterInput前的值,经过formatterInput之后的值去格式化后不相同,才需要偏移cursorPos -= newVal.length - result.length// 修正偏移 - 移动光标到正确位置setTimeout(() => {if (!inputNode) return 0// 有些类型比如type为email,不支持这个方法,不支持就罢了try {inputNode.setSelectionRange(cursorPos, cursorPos)// eslint-disable-next-line no-empty} catch {}})
}export default {bind() {},inserted() {},update(el, binding, vnode) {const rule = binding.value // 规则const modifiers = binding.modifiers // 默认是 {}const currentValue = vnode.data.model.valueconst maxValue = vnode.data.attrs['max-value']const minValue = +vnode.data.attrs['min-value']if(currentValue === '' || currentValue === undefined ) returnlet result = ''if(rule) {result = filterCharForValue(rule, currentValue)if((modifiers.upper || modifiers.lower) && result) {Object.keys(modifiers).forEach((key) => {result = transformCharCase(key, result)})}const targetResult = + resultif(!!el.__previousValue && !isNaN(targetResult) && (minValue || maxValue)) {if(minValue && targetResult < minValue) {result = el.__previousValue}if(maxValue && targetResult > maxValue) {result = el.__previousValue}}} else {if((modifiers.upper || modifiers.lower)) {Object.keys(modifiers).forEach((key) => {result = transformCharCase(key, currentValue)})}}if(result !== currentValue) {el.__previousValue = resultfixInputCursorPos(el.children[0], result, currentValue)vnode.componentInstance.$emit('input', result)} else {el.__previousValue = currentValue}},componentUpdated() {},unbind() {}
}

使用:

  // 只允许输入字母和数字, 字母转成大写v-filter-char.upper="/[^\da-zA-Z]/g"

http://www.xdnf.cn/news/4265.html

相关文章:

  • AI Agent开发第57课-AI用在销售归因分析场景中-用随机森林从0构建自己的“小模型”
  • 亿级流量系统架构设计与实战(四)
  • Select Rows组件研究
  • 指针的应用
  • SQL注入总结
  • 【C++】C++中的命名/名字/名称空间 namespace
  • 【东枫科技】代理英伟达产品:智能网卡的连接线
  • 在 Win11 下安装 Wireshark 的详细步骤
  • ROS学习——IMU惯性测量单元节点的原理与编写(含C++和Python代码)
  • 【iOS】源码阅读(二)——NSObject的alloc源码
  • CSS网格布局
  • SQL 与 Python:日期维度表创建的不同选择
  • 人工智能与生命科学的深度融合:破解生物医学难题,引领未来科技革命
  • Linux远程管理
  • 2025年软件工程与数据挖掘国际会议(SEDM 2025)
  • Android 开发中JDK 的使用和配置详解
  • 机器视觉的PCB激光褪镀层的应用
  • 【基于SSM+Vue+Maven+Mysql】音乐管理系统(附源码+数据库脚本)
  • 决 策 树
  • 《深度学习实践教程》[吴微] ch-5 3/5层全连接神经网络
  • 使用Java和LangChain4j实现人工智能:从分类到生成式AI
  • CentOS 7 安装指定版本 Docker 及镜像加速/配置优化攻略
  • 候选码 主属性 非主属性
  • STM32--RCC--时钟
  • 【大模型系列篇】开启AI自主科研新时代:WebThinker开源深度研究框架
  • 还原TF卡或U盘
  • 18个国内wordpress主题推荐
  • 京东:外卖上线新功能,但仅限今天
  • NGINX `ngx_http_auth_request_module` 模块详解基于子请求的认证授权方案
  • 已经写好论文的AI率降低