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

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"

相关文章:

  • 【前缀和】矩阵区域和
  • Hadoop架构再探讨
  • 【MongoDB篇】MongoDB的聚合框架!
  • python刷题笔记:三目运算符的写法
  • 高等数学第五章---定积分(§5.1定积分的概念、性质和应用)
  • 【HFP】蓝牙语音通信高级功能解析:快速拨号与呼叫等待协议实现
  • 【日撸 Java 三百行】Day 4(条件语句实战——闰年问题)
  • ORACLE EBS 12.1 启用https 简单策略
  • STM32H743单片机实现ADC+DMA多通道检测+事件组
  • nut-list和nut-swipe搭配:nut-cell侧滑定义无法冒泡打开及bug(含代码、案例、截图)
  • 继电器负载知识
  • 内存的位运算
  • Dify - Stable Diffusion
  • 未来设计新篇章!2025 年 UX/UI 设计趋势,技术与体验的全新结合!
  • 基于Jetson Nano与PyTorch的无人机实时目标跟踪系统搭建指南
  • 通过CIDR推出子网掩码和广播地址等
  • 【quantity】1 SI Prefixes 实现解析(prefix.rs)
  • 网络的搭建
  • BBS (cute): 1.0.2靶场渗透
  • [Linux]多线程(一)充分理解线程库
  • 网民反映“潜水时遭遇服务质量不佳”,三亚开展核查调查
  • 当年的你,现在在哪里?——新民晚报杯40周年寻人启事
  • 巴基斯坦军方:印度导弹袭击已造成至少3死14伤
  • 综合治理食品添加剂滥用问题,国务院食安办等六部门联合出手
  • 安顺市原副市长、市公安局原局长顾长华任贵州省民委副主任
  • 罗马尼亚临时总统博洛让任命普雷多尤为看守政府总理