外部iframe导致javascript Date()出现故障

时间:2013-08-30 20:01:44

标签: javascript google-chrome iframe

http://jsfiddle.net/bcg47/3/

此错误仅发生在新版Chrome中。它已在Mac上使用Chrome版本29.0.1547.57进行测试,在Windows上使用Chrome版本29.0.1547.62 m进行了测试。

上面的脚本非常简单。这是代码:

<script>
function displayDate() {
  console.log('date1', new Date('2013-08-30T14:06:56-04:00'))
  setTimeout(function() { displayDate(); }, 1000);
}

displayDate();
</script>
<iframe src="http://jsfiddle.net/wzqgN/2/" width="100%" height="300"></iframe>

加载的第一件事是javascript函数和对该函数的调用。在函数中,我记录了从javascript new Date()构造函数返回的值(通过8月30日)。很简单,正如您在控制台中看到的,这是第一次工作。加载iframe时会出现此问题。 iframe的src为http://jsfiddle.net/wzqgN/2/。在这个iframe jsfiddle中也没有什么特别之处。它具有以下代码:

TargetDate = "12/31/2020 5:00 AM";
var dthen = new Date(TargetDate);

正如您在控制台中看到的那样,第一行输出是:

date1 Fri Aug 30 2013 14:06:56 GMT-0400 (EDT) 

但是只要加载iframe并调用另一个new Date(),输出就会变为:

date1 Thu Dec 31 2020 05:00:00 GMT-0500 (EST) 

我不确定这里发生了什么。我最初的想法是,这是一个浏览器错误,但我想在这里要求确认。在我使用的脚本中,iframe实际上设置为与运行代码的域不同的域。这就是让我更加想知道到底发生了什么的原因。我不理解来自iframe的脚本(更不用说跨域脚本)如何影响调用它的原始脚本。任何帮助是极大的赞赏。感谢。

1 个答案:

答案 0 :(得分:3)

在某些情况下,Chrome会缓存Date()个构建器。这是Chrome中最近出现的错误,如以下错误报告所示:

https://code.google.com/p/chromium/issues/detail?id=280531

此错误报告提供了详细说明同一问题的代码示例 - 在同一域下的窗口之间切换时缓存的Date()构造函数。在您的情况下,<iframe>正在创建一个新窗口上下文并触发相同的错误。

作为一种变通方法,您可以使用Date.parse()setTime()来绕过Chrome的内部Date构造函数缓存。

var date1 = new Date();
var timestamp = Date.parse('2013-08-30T14:06:56-04:00');
date1.setTime(timestamp);

http://jsfiddle.net/bcg47/4/