使用Javascript查找cookie的部分名称



在我的网站上,我使用cookie来显示或隐藏某些内容。根据用户登录的方式,将确定哪些内容对他们可见。即,如果我使用Facebook登录,我的网站会查找一个名为"fbsr_3324"的cookie。我的问题是,cookie名称的第二部分会为每个用户更改(fbsr_2889 fbsr_9902等)。因此,我想知道是否有人可以帮助并建议我如何只检查cookie名称的第一部分(即,只查找以fbsr_开头的cookie的存在

以下是我当前使用的Javascript:

function checkCookie() {
    contentDiv=document.getElementById("cookieFb");
    if (document.cookie.indexOf("fbsr_")!=-1) {
        contentDiv.style.display="none";
    }
    else {
        contentDiv.style.display="block";
    }
}

如果我有一个包含值'fbsr_haha, gotcha'
也许这是regex:的工作

/^|;s*fbsr_[0-9]{4}=[^;]+;/.test(document.cookie);

应该做这个把戏
表达式解释:

  • ^|;:字符串的开头或分号
  • s*:后面跟零个或多个空格
  • fbsr_[0-9]{4}:匹配fsbr_和4个数字的任意序列
  • =:您可以只写=,但有时您需要转义=(lookaround),所以最好经常转义一次
  • [^;]+除分号外的任何内容至少一次或多次
  • ;:文字分号

在何处使用此表达式:

function checkCookie()
{
    contentDiv=document.getElementById("cookieFb");
    if (/^|;s*fbsr_[0-9]{4}=[^;]+;/.test(document.cookie))
    {//facebooker!
        contentDiv.style.display="none";
        return;//return here, so you can leve the else out
    }
    contentDiv.style.display="block";
}

好吧,那就行了。
然而,我无法控制自己,所以如果你对JS更加熟悉,并想优化一些脚本,请考虑以下内容:

var checkCookie = (function(expr)
{
    var contentDiv = document.getElementById('cookieFb');
    return function()
    {
        contentDiv.style.display="block";
        if (expr.test(document.cookie))
        {
            contentDiv.style.display="none";
        }
    };
}(/^|;s*fbsr_[0-9]{4}=[^;]+;/));

这是与您拥有的代码完全相同的优化版本。在ATM中,每次调用ID为cookieFb的元素时,您的代码都会在dom中查询该元素,并且还会创建RegExp的实例。通过使用闭包,您可以查询DOM一次,创建RegExp实例一次,并在每次调用中重复使用它
它更高效,在这种情况下是微观优化,但我忍不住了;)

我会这么做。首先将所有cookie分解为关联数组

编辑

从这里刮取的功能

function get_cookies_array() {
    var cookies = { };
    if (document.cookie && document.cookie != '') {
        var split = document.cookie.split(';');
        for (var i = 0; i < split.length; i++) {
            var name_value = split[i].split("=");
            name_value[0] = name_value[0].replace(/^ /, '');
            cookies[decodeURIComponent(name_value[0])] = decodeURIComponent(name_value[1]);
        }
    }
    return cookies;
}

然后在您的checkCookie函数中循环浏览所有cookie名称,看看是否有以fbsr_开头的名称

function checkCookie() {
    var contentDiv=document.getElementById("cookieFb");
    var cookies = get_cookies_array();
    contentDiv.style.display="none";
    for(var name in cookies) {
        if (name.indexOf("fbsr_")==0) {
            contentDiv.style.display="block";
        }
    }
}

最新更新