我试图了解JavaScript中Cookie的概念。为此,我试图从http://www.w3schools.com/js/tryit.asp?filename=tryjs_cookie_username理解此代码的工作方式:

<script>
function setCookie(cname,cvalue,exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires=" + d.toGMTString();
    document.cookie = cname+"="+cvalue+"; "+expires;
}

function getCookie(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1);
        if (c.indexOf(name) == 0) {
            return c.substring(name.length, c.length);
        }
    }
    return "";
}

function checkCookie() {
    var user=getCookie("username");
    if (user != "") {
        alert("Welcome again " + user);
    } else {
       user = prompt("Please enter your name:","");
       if (user != "" && user != null) {
           setCookie("username", user, 30);
       }
    }
}
</script>


我已经了解了这段代码中的大多数内容,但是仍然有一些疑问/疑问(在getCookie函数中):

怀疑1. for循环的目的

怀疑2。

疑问3. while循环的目的

怀疑4.返回“”的目的;

我问这些问题是因为即使不使用这些条件,脚本也可以正常运行。 (我知道getCookie函数中每个内置函数的工作。我只是不理解上述循环和条件的使用)。

我想说的是:

    function getCookie(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    var c = ca[0];
    return c.substring(name.length, c.length);
}


即使在setCookie函数(exdays*2000)中将到期日期更改为过去的日期之后,它仍然显示“ Welcome to XYZ”消息。这意味着Cookie不会被删除。但是,当我在其他浏览器中运行相同的代码时,它将被删除。为什么会这样呢?

最佳答案

怀疑1. for循环的目的


所有cookie均保存为以分号分隔的键值(实际上是分号和空格;)。键和值之间用等号(=)分隔。通过迭代,您正在检查所有键并仅返回与传递给方法的参数匹配的key值。


  怀疑2。


检查迭代中的当前键是否包含传递给方法的cookie名称。


  疑问3. while循环的目的


逐个删除所有空格。实际上,可以通过使用trim()方法轻松地对此进行改进。

//while (c.charAt(0)==' ') c = c.substring(1);
c = c.trim();



  怀疑4.返回“”的目的;


如果找不到值,则返回一个空字符串,而不是用户必须检查nullundefined


  即使我已将到期日期更改为setCookie中的过去日期
  功能(例如* 2000),它仍显示“ Welcome to XYZ”
  信息。这意味着Cookie不会被删除。但是当我运行相同的
  代码在其他浏览器中被删除。为什么会这样呢?


假设(因为您尚未共享任何小提琴,这是可能的),当您在同一浏览器上第二次打开该页面时,不会执行setCookie方法。

07-26 06:23