jQuery Inputmask插件按前三位数字增删掩码触发类型错误
jQuery Inputmask 5.0.9-beta.4 动态切换掩码报错问题解决
场景与需求
使用版本为5.0.9-beta.4的jQuery Inputmask插件,实现用户名输入框的动态掩码规则:
- 仅当用户输入的前三位字符为
784时,启用掩码999-9999-9999999-9 - 其他情况移除掩码
当前代码
var inputMsk = $('#txtUsername').inputmask('999-9999-9999999-9'); inputMsk.inputmask('remove'); $('#txtUsername').on('input', function() { var fieldValue = $(this).val(); if (fieldValue.startsWith('784')) { if ($('#txtUsername').inputmask) { inputMsk = $('#txtUsername').inputmask('999-9999-9999999-9'); } } else { if ($('#txtUsername').inputmask) { inputMsk.inputmask('remove'); } } });
报错情况
输入784后删除最后一位4时,控制台抛出错误:
Uncaught TypeError: f is not a function
错误触发自插件内部代码:
keypressEvent: function (e, t, i, a, o) { var c = this.inputmask || this, u = c.opts, f = c.dependencyLib, p = c.maskset, d = c.el, h = f(d),//----------错误触发行 m = e.key;
问题原因
- 实例引用失效:
inputMsk是首次初始化的掩码实例引用,执行inputmask('remove')后该实例已被销毁,后续再通过inputMsk调用插件方法会导致内部依赖库引用错乱。 - 掩码存在判断错误:
$('#txtUsername').inputmask是插件挂载在jQuery对象上的方法,始终存在,无法用来判断元素是否已绑定掩码实例。 - 输入值处理不严谨:当掩码生效后,输入值会包含分隔符
-,直接用startsWith('784')会出现判断偏差(比如输入78-时无法正确识别)。
修正后的代码
// 初始化时先移除默认掩码 $('#txtUsername').inputmask('remove'); $('#txtUsername').on('input', function() { const $input = $(this); // 移除掩码分隔符,获取纯输入内容 const rawValue = $input.val().replace(/-/g, ''); if (rawValue.startsWith('784')) { // 检查当前是否已应用目标掩码,避免重复初始化 const currentMask = $input.inputmask('getoption', 'mask'); if (currentMask !== '999-9999-9999999-9') { $input.inputmask('remove').inputmask('999-9999-9999999-9'); } } else { // 通过data属性检查是否存在掩码实例,避免重复移除 if ($input.data('_inputmask')) { $input.inputmask('remove'); } } });
关键优化点
- 直接基于jQuery元素
$input操作,避免依赖失效的实例引用 - 使用
$input.data('_inputmask')判断元素是否绑定了掩码实例,用getoption获取当前掩码配置,确保操作的准确性 - 处理输入值时移除掩码分隔符,保证前缀判断的正确性
内容的提问来源于stack exchange,提问作者Fakhr Alam
相关产品推荐
相关产品推荐

