3

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

このバグは、Chrome の新しいバージョンでのみ発生します。Chrome バージョン 29.0.1547.57 を搭載した Mac および Chrome バージョン 29.0.1547.62 m を搭載した Windows でテスト済みです。

上記のスクリプトは非常に単純です。コードは次のとおりです。

<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 関数とその関数の呼び出しです。new Date()関数では、javascriptコンストラクターから返された値をログに記録しています(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 からのスクリプトが、それを呼び出す元のスクリプトにどのように影響するかを理解していません。どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

3

Date()特定のコンテキストでは、Chrome はコンストラクターをキャッシュします。次のバグ レポートに示されているように、これは 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/

于 2013-08-30T20:51:57.373 に答える