1

我有验证电话号码以完成订单的 javascript 代码。

function validatePhoneNumber(phone) {
    var trimPhone = phone.replace(new RegExp(" ","g"),'');  
    var phoneNumber = trimPhone.split(/\d/).length  - 1 ;           
    return phoneNumber >= 10 && phoneNumber <= 16 && phoneNumber === trimPhone.length ;
}

这是结帐按钮的代码

if(!validatePhoneNumber($('#phone').val())){
    $('#phone').css("color", "#ff0000");
    $('#invalidNumberFormat').show();
    submit = false;
}
else{
    $('#invalidNumberFormat').hide();
}

该代码在 Firefox 和 Chrome 中运行良好,但在 IE8 中它总是返回错误消息,指出字符串不在 10 到 16 个字符之间。

可能是什么原因?

4

1 回答 1

2

你的代码:trimPhone.split(/\d/).length - 1

坦率地说,这是找出字符串中有多少个数字字符的一种非常可怕的方法!还有许多其他方法会比这更好。

但是,更具体地说,这里的问题是您遇到了 IE8 的正则表达式引擎中的错误。

这是一个众所周知的错误:当您使用.split(),并且结果包含连续匹配且它们之间没有任何内容时,IE8 及更早版本将丢弃结果数组中的空元素。

它通常是通过尝试解析具有空值的 CSV 内容来触发的——例如,在 IE8 中split(',','x,y,,z')会给你一个包含三个元素(和)的结果,而其他浏览器也会给你一个介于和之间的空元素。xyzyz

对于 CSV 解析,有时可能很难解决问题,但您的情况要容易得多,因为您确实不需要使用这种方法。

所以在这种情况下,这里的解决方案是不使用这种方法来计算数字。

我建议将此作为替代方案,您可以尝试:

var phoneNumber = trimPhone.replace(/[^\d]/g,'').length;
于 2013-10-22T13:37:10.467 回答