Moment.js日期无效 - 但仅限于DOM

时间:2015-10-06 05:33:01

标签: javascript momentjs

使用Moment.js,对于2015-10-05T22:10:00-05:00这样的日期字符串,我在浏览器DOM中得到Invalid dateGMT。但是如果我在控制台中逐行运行下面的脚本,它会呈现日期没有问题。

var elements = [].slice.call(document.querySelectorAll("a.date_due"));
elements.forEach(function(element) {
    var timeDisplay = moment(element.text).local();
    var zone = timeDisplay.format("ZZ");
    zone = zone == "-0500" ? zone = "CST" : zone = "GMT";
    element.textContent = timeDisplay
                          .format("MMM Do YYYY, ddd, h:mm:ss a ")
                          + zone;
});

更新:问题是元素中的空格。 var requestDate = element.textContent.replace(/\s+/g, ''));是解决方法。

1 个答案:

答案 0 :(得分:1)

我怀疑你的意思是这句话:

var timeDisplay = moment(element.text).local();

使用textContent而不是text

var timeDisplay = moment(element.textContent).local();

另外,请注意并非所有浏览器都支持textContent;有些人使用innerText代替(虽然略有不同,但可能与你正在做的事情相似)。

如果您打算在脚本的早期使用这些属性,您可能需要确定要使用哪些属性,并记住:

var textPropName = 'textContent' in document.createElement('div') ? 'textContent' : 'innerText';

......然后:

var elements = [].slice.call(document.querySelectorAll("a.date_due"));
elements.forEach(function(element) {
    var timeDisplay = moment(element[textPropName]).local();
    var zone = timeDisplay.format("ZZ");
    zone = zone == "-0500" ? zone = "CST" : zone = "GMT";
    element[textPropName] = timeDisplay
                          .format("MMM Do YYYY, ddd, h:mm:ss a ")
                          + zone;
});

关于转换querySelectorAll的返回值并使用forEach:正如RobG指出的那样,IE8及更早版本(我们很多人仍然需要担心)会失败,因为A)你可以在IE8上使用slice和主机提供的对象一样使用forEach,并且除非你填充它,否则IE8没有forEach。它也在不必要地创建对象。

不要创建不必要的数组,而是直接使用Array.prototype.forEach.call( document.querySelectorAll("a.date_due"), function(element) { var timeDisplay = moment(element[textPropName]).local(); var zone = timeDisplay.format("ZZ"); zone = zone == "-0500" ? zone = "CST" : zone = "GMT"; element[textPropName] = timeDisplay .format("MMM Do YYYY, ddd, h:mm:ss a ") + zone; }); (如果浏览器没有,则填充它):

forEach

这样可行(如果你小心<object>),因为浏览器的本机支持没有被破坏,或者你正在使用垫片。