愛と勇気と缶ビール

ふしぎとぼくらはなにをしたらよいか

IE8におけるreadyStateとstatusのおいしい関係

ちょっと若気の至りでこんなコード書いてた。

if ( xobj.readyState === 2 && xobj.status === 401 ) {
  // hogehoge
}

このコード、IE8だと「エラーを特定できません」とか言って怒られる(特定しろよ!ハゲ!)。readyState === 2のところをreadyState === 4にすると大丈夫。というか普通readyState === 2のときにxobj.statusなんて調べないですよね。ちゃんとreadyState === 4まで待つべきだという。

XmlHttpRequestで、厳密にいつの時点でstatus codeが確定するかは把握してなかった。MSDNには、readyState = 2 なるタイミングについて

"The send method has been called. No data is available yet. "
http://msdn.microsoft.com/en-us/library/ms534361(v=VS.85).aspx

と書いてあるので、ちゃんとエラーを出すのがこの場合は正しいような気もする(しかし、dataというのがresponse bodyのことなのか、それともresponse codeを含めた全てを"data"といっているのか 2010/11/03)。といっても、他のブラウザでも同様の定義になっているかどうかは知らんけども。(あとで読む)

2010/11/03追記

MDCにはreadyState = 2について、

send() has been called, and headers and status are available.

と書いてあるので、FirefoxではreadyState === 2の時点でstatusが取れるのはどうやら正しい挙動だと思われる。