使用Javascript查找cookie的部分名称

时间:2013-07-31 14:03:55

标签: javascript cookies

在我的网站上,我使用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";
    }
}

2 个答案:

答案 0 :(得分:2)

如果我使用包含值'fbsr_haha, gotcha'的Cookie集,那么您当前正在使用的代码就像我使用Facebook登录一样执行 也许这是正则表达式的工作:

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

应该做的伎俩 表达解释:

  • ^|;:字符串的开头或分号
  • \s*:后跟零个或多个空格
  • fbsr_[0-9]{4}:匹配fsbr_和任意4个数字序列
  • \=:你可以写=,但有时你需要逃避=(外观),所以最好经常逃避它而不是不够
  • [^;]+除了分号至少一次以外的任何其他内容
  • ;:字面分号

在何处使用此表达式:

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,你的代码每次调用时都会向dom查询ID为cookieFb的元素,并且它也会创建一个RegExp实例。通过使用闭包,您可以查询DOM一次,并创建一次RegExp实例,并为每次调用重复使用它。
在这种情况下,它更有效率和微优化,但我无法帮助自己;)

答案 1 :(得分:0)

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

修改

here

中删除的功能
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";
        }
    }
}