el-input输入框 输入数字中文 来回切换之后 监听失效问题如何解决

news2024/12/23 18:12:28

实现一个vue自定义指令——输入框(input,el-input)输入内容类型限制,解决中文输入法双向绑定失效问题,多种类型支持,数字类型,浮点类型、英文类型、整数类型、四则运算等
直接上代码

首先新建input.js

export default {
    bind(el, binding, vnode) {
      const input = el.querySelector('.el-input__inner') || el.querySelector('.el-textarea__inner') || el;
      input.addEventListener('compositionstart', () => {
        vnode.locking = true//解决中文输入双向绑定失效
      })
      input.addEventListener('compositionend', () => {
        vnode.locking = false//解决中文输入双向绑定失效
        input.dispatchEvent(new Event('input'))
      })
      //输入监听处理
      input.onkeyup = () => {
        if (vnode.locking) {
          return;
        }
        // v-input.num
        if (binding.modifiers.num) {//只能输入数字(开头可以多个0)
          onlyNum(input);
  
        }
        //v-input.num_point
        else if (binding.modifiers.num_point) {//只能输入数字+小数点(可以多个小数点)
          onlyNumPoint(input)
        }
        //v-input.float
        else if (binding.modifiers.float) {//只能输入浮点型(只能一个小数点)
          onlyFloat(input, binding.value)
        }
        //  v-input.int
        else if (binding.modifiers.int) {//只能输入整数(0+正整数)(开头不能多个0)
          onlyInt(input)
        }
        //v-input.intp
        else if (binding.modifiers.intp) {//只能输入正整数
          onlyIntp(input)
        }
        //v-input.alp
        else if (binding.modifiers.alp) {//只能输入字母
          onlyAlp(input)
        }
        //v-input.num_alp
        else if (binding.modifiers.num_alp) {//只能输入数字+字母
          onlyNumAlp(input)
        }
        //v-input.arith
        else if (binding.modifiers.arith) {//四则运算符+数字
          onlyArith(input)
        }
        input.dispatchEvent(new Event("input"));
      }
  
      //数字
      function onlyNum(input) {
        input.value = input.value.replace(/\D+/g, '');
      }
      //整数(0+正整数)
      function onlyInt(input) {
        let value = input.value;
        value = value.replace(/\D+/g, '');
        input.value = value ? Number(value).toString() : value//去掉开头多个0
      }
      //正整数
      function onlyIntp(input) {
        if (!/^[1-9][0-9]*$/.test(input.value)) {
          let value = input.value.replace(/\D+/g, '');
          if (value && value.substring(0, 1) === '0') {//0开头去除0
            value = value.substring(1)
          }
  
          input.value = value
        }
      }
  
      //数字+小数点
      function onlyNumPoint(input) {
        input.value = input.value.replace(/[^\d.]/g, "");
      }
  
      //浮点型
      // eslint-disable-next-line no-unused-vars
      function onlyFloat(input, n) {
        let value = input.value;
        value = value.replace(/[^\d.]/g, '');
        value = value.replace(/^\./g, '');
        value = value.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');
        if (n&&Number(n)>0) {//限制n位
          var d = new Array(Number(n)).fill(`\\d`).join('');
          // eslint-disable-next-line no-useless-escape
          var reg = new RegExp(`^(\\-)*(\\d+)\\.(${d}).*$`, 'ig');
          value = value.replace(reg, '$1$2.$3')
        }
        if (value && !value.includes('.')) {
             value =  Number(value).toString()//去掉开头多个0
        }
        input.value = value
      }
      //字母
      function onlyAlp(input) {
        input.value = input.value.replace(/[^A-Za-z]/g, '');
      }
      //数字+字母
      function onlyNumAlp(input) {
        input.value = input.value.replace(/[^A-Za-z0-9]/g, '');
      }
  
      //四则运算+-*/()数字
      function onlyArith(input) {
        let value = input.value
        if (value) {
          input.value = value.split('').reduce((prev, cur) => {
            // eslint-disable-next-line no-useless-escape
            if (/^[\d|\-|\+|\*|\/|\.|\(|\)]+$/.test(cur)) {
              return prev + cur
            }
            return prev
          }, '')
        }
      }
  
    },
  
  }

2.install.js(注册文件)

import input from "./input.js";

export default{
    install:Vue=>{
        Vue.directive('input',input)
    }
}

3.mian.js中引入

// 自定义输入框指令
import inputDirective from './directive/input/install';
 Vue.use( inputDirective );

4.页面调用

   <!-- 只能数字 -->
        <el-input v-input.num v-model="input"></el-input>
         <!-- 只能数字+小数点 -->
        <el-input v-input.num_point v-model="input"></el-input>
         <!-- 只能整数 -->
        <el-input v-input.int v-model="input"></el-input>
         <!-- 浮点型后面限制2-->
        <el-input v-input.float="2" v-model="input"></el-input>
         <!-- 只能英文 -->
        <el-input v-input.alp v-model="input"></el-input>

在这里插入图片描述

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

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

相关文章

Git如何操作本地分支仓库?

基本使用TortoiseGit 操作本地仓库(分支) 分支的概念 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来&#xff0c;避免影响开发主线。多线程开发,可以同时开启多个任务的开发&#xff0c;多个任务之间互不影响。 为何要…

10个好用的网络画图工具推荐,专业办公绘图必备!

在当今数字化时代&#xff0c;网络画图工具成为了各行各业的重要辅助工具。无论是制作流程图、思维导图、原型设计&#xff0c;还是插图绘制、数据可视化&#xff0c;网络画图工具为用户提供了便捷、高效的创作平台。本文将向大家推荐10个好用的网络画图工具&#xff0c;帮助你…

深度解析淘宝API商品评论接口的实现原理与使用方法

淘宝API商品评论接口&#xff0c;主要用于获取某个商品的评价信息。通过该接口&#xff0c;我们可以获取到商品的所有评价内容、评价时间、评价等级等相关信息&#xff0c;帮助我们更好地了解用户对商品的反馈&#xff0c;进而进行数据分析和业务优化。 一、接口鉴权 在使用淘…

波奇学C++:stl的list模拟实现

list是双向带头链表。所以迭代器end()相当于哨兵卫的头。 list不支持和[]重载&#xff0c;原因在于list空间不是连续的&#xff0c;和[]的代价比较大。 访问第n个节点&#xff0c;只能用for循环&#xff0c;来实现 list<int> l; l.push_back(0); l.push_back(1); l.pu…

代码随想录算法训练营之JAVA|第三十五天|343. 整数拆分

今天是第 天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天&#xff0c;如果做不到&#xff0c;完成一件评论区点赞最高的挑战。 算法挑战链接 343. 整数拆分https://leetcode.cn/problems/integer-break/ 第一想法 题目理解&#xff1a;将一个整数拆分为k个整数&…

python matlab 画坐标图

画一个坐标系&#xff0c;同时显示两条直线&#xff0c;效果图如下&#xff1a; 功能点&#xff1a; 同时显示两个纵坐标数据 显示图片名称 图片最大化保存 到本地 在图片某个位置显示字符信息 不同的线名称提示 代码如下&#xff1a; import matplotlib.pyplot as pltde…

学习左耳听风栏目90天——第七天 7/90(学习左耳朵耗子的工匠精神,对技术的热爱)【每个程序员都该知道的事】

每个程序员都该知道的事 每个程序员都应该要读的书每个搞计算机专业的学生应有的知识LinkedIn 高效的代码复查技巧编程语言和代码质量的研究报告 每个程序员都应该要读的书 每个搞计算机专业的学生应有的知识 LinkedIn 高效的代码复查技巧 编程语言和代码质量的研究报告

C++头文件和std命名空间

C 是在C语言的基础上开发的&#xff0c;早期的 C 还不完善&#xff0c;不支持命名空间&#xff0c;没有自己的编译器&#xff0c;而是将 C 代码翻译成C代码&#xff0c;再通过C编译器完成编译。 这个时候的 C 仍然在使用C语言的库&#xff0c;stdio.h、stdlib.h、string.h 等头…

CentOS7网络配置

本文是我从另外三个文章中整合而来&#xff0c;用于自存&#xff0c;如有侵权请联系我删除。 CentOS 7教程&#xff08;二&#xff09;-网络设置 - 知乎 (zhihu.com) VMware安装、Linux下CentOS7的配置及网络环境的配置&#xff08;最新版特别全&#xff09;_centos7 配置_Co…

田间气象站的优势与应用

在农业生产中&#xff0c;田间气象站是重要的气象监测工具&#xff0c;它能够对农田间的气象信息进行实时监测和记录&#xff0c;为农民伯伯提供农业生产科学依据。 田间气象站是由多个传感器共同组成&#xff0c;能够收集各项气象参数&#xff0c;包括我们常见的风速、风向、…

STM32--MPU6050与I2C外设

文章目录 前言MPU6050参数电路MPU6050框图 IIC外设框图 IIC的基本结构软件IIC实现MPU6050硬件IIC实现MPU6050 前言 在51单片机专栏中&#xff0c;用过I2C通信来进行实现AT24C02的数据存储&#xff1b; 里面介绍的是利用程序的编程来实现I2C的时序&#xff0c;进而实现AT24C02与…

关于android studio 几个简单的问题说明

自信是成功的第一步。——爱迪生 1. android studio 如何运行不同项目是否要更换不同的sdk 和 gradle 2.编译Gradle总是错误为什么 3.如何清理android studio 的缓存 4. 关于android Studio中的build 下面的rebuild project

『SEQ日志』在 .NET Core 中轻松集成 NLog 和 SEQ ,打造轻量级的分布式日志系统

&#x1f4e3;读完这篇文章里你能收获到 如何在Docker中部署 SEQ&#xff1a;介绍了如何创建和运行 SEQ 容器&#xff0c;给出了详细的执行操作如何使用 NLog 接入 .NET Core 应用程序的日志&#xff1a;详细介绍了 NLog 和 NLog.Seq 来配置和记录日志的步骤日志记录示例&…

判断三角形

int main() {int a 0;int b 0;int c 0;scanf("%d%d%d", &a, &b, &c);if ((ab>c)&&(ac>b)&&(bc>a)){if (a b && b c){printf("等边三角形\n");}else if ((a b && b ! c) || (a c && c…

企业的降本增益,从源头抓起——精细化管理每一条销售线索

存量经济时代&#xff0c;降本增效成为企业增长的重点抓手&#xff0c;也是企业自身数字化建设重要目标。 如何能让销售更珍惜线索&#xff1f;如何能让线索产生更快的转化&#xff1f;如何能让对的线索给到对的销售&#xff1f;如何能依托线索转化结果找到更有效的获客渠道&a…

【踩坑日记】STM32 USART 串口与 FreeRTOS 冲突

文章目录 问题描述问题出现的环境问题解决过程第一步第二步第三步第四步第五步第六步第七步第八步 后续验证一些思考类似的问题后记 问题描述 笔者使用 FreeRTOS 创建了两个任务&#xff0c;使两颗 LED 以不同频率闪烁&#xff0c;但是在加入串口 USART 部分代码后&#xff0c…

Shader 用到的数学函数总结及用法

在写shader相关的程序的时候往往需要用到 OpenGL内置的数学库&#xff0c;下面列举几个常用的函数用法和效果&#xff0c;下面的所有代码都是运行在shadertoy在线工具上的&#xff0c;推荐一个好用的数学工具desmosDesmos 目录&#xff1a; abs(x)step(edge,x)dot(uv1,uv2) …

MySQL双主架构、主从架构

为什么要对数据库做优化&#xff1f; MySQL官方说法&#xff1a; 单表2000万数据就达到瓶颈了。所以为了保证查询效率&#xff0c;要让每张表的大小得到控制。 MySQL主主架构 主数据库都负责增删改查。 比如有1000W的数据&#xff0c;有两个主数据库&#xff0c;就将数据分流给…

古巴勒索软件-CVE-2023-27532工具利用

黑莓捕获古巴勒索软件&#xff0c;其中一项工具有关CVE漏洞工具利用&#xff0c;利用有关CVE-2023-27532编号的漏洞利用工具进行投放。 MD5 9a3349f062130201a3dc16e78d5ab05d SHA-1 96e0a6a2aa12ed572fea9a1a858c903356bce1ab SHA-256 cf87a44c575d391df668123b05c207eef0…

代码随想录 (四)字符串

1.反转字符串 class Solution { public:void reverseString(vector<char>& s) {for (int i 0, j s.size() - 1; i < s.size()/2; i, j--) {swap(s[i],s[j]);}} };2.反转字符串II 直接用reverse&#xff08;是左闭右开的&#xff09; std::reverse 是 C 标准库中…