JavaScript中的校验机制三种写法举例(如手机号码、电话号码校验)

 更新时间:2025年04月23日 09:08:22   作者:outstanding木槿  
这篇文章主要给大家介绍了关于JavaScript中的校验机制三种写法举例,如手机号码、电话号码校验,还提供了针对不同场景和需求的验证方法推荐,并讨论了防抖优化在频繁校验场景中的应用,需要的朋友可以参考下

 在表单验证场景中,getValueFromEventpattern 和 validator 是三种不同的验证机制

方法作用适用场景
getValueFromEvent从表单事件(如 onChange)中提取值,通常用于预处理输入数据‌需要自定义事件值解析(如文件上传)
pattern通过正则表达式对输入值进行格式校验,属于声明式规则‌简单格式校验(如手机号、邮箱)
validator通过函数实现自定义逻辑验证,支持异步操作和复杂条件判断‌动态校验(如密码强度、联动字段)

解析

第一位是【1】开头,第二位则是【3,4,5,7,8】,第三位则是【0-9】,第三位之后则是数字【0-9】。从而我们可以得出一个符合当前的手机号码验证正则表达式(不适用电话)。

 ^1(3|4|5|7|8)\d{9}$  或者 ^1[34578]\d{9}$ 或 ^1[34578][0-9]{9}$ 或 ^1[3,4,5,7,8][0-9]{9}$

0. ^表示开始

1. 正则里面的中括号[]只能匹配其中一个

2. 如果要匹配特定几组字符串的话,那就必须使用小括号()加或|

3. |在中括号里面也是一个字符,并不代表或

4. [3457]匹配3或者4或者5或者7,而(3457)把3457这四个数当成整体匹配,若要跟前面一样可以加或(3|4|5|7)。

5. [34|57]匹配3或者4或者|或者5或者7,而(34|57)匹配34或者57。

6. \d{9}:匹配9个数字(0~9任意组合9个数字)。其中,\d 代表一个数字字符,{9} 表示前面的模式(即 \d)应重复9次。

总结‌

方案推荐度适用场景
rules + pattern⭐⭐⭐⭐⭐简单正则验证(推荐)
rules + validator⭐⭐⭐⭐复杂自定义验证
‌手动 checkPhone遗留代码或特殊需求

最佳实践‌:优先使用 Ant Design 的 rules 和 pattern,避免手动操作 DOM 和 alert

写法1:(不推荐)

function checkPhone(){ 
    var phone = document.getElementById('phone').value;
    if(!(/^1[34578]\d{9}$/.test(phone))){ 
        alert("手机号码有误,请重填");  
        return false; 
    } 
}
 
或者
function checkPhone(){ 
    var phone = document.getElementById('phone').value;
    var phoneRegex = /^1(3|4|5|7|8)\d{9}$/
    if(!(phoneRegex.test(phone))){ 
        alert("手机号码有误,请重填");  
        return false; 
    } 
}

// 在提交表单时调用
handleSubmit = (e) => {
  e.preventDefault();
  if (checkPhone()) {
    // 验证通过,提交表单
    this.props.form.validateFields((err, values) => {
      if (!err) {
        console.log('提交数据:', values);
      }
    });
  }
};

// handleSubmit = () => {
//    const phone = document.getElementById('phone').value;
//    if (!this.checkPhone(phone)) {
//     alert("手机号码有误");  // 手动触发验证‌
//   }
// };


const FormItem = Form.Item
<Row>
    <Col>
        <FormItem label='联系电话'>
            {getFieldDecorator('phone', {
                rules:[{
                    required: true,
                    message: '请输入正确的联系电话!',
                }],
                initialValue: '',
            })(
                <Input id='phone' />
            )}
        </FormItem>
    </Col>
    <Button onClick={this.handleSubmit}>提交</Button>
</Row>

⚠️ ‌缺点‌:

  • 直接操作 DOM(document.getElementById),不符合 React 的最佳实践。
  • 错误提示用 alert,用户体验较差(Ant Design 的表单错误提示更优雅)。

写法2:pattern 正则表达式

const FormItem = Form.Item
<Row>
    <Col>
        <FormItem label='联系电话'>
            {getFieldDecorator('phone', {
                rules:[
                    { 
                        required: true, 
                        message: '请输入联系电话!' 
                    },
                    { 
                        pattern: /^1(3|4|5|7|8)\d{9}$/,
                        message: '请输入11位有效手机号!' 
                    },
                    
                ],
                initialValue: '',
            })(
                <Input id='phone'  maxLength={11} />
            )}
        </FormItem>
    </Col>
    
</Row>

✅ ‌优点‌:

  • 不需要额外写 checkPhone 函数,直接用 pattern 进行正则验证。
  • Ant Design 会自动处理错误提示,不需要手动 alert

写法3:validator 自定义验证(更灵活)

(需求:除了汉字和字母不能输入以外,其他的都可输入)

const FormItem = Form.Item
<Row>
    <Col>
        <FormItem label='联系电话'>
            {getFieldDecorator('phone', {
                rules:[
                    { 
                        required: true, 
                        message: '请输入联系电话!' 
                    },
                    { 
                       pattern: /^1[3-9]\d{9}$/, 
                        message: '请输入11位有效手机号!' 
                    },
                    {
                    validator: (rule, value, callback) => {
                        const reg = new RegExp('[\u4E00-\u9FA5]')
                        const reg1 = new RegExp('[A-Za-z]')
                        if(reg.test(value)){
                            callback('手机号码不能输入汉字!')
                        } else if (reg1.test(value)){
                            callback('手机号码不能输入字母!')
                        } else {
                            callback()
                        }
                    }
                }],
            })(
                <Input id='phone' maxLength={11} />
            )}
        </FormItem>
    </Col>
    
</Row>

✅ ‌优点‌:

  • 可以自定义更复杂的验证逻辑(如异步校验)。
  • 仍然不需要手动操作 DOM(document.getElementById)。

扩展建议

国际号码支持

若需支持国际号码,可替换正则为:

pattern: /^(?:\+?86)?1[3-9]\d{9}$|^(?:\+?\d{1,3})?\d{6,15}$/

动态校验

通过 setFieldsValue 实现联动校验(如区号+座机号场景)。

防抖优化

频繁校验时建议添加防抖:

import { debounce } from 'lodash'; 
validator: debounce((rule, value, callback) => { ... }, 300)

// 代码:
rules: {
  username: [
    { required: true, message: '必填项' },
    { 
      validator: debounce((rule, value, callback) => {
        if (/[^a-z]/.test(value)) callback('仅允许小写字母');
        else callback();
      }, 1000),
      trigger: 'blur'  // 明确防抖触发条件。防抖场景必须声明‌:防抖函数需绑定明确的事件(如 blur 或 change)‌
    }
  ]
}
场景防抖配置优势
输入实时搜索delay: 300ms减少搜索接口调用‌
异步唯一性校验delay: 1000ms避免频繁请求‌
多字段联合校验共享防抖实例统一控制校验节奏‌
  • trigger: 'blur' 表示输入框失去焦点时触发校验,适合实时性要求较低的场景(如避免输入中途频繁提示)‌17。
  • trigger: 'change' 会在值变化时立即校验,适合需要即时反馈的交互(如密码强度检测)‌
  • 场景是否需要显式声明原因
    需要实时校验可选(建议声明)明确控制触发时机,避免依赖默认行为‌
    仅提交时校验可不写默认行为已满足需求‌
    防抖场景必须声明防抖函数需绑定明确的事件触发点(如 blur),否则无法生效‌

电话号码校验,上面的pattern方法、validator方法都适用

function phoneValid(number) {
    // 去除任何非数字字符
    const cleaned = number.replace(/\D/g, '');
 
    // 定义正则表达式验证规则
    const mobilePattern = /^1[3-9]\d{9}$/; // 手机号
    const tellPattern = /^0\d{2,3}-?\d{7,8}$/; // 电话号
 
    // 验证是否符合手机号码或座机号码格式
    if (mobilePattern.test(cleaned) || tellPattern.test(cleaned)) {
        return true;
    } else {
        return false;
    }
}
 
// 示例用法
console.log(phoneValid('13800138000')); // true
console.log(phoneValid('010-12345678')); // true
console.log(phoneValid('12345678')); // false
console.log(phoneValid('021-87654321')); // true
console.log(phoneValid('18912345678')); // true

空格校验

const FormItem = Form.Item
<Row>
    <Col>
        <FormItem label='联系电话'>
            {getFieldDecorator('phone', {
                getValueFormEvent: (e) => e.target.value.replace(/^\s+|\s$/g,'')
                initialValue: '',
            })(
                <Input id='phone' />
            )}
        </FormItem>
    </Col>
    
</Row>


// "  hello world  ".replace(/^\s+|\s+$/g, ""); // 输出 "hello world"‌:ml-citation{ref="1,3" data="citationList"}
语法含义示例匹配场景
^\s+匹配字符串‌开头‌的1个或多个空白字符(空格、制表符、换行符等)‌‌" hello" 中的开头空格
\s+$匹配字符串‌末尾‌的1个或多个空白字符‌"world " 中的末尾空格
``逻辑“或”操作符,匹配两者之一‌同时处理开头和末尾空格
g全局匹配模式,替换所有符合条件的内容(而非仅第一个)‌

多次替换

  • \s
    匹配‌单个空白字符‌,包括:

    • 空格( 
    • 制表符(\t
    • 换行符(\n
    • 换页符(\f)等‌。
      注:\S 表示其反向匹配(非空白字符)‌。
  • ^ 和 $

    • ^ 匹配字符串的‌起始位置‌(需在开头)‌。
    • $ 匹配字符串的‌结束位置‌(需在末尾)‌。
  • +
    表示前面的字符(\s)‌至少出现1次‌(等价于 {1,})‌

  • 若需‌严格匹配纯空格‌(不含制表符等),可用 [ ]+ 替代 \s+

  • 在拆分字符串时,\s 常用于分割单词(如 split(/\s+/))‌

  • 正则表达式作用区别
    /\s+/g匹配‌所有连续空白字符不限定位置,包括中间空格‌3
    /^\s+/g仅匹配‌开头空白字符忽略末尾空格‌3
    /\s+$/g仅匹配‌末尾空白字符忽略开头空格‌

总结 

到此这篇关于JavaScript中的校验机制三种写法的文章就介绍到这了,更多相关JS手机号码、电话号码校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • webpack 从指定入口文件中提取公共文件的方法

    webpack 从指定入口文件中提取公共文件的方法

    这篇文章主要介绍了webpack 从指定入口文件中提取公共文件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • JavaScript前补零操作实例

    JavaScript前补零操作实例

    这篇文章主要介绍了JavaScript前补零操作的方法,以实例形式对比分析了javascript实现补零操作的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • js+css实现文字散开重组动画特效代码分享

    js+css实现文字散开重组动画特效代码分享

    这篇文章主要介绍了js+css实现文字散开重组动画特效,需要的朋友可以参考下
    2015-08-08
  • Electron无边框自定义窗口拖动的问题小结

    Electron无边框自定义窗口拖动的问题小结

    最近使用了electron框架,发现如果自定义拖动是比较实用的;特别是定制化比较高的项目,如果单纯的使用-webkit-app-region: drag;会让鼠标事件无法触发,这篇文章主要介绍了Electron无边框自定义窗口拖动的问题小结,需要的朋友可以参考下
    2024-04-04
  • JS的事件循环执行机制详解

    JS的事件循环执行机制详解

    JS执行是单线程的,它是基于事件循环的,那么本篇博文就来分享一下关于JS的事件循环执行机制,感兴趣的小伙伴可以跟着小编一起来学习
    2023-05-05
  • js实现随机抽奖

    js实现随机抽奖

    这篇文章主要为大家详细介绍了js实现随机抽奖功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • JS利用中介模式开发全局控制器

    JS利用中介模式开发全局控制器

    这篇文章主要为大家介绍了JS利用中介模式开发全局控制器图文示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • js+CSS 图片等比缩小并垂直居中实现代码

    js+CSS 图片等比缩小并垂直居中实现代码

    本例子在在 ff 2.0/ ie6 / ie7 中测试通过。但在 opera 8.5 cn中没有通过。希望大家测试。
    2008-12-12
  • js 日期转换成中文格式的函数

    js 日期转换成中文格式的函数

    最近的项目需要将日期转换成中文的格式,于是写了个小小的JS函数,使用时直接调用即可.
    2009-07-07
  • sass 中使用 /deep/ 修改 elementUI 组件样式报错的解决方案

    sass 中使用 /deep/ 修改 elementUI 组件样式报错

    这篇文章主要介绍了sass 中使用 /deep/ 修改 elementUI 组件样式报错的解决方案,尝试用 ::v-deep 替换 /deep/ ,成功解决了问题,感兴趣的朋友跟随小编一起看看吧
    2024-02-02

最新评论