JavaScript中的简单正则表达式适用于所有浏览器,但Safari除外



我有几个带有类型为数字的输入字段的表单似乎没有被 Safari 应用任何验证(在 Mac OS X Mavericks 上)。也就是说,如果一个人输入字母并点击提交,则在每个浏览器中都会出现一条小消息,提示您需要在字段中输入数字 - Safari 除外。哦,火狐也在这个平台上。

因此,我决定需要向处理这些表单值的 JavaScript 代码添加验证。我输入了一个正则表达式来拒绝任何不是个位数的数字:

if ( !/^([0-9])$/.test(value) ) {
    alert ("Please enter a number");
    return;
}

在 Firefox 中,这符合我的预期。如果输入任何字母或单个数字以外的任何内容,则会显示警报。

在 Safari 上,如果您输入两个或更多数字,也会显示警告,但如果输入非数字字符,则不会显示。它的行为就好像它愉快地接受输入一样,但是如果我随后在上面的 else 块中进一步添加一个警告框以显示值是什么,那也不会显示。JavaScript 控制台中没有错误。就像它什么都不做一样。

我已经盯着正则表达式看了一堆,尽管它尽可能简单。我很困惑。有什么想法吗?

我真的不喜欢正则表达式。它们总是很容易出错,您有时不会考虑所有可能的匹配项。你为什么不使用这样的东西:

if (parseInt("15", 10) !== NaN)
    alert("is numeric");
else
    alert("please enter a number"); 

您的正则表达式对单个位数的字符串测试 true,否则为 false(并输入否定的 if 条件)。它必须只有一个数字还是一个或多个数字?

添加 + 以指定一个或多个数值。

/^([0-9]+)$/

另外,您是否需要或正在使用分组(数字周围的括号)?

/^[0-9]+$/

小提琴

验证整数的杂项方法..

// Integers including 0: following values will return true (0, 1, 2 .., 65, etc.)
/^(?:0|[1-9]d*)$/.test(value);
// Integers, zero not allowed
/^[1-9]d*$/.test(value);
// Test whether the value is an integer or not (+ sign try to cast the value into a number)
if(Number.isInteger(+value)){/* ... */}

用户友好的解决方案..

几个月前,我不得不格式化一个必须是整数或浮点数的用户输入;格式化过程在按键时触发。

这就是我在这里实现的小提琴

允许的格式

  • .80
  • 0.80
  • 15:80
  • 1500

希望它会有所帮助..

最新更新