使用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, ''));
是解决方法。
答案 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>
),因为浏览器的本机支持没有被破坏,或者你正在使用垫片。