◆ はじめに
クッキーは、ページ内の既存のデータやフォーム入力データ等をクライアント側(ブラウザを起動する側)のハードディスク内に記録する機能とその記録したデータをいいます。
JavaScriptには、cookieプロパティがありますが、登録と参照でフォーマットが違い、また、複数の設定クッキーをこの一つのプロパティで間に合わせているので、結構、扱いにくいプロパティになっています。
そこで、扱いやすくするために、このプロパティをオブジェクトで包んで使いやすくしてみましょう。
◆ そもそもクッキーとは?
少量のブラウザ内のデータをハードディスク内に記録するもので、記録してどうするかというと、以下の感じに使用します。
- 掲示板やゲストブックで入力した名前やURL等を記録しておき、次回訪問のデフォルトにする。
- ページ遷移時、遷移後のページにデータを引き渡す時などに利用する。
- 訪問者がそのページに何回訪れたか記録して教えてあげるとか。
尚、通常のブラウザは、Cookie を受け付けるか受け付けないかの設定を以下のメニューで行うことが可能です。
| ブラウザ | メニュー |
|---|---|
| IE6.x | [ツール]→[インターネットオプション]→[プライバシー] |
| IE5.x | [ツール]→[インターネットオプション]→[セキュリティ]→[レベルのカスタマイズ]→[Cookie] |
| NS6.x | [編集]→[設定]→[プライバシーとセキュリティ]→[Cookie] |
| NS4.x | [編集]→[設定]→[詳細]→[Cookie] |
◆ クッキーの登録
document.cookie = "NAME=値; expires=値; domain=値; path=値; secure";
NAME=値; 以外は省略可能です。
- NAME=値
任意の名前に任意な値を指定します。セミコロン(;)、カンマ(,)、空白文字( )や日本語を使用する際にはURLエンコードが必要です。 - expires=値
クライアント側のディスクに記録されるCookieの有効期限を次のようなフォーマットで指定します。Fri, 14-Dec-2001 23:59:59 GMT
- path=値
path省略時のクッキー値は、クッキーを生成したWebページ、同じディレクトリ内のWebページ、同じディレクトリ内のサブディレクトリ内のWebページで参照が可能です。
尚、パスの値を設定(path=値)すれば、それが、上記のようになります。 - domain=値
domain省略時のクッキー値は、クッキーを生成したWebページのホストのみ参照が可能です。
尚、ドメインの値を設定(domain=値)すれば、複数のサーバから参照ができます。ただし、自分のサーバーのドメイン以外は設定できません。 - secure
secureを記述しなければ、クッキーの安全性が保証されていず(普通の場合です)、secureを記述すれば、httpsにてクッキー値が参照可能になるみたいです。
◆ クッキーの参照
alert(document.cookie); NAME=値;NAME=値;NAME=値;・・・の形式になる。
上記のように、domainとpathの条件にあった、すべてのクッキーの"NAME=値"がdocument.cookieへ設定されます。
◆ クッキーオブジェクトサンプル
まぁ、上記のように「登録」も「参照」も、結構扱いにくい訳です。 そこで、「登録」は、NAME、値、保存日数のみの引数にして、日付の計算やクッキーフォーマット整形などはオブジェクトにまかせます。 また、「参照」の複数の「NAME=値」は、NAMEをオブジェクトの新たなプロパティとして追加して、対応する値をセットし、簡単にNAMEでクッキー値を参照できるようにします。
実は、前回紹介した、JCookie()は、このようなことを実現させています。ただ、一つだけ問題点があります。それは、CookieのNAMEの値は、=や;などの特殊記号や日本語文字はURLエンコードして書き込みをしなければなりませんが、その処理がありません。ですので、ちょっと改造して、新たなオブジェクト名(クラス名)をNJCookie()としました。
尚、URLエンコードは、escape関数で、デコードは、unescape関数を利用します。
function NJCookie(){
NJCookie.data = new Array(); // (1)
NJCookie.string = (document.cookie) ? document.cookie.split(';') : new Array();// (2)
for(var i = 0; i != NJCookie.string.length; i++) { // (3)
NJCookie.data[NJCookie.string[i].split('=')[0].match(/[^ ].*/)]
= unescape(NJCookie.string[i].split('=')[1]); //(4)
}
NJCookie.put = function(name ,data ,limit) { //(5)
var date = ''; //(6)
if (limit) { //(7)
today = new Date(); //(8)
today.setTime(today.getTime()+1000*60*60*24*limit); //(9)
date = ';expires='+today.toGMTString(); //(10)
}
document.cookie = name+'='+escape(data)+date; //(11)
}
}
new NJCookie(); //(12)
実行
解説
- (1)は、NJCookie.dataを配列オブジェクトにしています。
- (2)は、クッキーがすでに設定されている時は、
;を目印に「NAME=値;NAME=値」を「NAME=値」に分解し、それぞれを配列オブジェクトへ書き込み。設定されていない時は、NJCookie.stringを配列オブジェクトにしています。 - (3)for文で、配列に書き込んだクッキー値を配列毎に処理します。
- (4)NJCookie.data[インデックス]のインデックスへNAMEを切り出してセットし、ハッシュインデックス(新たなプロパティ)にしています。値の方は、unescapeしたあとそこへ格納しています。
あと、match(/[^ ].*/)は、NAMEの文字列が、スペース以外で始まり、任意の一文字の0個以上連続を抜き出しています。 - (5)クッキー登録メソッドの定義です。
- (6)date文字列オブジェクトの初期化。
- (7)保存日数はパラメータで指定されていたか。
- (8)現時間のオブジェクトを作成。
- (9)保存日数をミリ秒にして、保存日までの時間を設定します。
- (10)expires=有効期限を設定します。
- (11)NAMEとescapeした値と有効期限をdocument.cookieへ書き込みます
- (12)NJCookieオブジェクトをインスタンス化、ただし、インスタンス変数はありません。
使用方法
まずは、ソースをカット&ペーストし、ご自分のプログラムに組み込んでください。使い方以下の通りで、登録メソッドと参照プロパティの2つです。
- クッキー登録
NJCookie.put(NAME,値,保存日数);
- クッキー参照
var atai = NJCookie.data.NAME;
- 尚、NAMEは、すでにクッキー登録してある名前です。
補足
クッキー登録には制限があります。
- サイズは全体で4KBまで。 (このサイズを超えた場合は古いものから削除)
- 書き込むことができる総エントリー数は300まで。
- ドメイン名は最大20まで。
◆ おわりに
尚、本スクリプトの公開は、オリジナル作成者 Piro氏の許可を頂いております。ここに謹んでお礼申し上げます。
正確には、スタイルシート切り替え(オブジェクト指向)の時です。(^^;
- outsider reflex(SSS.jsの本家です。)
- Virgo 優乃氏のサイト(SSS.jsをオブジェクト指向に書き換え)