あくまでも「こういうやり方もあります」程度に…


■cookie取得

function startSetting(obj) {
  var getEnvs = function GetEnvs(line, E, A, o) { //ローカル関数の定義
    if (line && line.split) {
      var ary = line.split(A); //文字列lineを引数Aで区切って配列にする
      var i, a, e, v;
      for (i = 0; i < ary.length ; i++) { //配列の数だけ
        a = ary[i]; //対象となるキーと値のセット
        e = a.indexOf(E); //引数Eの位置(キーと値の区切り)
        v = a.substring(e +E.length); //値の部分を抜き出し
        o[a.substring(0, e)] = v == 0 ? 0 : v; //キー名をプロパティ名として抜き出し、値をオブジェクトに格納
                             (値はすべて文字列扱いなので、0の時は数値にしておかないと false として使えない)
      }
    }
    return o; //プロパティを格納したオブジェクトを返す
  }

  obj = navigator.cookieEnabled ? getEnvs(unescape(document.cookie), "=", "; ", obj) : obj; //cookie取得
  obj = getEnvs(top.name, "EQL", "AND", obj); //ウィンドウネーム取得
  obj = getEnvs(location.search.substring(1), "=", ";", obj); //location.search取得

  return obj; //すべてのキーをプロパティとして格納したオブジェクトを返す
}
var envs = startSetting(new Object()); //オブジェクトを作って処理開始

■cookie書込

function setCookie() {
  var nce = navigator.cookieEnabled; //cookieが使用可能になっているか
  if (nce) {
    //cookieがない時は、作成の許可を求めるダイアログを表示
    if (!document.cookie && !confirm("cookieはまだ作られていません。作っちゃっていいですか?")) {
      alert("cookieの作成を中止しました\n設定は保存されません");
      return false; //キャンセルした場合は作らない
    }

    //一致させるパスの指定(ドメインごとに指定)
    var dir = "path=", dd = document.domain;
    if (dd == "www.globetown.net") //ドメイン名
      dir += "/~piroaki/"; //cookieへのアクセスを許可させるパス
    else
      dir = "";

    //有効期限の設定(2ヵ月有効)
    var ex = new Date();
    ex.setTime(60 *24 *60 *60 *1000 +ex.getTime());
    dir += "expires=" + ex.toGMTString();

    for (var i = 0; i < arguments.length; i++) //引数の数だけ
      document.cookie = arguments[i] + "=" + escape(arguments[++i]) + "; " + dir; //iを足しながら記録
    return true;

  } else { //cookieが使用不可、または navigator.cookieEnabled 非対応ブラウザの場合
    alert(nce == false ? "cookieの設定がOFFになっています" : "ブラウザが適合しないので保存しませんでした");
    return false;
  }
}

■おまけ…というか付属関数

function setName(n, v) { //ウィンドウネームへ値の書込
  var d = document;
  if (d.all || d.getElementById || d.layers) {
    clearName(n); //cookieと違って同じキーが重複できるので、削除を試みる
    top.name += n + "EQL" + v + "AND";  //書込
  }
}


function clearName(n) { //ウィンドウネームから値の削除
  var d = document;
  if (envs[n] == undefined || (!d.all && !d.getElementById && !d.layers)) //キーがない?または非対応ブラウザ?
    return;
  var i, rezult = "", nameAry = top.name.split("AND"); //ウィンドウネームを"AND"で区切って配列を作成
  for (i = 0; i < nameAry.length; i++) { //配列の数だけ
    if (nameAry[i].substring(0, nameAry[i].indexOf("EQL")) == n || !nameAry[i])
      continue; //検索中のキー名が渡された引数と同じ、またはキー名の値がfalse(と等価)だったら飛ばす
    rezult += nameAry[i] + "AND"; //違う時のみ結果に追加
  }
  top.name = rezult; //ウィンドウネームを新しいものに書き換え
}

おそまつさま

2002.9.9.Mon
ぴろあき
- Mail