我在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:
afterRedirect:
更新。我解决了我的问题。
问题是我正在设置我的可观察属性,如下所示:
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" />