我在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*/
}


第一次运行时,效果很好。但是然后我将重定向到服务器并返回到同一页面。

然后在问题开始时再次调用验证。

我有两个内存快照。他们看起来和我一样。但是必须存在一些我看不到的差异,否则match方法会以某种方式被破坏。

区别在于不是dtArray == null。您可以尝试在控制台中运行它。并正确解析dtArray。

两个快照都在同一行上(如果(dtArray == null))

beforeRedirect:
javascript - Internet Explorer match()无法正常工作-LMLPHP

afterRedirect:
javascript - Internet Explorer match()无法正常工作-LMLPHP

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

问题是我正在设置我的可观察属性,如下所示:

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));

最佳答案

尝试简单地检查虚假值。空字符串,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)来执行任何日期解析,-calculation和-validation工作。编写功能齐全且经过正确测试的库后,请不要发布自己的正则表达式。



再想一想,通过剔除,将实际的日期对象存储在可观察对象中要容易得多,因此根本不需要解析任何日期字符串。您还可以设置其格式以使其在屏幕上显示,而不用将自己/用户限制为单一格式。

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

查看模型:

this.exampleDate = ko.observable();


假设使用jQueryUI +敲除jqueryui,则查看:

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

08-20 00:36