document.cookie.indexOf

本文详细解析了JavaScript中通过document.cookie获取特定cookie值的过程,并提供了一种更健壮的实现方法,以解决因cookie名称相似而引起的读取错误。

document.cookie.indexof的解释

 (2014-03-18 15:30:02)
   

代码:
function getCookie(c_name)
{

    if(document.cookie.length > 0)

      {

        c_start = document.cookie.indexof(c_name + "=");

        if (c_start != -1)

           {

             c_start = c_start + c_name.length + 1;

             c_end = document.cookie.indexof(";", c_start);

             if (c_end == -1)

                {

                  c_end = document.cookie.length;

                 }

               return usescape(document.cookie.substring(c_start, c_end));

           }

       }
 
}

 

解释:

1、cookie保存在系统中的时候是“cookie名1 = cookie值; cookie名2 = cookie值”这样的方式来保存的。

2、document.cookie是返回包含所有cookie的字符串。

3、document.cookie.index(c_name + "=")是取得这个cookie名在整个cookie中的位置。(加“=”号:取cookie名加上等于号的位置,比方整个cookie是"user=tony; passwd=user123",这时候查找名为user的cookie值的时候,是查找"user="的位置;如果不要等于号,就会找到其它位置的"user",比如后面密码里面也有user字符,但并不是cookie中cookie名都是唯一的,所以加上等于号就不会出错。 

4、c_start = c_start + c_name.length + 1是用先前取得的位置加上cookie名的长度再加1,就是把位置确定在这个cookie名的“=”符号的后面。

5、c_end = document.cookie.indexof(";", c_start)是从上一步的位置开始查找的,直到";"的位置。

6、document.cookie.substring(c_start, c_end)就是取该cookie名的等号后面到分号前面的字符串,即对应的cookie的值。

 

====================

更好的读取Cookie

        写代码的时候,我们经常去使用一些开放的代码,尤其是读写cookie这种非常常用写起来又很无趣的功能。比如我就很喜欢去拷一些源码过来用,但也并不就是完美的,比如它提供的下面这段代码:

function getCookie(c_name)

{

        if (document.cookie.length>0)

        {

                c_start=document.cookie.indexOf(c_name + "=");

                if (c_start!=-1)

                

                        c_start=c_start + c_name.length+1;

                        c_end=document.cookie.indexOf(";",c_start);

                        if (c_end==-1) c_end=document.cookie.length;

                        return (document.cookie.substring(c_start,c_end));

                

        }

        return "";

}

        上面这段代码是用来读取cookie的,但它存在一个问题,比如当cookie中同时存在这样两个字段“kuin=12345”和"uin=67890"时,如果

kuin在cookie中位于uin的前面,那么上面这段代码就无法读取uin的值了,因为它会误把kuin当作uin来读取。

        那么如何修复呢,下面是优化后的代码:

function getCookie(c_name)

{

        if (document.cookie.length>0)

        {

                var tmp_cookie = document.cookie,

                tmp_c1 = (tmp_cookie.indexOf(" "+c_name+"=")>0) ? (tmp_cookie.indexOf(" "+c_name+"=")+1) : 0,

                tmp_c2 = (tmp_cookie.indexOf(";"+c_name+"=")>0) ? (tmp_cookie.indexOf(";"+c_name+"=")+1) : 0,

                tmp_c3 = (tmp_cookie.indexOf(c_name+"=")==0) ? 0 : -1,

                c_start=tmp_c1 || tmp_c2 || tmp_c3;

                if (c_start!=-1)

                {

                        c_start=c_start + c_name.length+1;

                        var c_end=tmp_cookie.indexOf(";",c_start);

                        if (c_end==-1) c_end=tmp_cookie.length;

                        return (tmp_cookie.substring(c_start,c_end));

                }

        }

        return "";

}

补充:如果cookie中存在大量的值,我们就没有必要不断的使用getCookie()去读取了,更高效的方法是在第一次读取时直接将所有cookie解

析出来并存放在一个对象中,如下:

cookie = {

        uin: 12345,

        kuin: 59432,

        nick: flondon

};

<html> <head> <title>试验数据管理系统</title> </head> <script type="text/javascript"> window.onload=function(){ var WSApprovalAx = document.getElementById("PlanAx"); // /* if (!WSApprovalAx) { var sHTML = '<OBJECT id="PlanAx" classid="clsid:92eb428e-1894-4ca2-8e88-20fd0bb16001" ></OBJECT>'; $('#ctrlContainer').append(sHTML).find("#PlanAx").width("100%") .height("100%"); WSApprovalAx = document.getElementById("PlanAx"); }*/ if (!WSApprovalAx) { alert("创建报表控件失败!"); } else { setCookie('KOAL_CERT_T', 'admin', 10); var userCode = getCookie('KOAL_CERT_T'); //var userCode = 'admin'; if (userCode == null || userCode == undefined) { userCode=''; } WSApprovalAx.StartLogin(userCode, getNowFormatDate()); } document.getElementById('PlanAx').setAttribute("width",document.body.clientWidth); document.getElementById('PlanAx').setAttribute("height", document.body.clientHeight); }; window.onresize = function () { var planCtrl = document.getElementById('PlanAx'); if (planCtrl != undefined && planCtrl != null) { planCtrl.setAttribute("width", document.body.clientWidth); planCtrl.setAttribute("height", document.body.clientHeight); } }; function getNowFormatDate() { var date = new Date(); var seperator1 = "-"; var seperator2 = ":"; var month = date.getMonth() + 1; var strDate = date.getDate(); if (month >= 1 && month <= 9) { month = "0" + month; } if (strDate >= 0 && strDate <= 9) { strDate = "0" + strDate; } var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate + " " + date.getHours() + seperator2 + date.getMinutes() + seperator2 + date.getSeconds(); return currentdate; } function setCookie(c_name, value, expiredays) { var exdate = new Date(); exdate.setTime(Number(exdate) + expiredays); document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString()); } function getCookie(c_name) { if (document.cookie.length > 0) { c_start = document.cookie.indexOf(c_name + "=");//获取字符串的起点 if (c_start != -1) { c_start = c_start + c_name.length + 1;//获取值的起点 c_end = document.cookie.indexOf(";", c_start);//获取结尾处 if (c_end == -1) c_end = document.cookie.length;//如果是最后一个,结尾就是cookie字符串的结尾 return decodeURI(document.cookie.substring(c_start, c_end));//截取字符串返回 } } return ""; } function OnClosed() { window.open('', '_self'); window.top.close(); } </script> <body style="margin:0px; width: 100%; height: 100%; border: 0px;overflow:hidden;"> <div id="ctrlContainer"></div> <object id="PlanAx" classid="clsid:92eb428e-1894-4ca2-8e88-20fd0bb16001" codebase="HY.Docker.18.2.dll" width="0" height="0"> </object> </body> </html>
最新发布
07-25
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值