js封装Cookie库
在采用正则表达式匹配时出现匹配出现但是为false的情况:
解决:
正则匹配全局后 lastIndex
会加1,下一次匹配会变成从第二位开始,而你test里面只有1位,所以匹配失败,匹配失败后lastIndex
会变成0,再下一次匹配从第一位开始,匹配成功.....
要么去掉/g
,要么手动把reg.lastIndex=0
没有进行encodeURIComponent遇到=出现解析不全问题
解决:
采用正则表达式new RegExp(_name + "=([^;]*)(;|$)")
动态去匹配值信息,保证数据的完整性。最后一定要用()
的方式进行或
运算,否则会出现问题。
(function (root, factory) {
// 处理模块化开发
if (typeof define === "function" && define.amd) {
define([], factory);
} else if (typeof exports === "object") {
module.exports = factory();
} else {
root.pageUtils = factory();
}
})(this, function () {
var owner = {};
function isRegExp(obj) {
return Object.prototype.toString.call(obj) == "[object RegExp]";
}
function getCookieReg(_name) {
return new RegExp(_name + "=([^;]*)(;|$)");
}
/**
* 获取指定名称的Cookie值
* @param {Object} _name
*/
owner.getCookie = function (_name) {
var info = document.cookie;
var cookieArr = info.split("; ");
for (var i = 0, l = cookieArr.length; i < l; i++) {
var valueArr = cookieArr[i].split("=");
if (valueArr[0] && valueArr[0] == _name) {
var cookieResults = document.cookie.match(getCookieReg(_name));
if (cookieResults.length > 1) {
try {
return JSON.parse(decodeURIComponent(cookieResults[1])).value || JSON.parse(decodeURIComponent(cookieResults[1]));
} catch (err) {
return decodeURIComponent(cookieResults[1]);
}
} else {
return '';
}
}
}
}
/**
* 获取指定名称的Cookie值
* @param {Object} _name
*/
owner.getCookieObj = function () {
var obj = {};
var info = document.cookie;
var cookieArr = info.split("; ");
for (var i = 0, l = cookieArr.length; i < l; i++) {
var valueArr = cookieArr[i].split("=");
if (valueArr[0]) {
var cookieResults = document.cookie.match(getCookieReg(valueArr[0]));
if (cookieResults.length > 1) {
try {
obj[valueArr[0]] = JSON.parse(decodeURIComponent(cookieResults[1])).value || JSON.parse(decodeURIComponent(cookieResults[1]));
} catch (err) {
obj[valueArr[0]] = decodeURIComponent(cookieResults[1]);
}
} else {
obj[valueArr[0]] = '';
}
}
}
return obj;
}
/**
* 设置Cookie信息
* @param {String} _key
* @param {String} _value
* @param {Numer} _expires 单位秒
* @param {String} _path
* @param {Boolean} isJsonWarp 是否用json包裹
*/
owner.setCookie = function (_key, _value, _expires, _path, isJsonWarp) {
_key = _key || "";
_value = _value || "";
isJsonWarp = isJsonWarp || false;
var result = "";
if (!_key) {
return;
}
if (typeof _expires === 'boolean') {
isJsonWarp = _expires;
} else if (typeof _path === 'boolean') {
isJsonWarp = _path;
}
if (isJsonWarp) {
var jsonObj = {
"value": _value
};
result = _key + "=" + encodeURIComponent(JSON.stringify(jsonObj)) + ";";
} else {
result = _key + "=" + encodeURIComponent(_value) + ";";
}
// 获取过期时间
if (typeof (_expires) == "number") {
// 表示设置为expires的值
// 设置过期时间
var d = new Date();
d.setDate(d.getDate() + _expires);
result += "expires=" + d + ";" + "path=" + _path;
} else if (typeof (_expires) == "string") {
result += "path=" + _expires;
}
document.cookie = result;
}
/**
* 移除指定Cookie信息
* @param {Object} _name
*/
owner.removeCookie = function (_name) {
this.setCookie(_name, "", -1);
}
/**
* 获取开头为指定名称的Cookie信息
* @param {Object} _name 传入的字符串或者是RegExp
* @param {Object} callback
*/
owner.getCookies = function (_name, callback) {
var info = document.cookie;
var cookieArr = info.split("; ");
var l = cookieArr.length;
var getInfoArr = [];
var regInfo = null;
if (l > 0) {
if (isRegExp(_name)) {
regInfo = _name;
} else {
regInfo = eval("/" + _name + "/g");
}
for (var i = 0; i < l; i++) {
var valueArr = cookieArr[i].split("=");
var key = valueArr[0];
if (regInfo.test(key)) {
regInfo.lastIndex = 0;
// 正则匹配全局后 lastIndex会加1,下一次匹配会变成从第二位开始,而你test里面只有1位,所以匹配失败,匹配失败后lastIndex会变成0,再下一次匹配从第一位开始,匹配成功.....
// 要么去掉/g,要么手动把reg.lastIndex=0
var value = null;
var cookieResults = document.cookie.match(getCookieReg(key));
if (cookieResults.length > 1) {
try {
value = JSON.parse(decodeURIComponent(cookieResults[1])).value || JSON.parse(decodeURIComponent(cookieResults[1]));
} catch (err) {
value = decodeURIComponent(cookieResults[1]);
}
} else {
value = '';
}
getInfoArr.push([key, value]);
if (callback) {
callback(key, value);
}
}
}
}
return getInfoArr;
}
return owner;
});