Internet Explorer匹配()无法正常工作

时间:2016-10-18 10:49:11

标签: javascript regex knockout.js

我在IE上有一个非常奇怪的错误。 我正在使用淘汰赛自定义验证。我的一个自定义验证是验证日期。

功能:

function isValidDate(txtDate) {
    var currVal = txtDate;
    if (currVal == '' || currVal == null)
        return false;

    //Declare Regex  
    var rxDatePattern = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
    var dtArray = currVal.match(rxDatePattern); // is format OK?

    if (dtArray == null)
        return false;
    /*continue of logic*/
}

当我第一次运行时,这很有用。但后来我重定向到服务器并返回到同一页面。

此时再次调用验证问题就开始了。

我有两个内存快照。他们看起来和我一模一样。但是我必须看到一些不同之处,或者匹配方法在某种程度上被打破了。

差异不是dtArray == null这就是问题所在。您可以尝试在控制台中运行它。它正确地解析了dtArray ......

两个快照都在同一行(if(dtArray == null))

beforeRedirect: enter image description here

afterRedirect: enter image description here

更新。我解决了我的问题。

问题是我正在设置我的可观察属性:

var date = "1990-01-01T00:00:00";
var dob = new Date(date).toLocaleDateString();
masterModel.Dob(dob);

当我这样做时,现在匹配正常:

var date = "1990-01-01T00:00:00"
var dob = new Date(date);
var dobstring = dob.getDate() + "/" + (dob.getMonth()+1) + "/" + dob.getFullYear();
masterModel.Dob(dobstring);

如果你想看到差异在控制台上的IE上运行。我的IE版本是11.0.9600

//because I am in UK my locale string is dd/MM/yyyy if you get different one this problem won't work for you!
var date = "1990-01-01T00:00:00"
var dob = new Date(date).toLocaleDateString();
var rxDatePattern = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
console.log(dob);
console.log(dob.match(rxDatePattern));

//vs

var date = "1990-01-01T00:00:00"
var dob = new Date(date);
var dobstring = dob.getDate() + "/" + (dob.getMonth()+1) + "/" + dob.getFullYear();
var rxDatePattern = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
console.log(dobstring);
console.log(dobstring.match(rxDatePattern));

1 个答案:

答案 0 :(得分:2)

尝试简单地检查虚假值。空字符串,null和undefined都是假的,没有必要比这里更具体。

function isValidDate(txtDate) {
    if (!txtDate) return false;

    var rxDatePattern = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
    var dtArray = currVal.match(rxDatePattern);

    if (!dtArray) return false;

    /*continue of logic*/
}

话虽如此,我强烈建议您使用日期库(最突出的是:moment.js)来进行任何日期解析,计算和验证工作。当编写一个功能齐全且经过适当测试的库时,请不要使用自己的正则表达式。

进一步思考,通过淘汰赛,将实际日期对象存储在一个observable中会更容易,因此根本不需要解析任何日期字符串。您也可以将其格式化以便以任何方式在屏幕上显示,而不是将您自己/用户限制为单一格式。

这样您根本不需要进行任何日期格式验证。可观察者包含日期 - 或者不包含日期。为了获得最佳效果,请将其与日期选择器小部件一起使用(例如knockout-jqueryui中的那个)。

查看型号:

this.exampleDate = ko.observable();

查看,假设jQueryUI + knockout-jqueryui:

<input type="text" data-bind="datepicker: {
    dateFormat: 'dd.mm.yyyy'
}, value: exampleDate" />