只能输入数字的文本域

本文介绍了一个关于手机号码输入框处理的BUG案例。该问题出现在中文输入法状态下,当用户输入非数字字符时,这些字符会被错误地填充到手机号码字段中。文章提供了两种解决方案:一种是在HTML标签中添加样式以禁用输入法;另一种是利用HTML5标准事件oninput及IE专属事件onpropertychange来监听输入框的变化,并及时清理非数字字符。

斌斌 (给我写信) 原创博文(http://blog.youkuaiyun.com/binbinxyz),转载请注明出处
这两天做项目时遇到一个手机号码的表单项,简单进行处理后我就提交测试了。原以为任务顺利完成,不曾想测试却给我反馈一个BUG,要示我修复后重新提交。

源码

手机号码:<input type="text" id="phone" name="phone" maxlength="11" />
<span id="phoneError">&nbsp;</span>

<script type="text/javascript">
$(document).ready(function(){
    $("#phone").bind("keyup paste", function(){
        //手机号码只能为数字,绑定输入和粘贴事件
        if(/[^\d]+/.test(this.value)) {
            this.value = this.value.replace(/[^\d]/g, '');
        }
    }).bind("blur", function(){
        //失去焦点时校验手机号码格式,详情略
    }).bind("focus", function(){
        //获得焦点时清除错误提示等
    });
});
</script>

Bug反馈

中文输入法状态下,任意输入几个字符(比如:boke-博客),如图一
敲回车键,此时boke四个字母进入手机号码输入框中了,如图二

图一:
图一
图二:
图二

解决方案

1.在html标签中添加样式,禁用输入法

 style="ime-mode:disabled;"

这里写图片描述
2.结合HTML5标准事件oninput和IE专属事件onpropertychange事件来监听输入框值变化

$("#phone").bind("input propertychange paste", function(){
    //手机号码只能为数字,绑定输入和粘贴事件
    if(/[^\d]+/.test(this.value)) {
        this.value = this.value.replace(/[^\d]/g, '');
    }
});

兼容情况:
这里写图片描述
oninput是HTML5的标准事件,对于检测input:text,input:password,input:search和textarea这几个元素通过用户界面发生的内容变化非常有用,在内容修改后立即被触发,不像onchange事件需要失去焦点才触发。从上面表格可以看出,oninput事件在IE9以下版本不支持,需要使用IE特有的onpropertychange事件替代,这个事件在用户界面改变或者使用脚本直接修改内容两种情况下都会触发,有以下几种情况:

  • 修改了input:checkbox或者input:radio元素的选择中状态,checked属性发生变化。
  • 修改了input:text或者textarea元素的值,value属性发生变化。
  • 修改了select元素的选中项,selectedIndex属性发生变化。

斌斌 (给我写信) 原创博文(http://blog.youkuaiyun.com/binbinxyz),转载请注明出处

### 实现 Vue 组件中输入框仅限数字输入 为了确保 Vue 组件中的输入只能接收数字输入,有多种方法可供选择。每种方式都有其特点和适用场景。 #### 方法一:使用 `v-model` 和正则表达式过滤 通过监听输入事件,在每次用户输入时利用 JavaScript 的正则表达式去除非法字符: ```html <template> <div> <!-- 使用 @input 事件处理函数 --> <el-input v-model="numberOnly" @input="filterNonNumeric"></el-input> </div> </template> <script> export default { data() { return { numberOnly: '' }; }, methods: { filterNonNumeric(value) { this.numberOnly = value.replace(/[^0-9]/g, ''); } } }; </script> ``` 这种方法简单直观,适用于大多数情况下的纯数字限制[^2]。 #### 方法二:HTML原生属性配合 CSS 清除默认样式 可以直接设置 HTML `<input>` 元素的 `type="number"` 属性来限定输入范围为整数或浮点数,并可通过自定义CSS移除浏览器默认样式影响用户体验的部分: ```html <!-- 原生 input 类型为 "number", 并附加清除样式的类名 --> <input type="number" class="clear-number-style" /> <style scoped> .clear-number-style::-webkit-inner-spin-button, .clear-number-style::-webkit-outer-spin-button { -webkit-appearance: none; } /* 隐藏上下箭头 */ .clear-number-style[type='number'] { -moz-appearance:textfield; } </style> ``` 此方案不仅能够有效阻止非数值键入,还能保持良好的跨平台兼容性[^3]。 #### 方法三:Element UI 表单验证规则结合模板插槽 当项目已经集成了 Element UI 库时,则可以借助表单项 (`el-form-item`) 提供的强大校验机制完成相同功能: ```html <el-form :model="form"> <el-form-item label="请输入数字:" prop="digitField" :rules="[ { required: true, message: '不能为空', trigger: 'blur'}, { pattern: /^[0-9]*$/, message: '只能填写数字'} ]"> <el-input v-model="form.digitField" autocomplete="off"></el-input> </el-form-item> </el-form> ``` 上述代码片段展示了如何配置一个带有必填项检查及模式匹配(即只接受由零到九组成的字符串)双重约束条件的文本域控件[^5]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值