javascript 失焦事件,正则验证什么鬼?

2015-08-12 10:28:29 +08:00
 laoona

<input type="text" id="txt">
<script type="text/javascript">
window.onload = function() {
var reg = /^[\u4e00-\u9fa5\u22c5\u2022\u00b7]+$/gi,
txt = document.getElementById("txt");
txt.onblur = function() {
console.log(txt.value);
console.log(reg.test(txt.value)); //false
}
}
</script>
验证中文、圆点字符,为毛输入框的文本值没变化的情况下:第一次触发验证是true,第二次是false?

3486 次点击
所在节点    JavaScript
11 条回复
Arrowing
2015-08-12 10:46:43 +08:00
tamamaxox
2015-08-12 10:49:43 +08:00
/^[\u4e00-\u9fa5\u22c5\u2022\u00b7]+$/ 就好了,没有必要加gi
flowfire
2015-08-12 10:58:32 +08:00
很奇怪你为什么验证中文字符还要加上 不区分大小写 。。。。
laoona
2015-08-12 11:02:49 +08:00
@flowfire 这个真是习惯加上的,真心不太理解global
flowfire
2015-08-12 11:12:45 +08:00
@laoona
i才是不区分大小写。。
g是匹配所有
如2楼所说,如果你只是检测这个里面存不存在的话的确没必要加上g
比如
"1111".match(/1/)

"1111".match(/1/g)

出来的结果分别是
['1']

['1','1','1','1']
不加g就是一旦匹配到第一个就停止。。
加了g就是一直查找直到所有的全部匹配到
flowfire
2015-08-12 11:15:51 +08:00
刚刚google了一下。。。。m的意思大概就是换行符能被 . 匹配吧。。
flowfire
2015-08-12 11:21:16 +08:00
点进连接看了一下。。。
大意是这么回事
由于 g 是要求查找所有匹配
所以每次调用并不是每次都取第一个匹配值。。
而是依次取第一个,第二个,第三个。。知道空。。
按照你的写法,貌似只能匹配到一个值,
所以返回的值大概是这样
返回取到的第一个值 true
后面没有了,返回空 false
上一次返回了空,返回取到的第一个值 true
后面没有了,返回空 false
leeyuzhe
2015-08-12 11:29:33 +08:00
@flowfire 7楼正解,如果加g就是一次匹配尾部所有符合内容直到匹配到空然后进行下一次从头匹配
Biwood
2015-08-12 13:43:12 +08:00
经典问题啊,用正则的 test() 测试的时候千万要小心,特别是加上 global 标识符之后,正则对象会记忆上一次的匹配位置,接下来的 test 都是接着上一次成功的位置开始匹配的,你每次执行 test 完之后可以打印 reg.lastIndex 看一下
iyaozhen
2015-08-12 14:40:39 +08:00
@Biwood 我去,还有这种问题呀。受教了
mingyun
2015-08-30 21:20:42 +08:00
@Biwood 恩 这是个坑

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/212590

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX