2013-08-30 27 views
3

http://jsfiddle.net/bcg47/3/外部iframe導致javascript日期()發生故障

此錯誤只發生在新版本的Chrome中。它已在Chrome 29.0.1547.57版本的Mac和Windows版本29.0.1547.62版本的Chrome上進行了測試。

上面的腳本非常簡單。這裏是代碼:

<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中的腳本,更不用說跨域腳本,它可以影響調用它的原始腳本。任何幫助是極大的讚賞。謝謝。

回答

3

在某些情況下,Chrome會緩存Date()的構造函數。這是在Chrome中最新的錯誤,如圖以下錯誤報告:

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

此錯誤報告提供一個代碼示例,詳細說明了同樣的問題 - 相同的域下的窗口之間進行切換時,當緩存Date()構造函數。在你的情況下,正在創建一個新的窗口上下文並觸發相同的錯誤。

作爲解決方法,您可以使用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/