Vue全局指令/局部指令过滤el-input的值【特殊字符/手机号/网址等】

本文介绍了一种前端输入框验证的方法,通过自定义指令实现了不同类型的输入限制,包括禁止空格、仅允许数字输入等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端开发最常碰到的就是输入框,经常要做各种验证,本公司惯用的需求是直接屏蔽特定字符的输入,如禁止非数字输入,特殊符号输入,空格输入等,这些功能反复使用,做成指令的形式,直接调用,非常方便,上代码:

第一种

目录结构很简单:

1、项目文件夹里新建directives文件夹,所有指令都放在这个文件夹里

2、input-filter文件夹放具体指令,在其下建两个文件:

  • index.js负责封装,职责分明
  • inputFilter.js实现主体功能


创建 index.js:
import inputFilter from './inputFilter'
 
const install = function(Vue) {
  Vue.directive('inputFilter', inputFilter)
}
 
if (window.Vue) {
  window.inputFilter = inputFilter
  Vue.use(install)
}
 
inputFilter.install = install
export default inputFilter

创建 inputFilter.js:

/**
 *  实现功能
 *  1、默认情况下只禁止空格输入
 *  2、限制只能输入整数
 *  3、限制只能输入整数和小数(价格类)
 *  4、限制只能输入手机号
 *  5、限制最大值和最小值(抛出错误给回调函数)
 */
const addListener = function(el, type, fn) {
  el.addEventListener(type, fn, false)
}
const spaceFilter = function(el) {
  addListener(el, 'keyup', () => {
    el.value = el.value.replace(/\s+/, '')
  })
}
const intFilter = function(el) {
  addListener(el, 'keyup', () => {
    el.value = el.value.replace(/\D/g, '')
  })
}
const priceFilter = function(el) {
  addListener(el, 'keyup', () => {
    el.value = el.value.replace(/[^\d.]*/g, '')
    if (isNaN(el.value)) {
      el.value = ''
    }
  })
}
const specialFilter = function(el) {
  addListener(el, 'keyup', () => {
    el.value = el.value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5]/g, '')
  })
}
const phoneFilter = function(el) {
  addListener(el, 'blur', () => {
    if (!el.value) {
      return
    }
    const phoneReg = new RegExp('^(13|14|15|16|17|18|19)[0-9]{9}$')
    if (!phoneReg.test(el.value)) {
      alert('手机号输入错误')
      el.value = ''
    }
  })
}
const urlFilter = function(el) {
  addListener(el, 'blur', () => {
    if (!el.value) {
      return
    }
    const urlReg = /(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/
    if (!urlReg.test(el.value)) {
      alert('url输入错误')
      el.value = ''
    }
  })
}
export default {
  bind(el, binding) {
    if (el.tagName.toLowerCase() !== 'input') {
      el = el.getElementsByTagName('input')[0]
    }
    spaceFilter(el)
    switch (binding.arg) {
      case 'int':
        intFilter(el)
        break
      case 'price':
        priceFilter(el)
        break
      case 'special':
        specialFilter(el)
        break
      case 'phone':
        phoneFilter(el)
        break
      case 'url':
        urlFilter(el)
        break
      default:
        break
    }
  }
}

组件引用:

import inputFilter from '@/directives/input-filter/index.js'  // 引入
 
<el-input v-input-filter v-model="inputSpaceFilter" placeholder="空格无法输入"></el-input>
<el-input v-input-filter:int v-model="inputIntFilter" placeholder="只能输入整数"></el-input>
<el-input v-input-filter:price v-model="inputPriceFilter" placeholder="只能输入价格"></el-input>
<el-input v-input-filter:special v-model="inputSpecialFilter" placeholder="过滤特殊字符"></el-input>
<el-input v-input-filter:phone v-model="inputPhoneFilter" placeholder="只能输入手机号"></el-input>
<el-input v-input-filter:url v-model="inputUrlFilter" placeholder="只能输入网址"></el-input>
 
export default {
  directives: {
    inputFilter
  }
}
第二种
前提补充

在vue中

<input v-model="text" />

等价于

<input
 :value="text"
 @input="e => text = e.target.value"
/>
  • 需求
    前端提交form表单要求,不能输入 @#¥%……&*…
    不是提示,而是 禁止输入

代码

** 在mian.js中添加【vue原型上添加方法,便于全局使用】

Vue.prototype.validForbid = function (value, number = 255) {
  value = value.replace(/[`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、]/g, '').replace(/\s/g, "");
  if (value.length >= number) {
    this.$message({
      type: "warning",
      message: `输入内容不能超过${number}个字符`
    });
  }
  return value;
}

组件中使用
<el-input
  :value="form.name"
  @input="e => form.name = validSe(e)"
  maxlength="10"
  placeholder="过滤特殊字符长度10"
></el-input>

<el-form :rules="formRules" :model="pageModel.form" label-width="120px" size="small"> <el-row :gutter="24"> <el-col :span="12"> <el-form-item label="姓名" prop="policeName" class="content"> <el-input v-model="pageModel.form.policeName" class="w100Percent" :disabled="pageModel.pageInfo.formConfig.type == '2' " /> </el-form-item> </el-col> <el-col :span="12" v-if="pageModel.pageInfo.environmentShow === true"> <el-form-item label="身份证号" prop="" class="content"> <el-input v-model="pageModel.form.idCard" class="w100Percent" :disabled="pageModel.pageInfo.formConfig.type == '2' " /> </el-form-item> </el-col> <el-col :span="12" v-if="pageModel.pageInfo.environmentShow === true"> <el-form-item label="性别" prop="" class="content"> <el-select v-model="pageModel.form.sex" placeholder="请选择" style="width: 100%" :disabled="pageModel.pageInfo.formConfig.type == '2' "> <el-option v-for="(item, index) in pageModel.pageInfo .sexType" :key="index" :label="item.dictLabel" :value="item.dictValue"> </el-option> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="所属单位" prop="deptId" class="content"> <el-cascader :options="pageModel.listDept" v-model="pageModel.form.deptId" :props="{ children: 'children', label: 'deptName', value: 'deptId', checkStrictly: true, }" style="width: 100%" @change="changeHandel" :disabled="pageModel.pageInfo.formConfig.type == '2' " clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="警号" prop="policeCode" class="content"> <el-input v-model="pageModel.form.policeCode" class="w100Percent" :disabled="pageModel.pageInfo.formConfig.type == '2' " onkeyup="this.value=this.value.replace(/[^\w_]/g,'')" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="警种" prop="policeType" class="content"> <el-input v-model="pageModel.form.policeType" :disabled="pageModel.pageInfo.formConfig.type == '2' " class="w100Percent" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="接入方式" prop="" class="content"> <el-select v-model="pageModel.form.pattern" placeholder="请选择" style="width: 100%" :disabled="pageModel.pageInfo.formConfig.type == '2' "> <el-option v-for="(item, index) in pageModel.pageInfo .type" :key="index" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="单位信息" prop="" class="content"> <el-input v-model="pageModel.form.shortName" :disabled="pageModel.pageInfo.formConfig.type == '2' " class="w100Percent" /> </el-form-item> </el-col> <el-col :span="12" v-if="pageModel.pageInfo.environmentShow === true"> <el-form-item label="职务" prop="" class="content"> <el-input v-model="pageModel.form.post" :disabled="pageModel.pageInfo.formConfig.type == '2' " class="w100Percent" /> </el-form-item> </el-col> <el-col :span="12" v-if="pageModel.pageInfo.environmentShow === true"> <el-form-item label="手机号" prop="" class="content"> <el-input v-model="pageModel.form.phone" :disabled="pageModel.pageInfo.formConfig.type == '2' " class="w100Percent" /> </el-form-item> </el-col> <el-col :span="12" v-if="pageModel.pageInfo.environmentShow === true"> <el-form-item label="邮箱" prop="" class="content"> <el-input v-model="pageModel.form.email" :disabled="pageModel.pageInfo.formConfig.type == '2' " class="w100Percent" /> </el-form-item> </el-col> <el-col :span="24" v-if="pageModel.pageInfo.environmentShow === true"> <!-- :disabled="" --> <el-form-item label="头像" prop="" class="content"> <img class="tx" v-if="pageModel.pageInfo.formConfig.type == '2'" :src="pageModel.form.userPic" alt="" /> <el-upload class="upload-demo" action="" v-else v-model="pageModel.form.userPic" :http-request="uploadActionHandle" :before-upload="beforeAvatarUpload" :before-remove="beforeDeleteImage" :on-remove="deleteImageHandel" :file-list="pageModel.pageInfo.imageList" list-type="picture"> <el-button size="small" type="primary">点击上传 </el-button> </el-upload> </el-form-item> </el-col> <el-col :span="24" v-if="pageModel.pageInfo.environmentShow === true"> <el-form-item label="备注" prop="" class="content"> <el-input v-model="pageModel.form.remark" :disabled="pageModel.pageInfo.formConfig.type == '2' " type="textarea" :rows="3" class="w100Percent" /> </el-form-item> </el-col> </el-row> </el-form>为什么输入姓名之后,会有空白出现
07-27
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值