Write By Monkeyfly
以下内容均为原创,如需转载请注明出处。
前提
今天在看别人自定义的一个必填项的表单验证的方法时,发现一个问题:
HTML代码:
<input type&#61;"text" placeholder&#61;"存在data-empty属性" data-empty&#61;"请输入用户名" >
<input type&#61;"text" placeholder&#61;"没有data-empty属性" >
<input type&#61;"text" placeholder&#61;"请输入手机或电话" data-empty&#61;"请输入手机或电话" data-pattern&#61;"^((0\d{2,3}-?\d{7,8})|(1[35784]\d{9}))$" >
jQuery代码&#xff1a;
$(function(){$("input").on(&#39;blur&#39;, function(event) {var empty &#61; $(this).attr("data-empty");if($(this).val() &#61;&#61;""){if(empty){setTimeout(function(){},1500)}else{alert("该文本框没有data-empty属性");}}var pattern &#61; new RegExp( $(this).attr(&#39;data-pattern&#39;) );var result &#61; pattern.test( $(this).val() );if( $(this).val() && !result){setTimeout(function(){},1500)}});
}
说明&#xff1a;
- 其实刚开始看时&#xff0c;愣是没看明白正则验证的
前3行代码
&#xff0c;不知道 result
的值何时为true
&#xff0c;何时为false
。 - 在查看了正则表达式相关知识和进行了相关的代码测试之后&#xff0c;才算是真正明白了。
分析&#xff1a;
- 首先&#xff0c;我们要知道RegExp 对象表示正则表达式&#xff0c;它是对字符串执行模式匹配的强大工具。
- 其次&#xff0c;我们要知道创建 RegExp 对象的语法&#xff1a;
new RegExp(pattern, attributes);
- 参数说明&#xff1a;
pattern
&#xff1a;本意为模式&#xff0c;它是一个字符串&#xff0c;表示一种正则表达式的匹配模式&#xff0c;也可以是自定义的正则表达式。attributes
&#xff1a;【可选参数】本意为属性&#xff0c;是一个可选的字符串&#xff0c;包含3
种属性&#xff1a;"g"、"i" 和 "m"
。分别是&#xff1a;全局匹配、忽略大小写匹配和多行匹配。- 注&#xff1a;如果 第一个参数
pattern
是正则表达式&#xff0c;而不是字符串&#xff0c;则必须省略该参数。
- 返回值&#xff1a;一个新的
RegExp
对象&#xff0c;具有指定的模式和标志&#xff08;"g"、"i" 或 "m"
&#xff09;。 - 正则表达式对象的方法&#xff1a;
test()
方法用于检测一个字符串是否匹配某个模式。&#xff08;模式就是创建正则表达式对象时传入的字符串参数&#xff09;- 语法&#xff1a;
正则表达式对象.test(string)
- 返回值&#xff1a;如果字符串
string
中含有与 正则表达式对象 匹配的文本&#xff0c;则返回 true
&#xff0c;否则返回false
。
var pattern &#61; new RegExp( $(this).attr(&#39;data-pattern&#39;) );var result &#61; pattern.test( $(this).val() );
var pattern &#61; new RegExp( );var result &#61; pattern.test( $(this).val() ); $(this).attr(&#39;data-pattern&#39;)
测试过程1&#xff1a;
var p &#61; new RegExp();
console.log(p); /(?:)/
p.test("");
p.test("123");
p.test("aae");
var p &#61; new RegExp("");
console.log(p); /(?:)/
p.test("");
p.test("123");
p.test("asd");
var p &#61; new RegExp(undefined);
console.log(p); /(?:)/
p.test("");
p.test("123");
p.test("1234aae");
var p &#61; new RegExp("undefined");
p.test("123");
p.test("asd");
var p &#61; new RegExp(null);
p.test("123");
p.test("asd");
测试结果1&#xff1a;
- 对于正则表达式对象
p
来说&#xff0c;如果创建对象时传入的字符串参数为空&#xff08;""&#xff09;
&#xff0c;传入一个undefined
&#xff0c;或者没传任何参数&#xff0c;此时调用它的test()
方法能匹配到任何字符串&#xff0c;因此test()
方法的返回值都为true
。&#xff08;这相当于匹配的模式为""
、undefined
值、或无模式&#xff09;
总结&#xff1a;pattern
对象对空字符串("")
、undefined
值、空值的处理&#xff0c;都会导致test()
方法返回true
。
测试过程2&#xff1a;
"text" >
var empty &#61; $(this).attr("data-empty");
console.log(typeof empty);
<input type&#61;"text" data-empty&#61;"" >
var empty &#61; $(this).attr("data-empty");
console.log(typeof empty);
测试结果2&#xff1a;如果自定义属性存在&#xff0c;则返回string
类型&#xff0c;如果自定义属性不存在&#xff0c;则返回undefined
类型。
现在&#xff0c;这个问题就迎刃而解了
var pattern &#61; new RegExp( $(this).attr(&#39;data-pattern&#39;) );var result &#61; pattern.test( $(this).val() );if( $(this).val() && !result){}