[JavaScript + Cookie] 空文字を使うときのブラウザ間差異

[JavaScript + Cookie] 空文字を使うときのブラウザ間差異

最近JavaScript + Cookieの検索ワードでこのブログにアクセスしてくれる人が多いので、JavaScript + Cookieについてもう少し勉強しなおしてみようと思った。

実は、前々から

document.cookie = 'foo';

と書いたときの動作が未検証だったので、さっそくコードを書いて動作を見てみることにした。

書いたコード

書いたコードは↓の通りの単純なもの。

document.cookie = 'foo';
document.cookie = 'bar=';
document.cookie = '=baz';

document.writeln(document.cookie);

結果

動かしてみたブラウザは手元にあったIE6, Firefox2, Opera9, Safari3betaの4つ。

IE
baz; bar
Firefox
baz; bar=
Opera
foo=; bar=
Safari
=baz; bar=; foo=

全部違う…orz ありえねぇ…orz

解説

document.cookie = 'foo';

というコードを実行したときに、IEとFirefoxは

(空文字)=foo

として解釈して、名前が空文字で内容がfooのCookieとして解釈します。従って、

(空文字)=baz

として解釈される

document.cookie = '=baz';

によって上書きされるようですね。IEの場合、内容が空文字のCookieの場合はイコール記号(=)が省略される仕様のようです。

一方のOperaとSafariは、

foo=(空文字)

として解釈されるようです。だから、document.cookieを再生したときにfoo=;という部分がありますね。Operaの場合、空文字を名前とする=bazのようなCookieは無視されるようです。

まとめ

JavaScriptで検証しただけで、Set-Cookieヘッダを使ったときも同じになるのかはわからないけど、名前が空文字になるCookieは互換性問題を引き起こすので使わないほうが無難かも。

ってか、

IEの動作はどう考えても糞。内容が空文字のときにイコール記号を省略してしまうせいで、'foo=''=foo'の区別がつかない。

内容が空文字のCookieは、スクリプト言語ではそのままfalseとして判断してくれるから便利だけど、ブラウザの互換性を考えるとあまり使わないほうがいいのかな?

スポンサーサイト



関連記事

トラックバック URL

http://liosk.blog103.fc2.com/tb.php/76-1f560bd5

トラックバック

コメント

コメントの投稿

お名前
コメント
編集キー