JavaScriptのCookie操作に対するパッケージのまとめ

10967 ワード

Javascriptにはprvate、publicアクセス権設定のキーワードがありませんが、一定のテクニックで同じ結果をシミュレーションできます.
まず次の行のコードを見ます.
var i=(1,2,3,4,5)
変数iの最後の結果は5.
これはコンマ操作の結果、つまり最後の値を返します.括弧はこの行のコードの優先度を変えます.そうでないとvar i=1,2,3,4,5です.識別子が足りないとエラーします.
var i=(1,2,3,4,function){return 5*5;);
変数iの最後の結果は、関数であり、結果25を返します.
これはJavascriptの柔軟さであり、事前に声明する必要はなく任意のタイプを付与することができます.
i()
alert(i()
を返します.
続いて、変数iは変数の参照を取得するための変数です.つまり、数式の右側の括弧演算が終わった後に戻ってくる最後の結果の引用はまだあります.呼び出しは表示できませんが、変数の参照によって呼び出されますか?
(1,2,3,4,function(){alert(5*5)}()
上のコードが実行されたら、メッセージボックスを弾いて、25.
便宜上、前の例の関数をポップアップメッセージボックスに変更しました.
二対の小かっこ()()前のペアは結果を返します.この結果が関数である場合、第二のペアの括弧で呼び出されます.
つまり、前のペアの括弧を通して匿名関数の参照が行われ、下に引用されます.これは匿名関数の呼び出しです.
より多くの匿名関数の使用については、文末の参照接続を参照することができる.
閉パックが発生した原因は、作用域の違いにより、子作用域が親作用域の変数を引用して、子作用域に戻り、親作用域が本来なら執行完了後は廃棄されますが、子作用域が常に存在し、親作用域の引用を握っているため、保留されています.
下のコードを見てください.
 
  
function parent() {
var a = 1;
function child(){
var b = 2;
alert(a);
alert(b);
}
}
親関数parentには、親関数のa変数への参照(その値を出力)があるchild子関数が含まれています.
親関数を実行してから、その宣言のサブ関数を返します.
 
  
function parent() {
var a = 1;
function child(){
var b = 2;
alert(a);
alert(b);
}
return child;
}
var t = parent();
t();
10行では、パルト関数を実行し、関数内部で宣言された関数childを返します.このとき変数tは、リターンオブジェクト(この時は実行可能な関数です.)の参照を持っています.11行のコードの中で呼び出しました.結果はそれぞれ1と2を出力しました.
注意してください.出力2は、私たちがサブ関数の中で変数を宣言したからです.出力1は、その関数の中には変数aを定義するのではなく、親関数の変数への参照が発生しました.つまり、親のスコープの変数を参照しました.
この時点で出力が完了することができます.つまり変数aはまだ存在します.しかし、直接にそれらを参照することはできません.関数はすでに実行されましたので、その対応する引用がなくなりました.戻りのサブ関数の参照によってのみアクセスできます.
もし私が父の関数で他の変数を宣言したら?結果は同じです.サブ関数はアクセスできますが、サブ関数が対応する参照を返さないと、外部からアクセスできません.
カバンを閉じたら何ができますか?外部に勝手に修正したくない変数があったらどうすればいいですか?じゃ、クローズドを使いに行きます.
 
  
myObj = {}; // , window (window.myObj)
(function(){
var i = 4;
myObj = { // ,
getI : function() { //get ,
return i;
},
setI : function(val) { //set ,
if(val > 100) {
alert("i connt > 100");
return;
}
i = val;
}
}
})(); // , , , ,
myObj.setI(5); //
myObj.setI(101); //
alert(myObj.getI());
alert(myObj.i); // ,
これで私たちは簡単にpublicアクセス権限とprvateアクセス権限を実現しました.
ページでは、私たちは通常、document.co okie属性を使用してアクセスし、その割り当てに対して新しいCookieを作成します.一つのCookieは通常5つの属性を持っています.value(格納された値)、date(UTCフォーマットの時間は、いつ期限が切れるかを表します.domain(ドメイン、Cookieの所有者)、Path(サブディレクトリ).
通常の開発では、document.co okie属性のみを使用してアクセスすると、文字列しか与えられず、読み取り後に文字列を切断して指定変数名の値を取得することができます.document.co okie読み取りでは、指定された変数名の値はすべての割当値となります.
コードを添付します.全部Cookieグローバルオブジェクトに封入して、いくつかの方法を暴露します.
Get:すべてのクッキー文字列を指定に戻します.
Set:クッキー文字列を設定します.
Clear:すべてのクッキーオブジェクトをクリアします.
GetDayTime:今からval天を指定するDateオブジェクトを取得します.
Write:cookieを書きます.再ロードしました.コードをご参照ください.
Query:クエリクッキー.再読み込みしました.コードをご参照ください.
Update:cookieを修正します.
Delete:クッキーを削除します.
コード1-7
 
  
Cookie = {};
/*
* Date setTime 1970-01-01 , , .
* Cookie expires , expires , .
* document.cookie , expires .
*
*/
(function() {
var nDay = 24 * 60 * 60 * 1000;
var isString = function(v) {
return typeof v === "string";
}
var isArray = function(v) {
return Object.prototype.toString.apply(v) == "[object Array]";
}
var isObject = function(v) {
return v && typeof v == "object";
}
var isDate = function(v) {
return Object.prototype.toString.apply(v) == "[object Date]";
}
var getTime = function() {
return new Date().getTime();
}
var trim = function(val) {
return (val || "").replace(/^\s+|\s+$/g, "");
}
var tryEval = function(val) {
var Obj, e;
try {
Obj = eval(val);
} catch (e) {
Obj = val;
}
return Obj;
}
var ObjectToString = function(o) {
var tstr = "{";
for (var v in o) {
if (isArray(o[v])) {
tstr += v + ":" + ArrayToString(o[v]) + ",";
} else if (isObject(o[v])) {
tstr += v + ":" + ObjectToString(o[v]) + ",";
} else if (isString(o[v])) {
tstr += v + ":\"" + o[v].toString() + "\",";
} else {
tstr += v + ":" + o[v].toString() + ",";
}
}
return tstr.slice(0, -1) + "}";
}
var ArrayToString = function(o) {
var tstr = "[";
for (var v in o) {
if (isArray(o[v])) {
tstr += ArrayToString(o[v]) + ",";
} else if (isObject(o[v])) {
tstr += ObjectToString(o[v]) + ",";
} else {
tstr += o[v].toString() + ",";
}
}
return tstr.slice(0, -1) + "]"; ;
}
Cookie = {
Get: function() {
return document.cookie;
},
Set: function(val) {
document.cookie = val;
},
Clear: function() {
var temp = this.Query();
var o;
for (o in temp) {
this.Delete(o);
}
},
GetDayTime: function(val) {
var texpires = new Date();
texpires.setTime(texpires.getTime() + val * nDay);
return texpires;
},
Write: function() {
/*
* Cookie.Write(Object); , main;
* Cookie.Write(varname, Object); varname: , Object: ;
* Cookie.Write(Object, Date); Object: , Date: ;
* Cookie.Write(varname, Object, Date); varname: , Object: , Date: ;
* Cookie.Write(varname, Object, Date, Domain, Path); varname: , Object: , Date: , Domain: , Path: ;
*/
if (arguments.length == 1) {
var tvalue = arguments[0];
var tstr = "";
var texpires = new Date(); texpires.setTime(texpires.getTime() + 1 * nDay);
if (isArray(tvalue)) {
tstr = ArrayToString(tvalue);
} else if (isObject(tvalue)) {
tstr = ObjectToString(tvalue);
} else {
tstr = tvalue.toString();
}
tstr = "main=" + escape(tstr) + ";expires=" + texpires.toGMTString() + ";";
} else if (arguments.length == 2) {
var tname, tvalue, texpires, tstr = "";
if (isDate(arguments[1])) {
tname = "main";
tvalue = arguments[0];
texpires = arguments[1];
} else {
tname = arguments[0];
tvalue = arguments[1];
texpires = new Date(); texpires.setTime(texpires.getTime() + 1 * nDay);
}
if (isArray(tvalue)) {
tstr += ArrayToString(tvalue);
} else if (isObject(tvalue)) {
tstr += ObjectToString(tvalue);
} else {
tstr = tvalue.toString();
}
tstr = tname + "=" + escape(tvalue) + ";expires=" + texpires.toGMTString() + ";";
} else if (arguments.length == 3) {
var tname = arguments[0], tvalue = arguments[1], texpires = arguments[2], tstr = "";
if (isArray(tvalue)) {
tstr = ArrayToString(tvalue);
} else if (isObject(tvalue)) {
tstr = ObjectToString(tvalue);
} else {
tstr = tvalue.toString();
}
tstr = tname + "=" + escape(tvalue) + ";expires=" + texpires.toGMTString() + ";";
} else if (arguments.length == 5) {
var tname = arguments[0], tvalue = arguments[1], texpires = arguments[2], tdomain = arguments[3], tpath = arguments[4], tstr = "";
if (isArray(tvalue)) {
tstr = ArrayToString(tvalue);
} else if (isObject(tvalue)) {
tstr = ObjectToString(tvalue);
} else {
tstr = tvalue.toString();
}
tstr = tname + "=" + escape(tvalue) + ";expires=" + texpires.toGMTString() + ";domain=" + tdomain + ";path=" + tpath + ";";
}
alert(tstr);
this.Set(tstr);
},
Query: function() {
/*
* Cookie.Query(); Cookie Object;
* Cookie.Query(string); Object; undefined;
* Cookie.Query(string, Object); Object, ; undefined;
*/
var tname = tvalue = "", tright = -1;
var tstr = this.Get();
var tObj = {};
if (arguments.length == 0) {
var i = 0;
do {
tname = trim(tstr.slice(i, tstr.indexOf("=", i)));
tright = tstr.indexOf(";", i);
if (tright == -1) {
tvalue = unescape(tstr.slice(tstr.indexOf("=", i) + 1, tstr.length));
} else {
tvalue = unescape(tstr.slice(tstr.indexOf("=", i) + 1, tright));
}
tObj[tname] = tryEval(tvalue);
i = tstr.indexOf(";", i) == -1 ? -1 : tstr.indexOf(";", i) + 1;
} while (i != -1);
} else {
tname = arguments[0];
if (tstr.indexOf(tname) == -1) return undefined;
var i = tstr.indexOf(tname);
tname = trim(tstr.slice(i, tstr.indexOf("=", i)));
tright = tstr.indexOf(";", tstr.indexOf(tname)) == -1 ? tstr.length : tstr.indexOf(";", tstr.indexOf(tname));
tvalue = unescape(tstr.slice(tstr.indexOf(tname) + tname.length + 1, tright));
if (arguments.length == 1) {
tObj = tryEval(tvalue);
} else if (arguments.length == 2) {
tObj = arguments[1];
tObj[tname] = tryEval(tvalue);
}
}
return tObj;
},
Update: function() {
return this.Write.apply(this, arguments);
},
Delete: function() {
if (arguments.length == 1) {
var varname = arguments[0];
if (this.Query(varname)) {
this.Update(varname, "", new Date(1970, 01, 01));
}
}
}
}

文字列evalからオブジェクトの実行とObjectまたはArayオブジェクトから対応文字列形式の機能関数を得て、JSONの操作をシミュレーションしました.もちろん、JavaScriptオブジェクトはすべて格納できません.一部を満たすだけで十分です.
個人的な理解は限られていますので、よろしくお願いします.
Javascriptの匿名関数:
http://dancewithnet.com/2008/05/07/javascript-anonymous-function/
Javascriptのクローズド:
http://www.cn-cuckoo.com/wordpress/wp-content/uploads/2007/08/JavaScriptClosures.html
Cookieファイルのフォーマット:
http://www.cnblogs.com/sephil/archive/2008/05/06/cookiefmt.html