Javascript操纵Cookie
在客户端使用Javascript操纵Cookie存在很多的不便之处,例如在读取Cookie的时候,只能通过手动解析document.cookie字符串得到指定cookie的值,不能得到其他任何信息,如设置的主机,路径以及过期时间等。
/** * 查询指定名称的Cookie值 * @note 需要注意有可能出现同名cookie的问题 * @param {Object} key * @param {Object} 设置当读取不到key时返回的默认值 * @return {String} 返回读取到的Cookie的值, * 如果读取不到相应的Cookie,则判断defValue是否有效,有效则返回defValue,否则返回null */ function getCookie(key,defValue){ var cookie,value; if(!key){ return null; } cookie = document.cookie; // 所有cookie的key都小写化处理 key = key.toLowerCase(); value = find(cookie,key+"=",";",null,false,null); return value === null ? defValue : unescape(value); } /** * 设置cookie * @param {String} key * @param {String} value * @param {Number} expires 单位为秒 * @param {String} path 路径 * @param {String} domain 主机 * @param {Boolean} secure 安全级别 */ function setCookie(key, value, expires, path,domain,secure){ // key无效则不做任何操作 if(!key){ return; } // 所有cookie的key都小写化处理 key = key.toLowerCase(); key = key + '=' + escape(value) + ";"; expires = expires ? ("expires=" + new Date(new Date().getTime() + expires * 1000).toGMTString()) + ";" : ""; path = !!path ? "path=" + path + ";" : "path=/;"; domain = domain ? ("domain=" + domain) + ";" : ""; secure = secure ? "secure=true;" : ""; document.cookie =[key,expires,path,domain,secure].join(""); } /** * 删除指定Cookie * @param {Object} key * @param {Object} path * @param {Object} domain */ function delCookie(key,path,domain){ // 超时设置为过去的时间,cookie会立即失效 key = key.toLowerCase(); setCookie(key,"",-1000,path,domain); } /** * 从字符串中获取夹在指定前缀和后缀之间的值 * @example * userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.0.2) Gecko/2008082714 Firefox/3.0.2" * * prefix="windows nt" * suffix=";" * find(userAgent,prefix,suffix) returns " 5.2"; * @param {Object} str 源字符串 * @param {Object} prefix 前缀 * @param {Object} suffix 结束符,若不指定,则匹配到字符串结尾;如果指定了,但是匹配不到,则同样匹配到字符串结尾。 * @param {Boolean} matchFirstOnly 是否找到第一个匹配项,设置为false则查找最后一个匹配项,默认为false * @param {Boolean} ignoreCase 忽略大小写来查找,默认值为true * @param {Boolean} trimBlank 是否删除值首尾的空白符,默认值为true * @return {String} 查找到的字符串,若找不到则返回null */ function find(str,prefix,suffix,matchFirstOnly,ignoreCase,trimBlank){ var start,end,middle,value=null; matchFirstOnly = (matchFirstOnly === true); ignoreCase = (ignoreCase !== false); trimBlank = (trimBlank !== false); // 如果忽略默认值 if(ignoreCase){ str = str.toLowerCase(); prefix = prefix.toLowerCase(); suffix = suffix && suffix.toLowerCase(); } if(matchFirstOnly){ start = str.indexOf(prefix); }else{ start = str.lastIndexOf(prefix); } if (start > -1) { // 如果没有指定后缀,则直接匹配到字符串结尾 middle = start + prefix.length; if (!suffix) { value = str.substring(middle); } else { end = str.indexOf(suffix, middle); if (end > -1) { value = str.substring(middle, end); } else { value = str.substring(middle); } } if(trimBlank){ value = value.replace(/^\s*(.*?)\s*$/, '$1'); } } return value; }(责任编辑:ken)