JavaScriptのクッキーはString型であり、ただの文字列です。よってこれを処理する専用のメソッドは存在しないため、文字列を処理するメソッドを使用して読み書きします。
HTMLDocumentのクッキープロパティとして実装されているため、document.cookieでアクセスできます。
クッキーを書き込むには、次の形式でdocumentのcookieプロパティに設定します。
名前=値
具体的には次のようにします。複数の項目を書き込むには、くり返しcookieプロパティに設定します。
document.cookie = 'data1=123'; document.cookie = 'data2=abc';
このように書き込んだクッキーは、次にように格納されます。
data1=123; data2=abc
| 制限事項 | 内容 |
|---|---|
| ブラウザが保持できる数 | 300個以下 |
| ブラウザが保持できるサーバごとの数 | 20個以下 |
| 1つのクッキー (名前と値を含む) のデータ量 | 4KB以下 |
クッキーの値にはセミコロン ( ; )、カンマ ( , ) や空白 ( ) を含めてはならないため、値はencodeURIComponent()でエンコードするのが安全です。
document.cookie = 'data=' + encodeURIComponent( data );
クッキーに有効範囲や寿命を設定するには、属性を付加します。
| 分類 | 属性 | 説明 |
|---|---|---|
| 有効範囲 | path | クッキーが有効なパス |
| domain | クッキーが有効なドメイン | |
| 寿命 | max-age | クッキーの有効期限 (秒数で指定) |
| expires | クッキーの有効期限 (日時で指定) [非推奨] | |
| セキュリティ | secure | https接続でのみクッキーを使用するかどうか |
有効期限を明示しない場合、そのクッキーはブラウザを終了すると削除されます。この期限を制御するには、max-age属性を設定します。
名前=値; max-age=秒数
max-age属性が有効ではない場合は、expires属性を使用します。例えば有効期限を1日とするには、次のようにします。
var expire = new Date(); expire.setTime( expire.getTime() + 3600 * 24 ); document.cookie = 'data=123; expires=' + expire.toUTCString();
複数のクッキーを書き込んだ場合、それらはすべて1つの文字列として連結した状態で取得されます。よってそれらを分割する処理が必要になります。
function GetCookie( name )
{
var result = null;
var cookieName = name + '=';
var allcookies = document.cookie;
var position = allcookies.indexOf( cookieName );
if( position != -1 )
{
var startIndex = position + cookieName.length;
var endIndex = allcookies.indexOf( ';', startIndex );
if( endIndex == -1 )
{
endIndex = allcookies.length;
}
result = decodeURIComponent(
allcookies.substring( startIndex, endIndex ) );
}
return result;
}
クッキーの名前をキーとした連想配列で、すべてのクッキーを返します。
function GetCookies()
{
var result = new Array();
var allcookies = document.cookie;
if( allcookies != '' )
{
var cookies = allcookies.split( ';' );
for( var i = 0; i < cookies.length; i++ )
{
var cookie = cookies[ i ].split( '=' );
// クッキーの名前をキーとして 配列に追加する
result[ cookie[ 0 ] ] = decodeURIComponent( cookie[ 1 ] );
}
}
return result;
}
なお、この処理はURLのクエリを分割する方法と基本的に同一です。