0

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

2 回答 2

2

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

/^|;\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}\=[^;]+;/));

这是您拥有的完全相同的代码的优化版本。cookieFbATM,您的代码将在每次调用时向 dom 查询具有 ID 的元素,并且它也会创建 RegExp 的实例。通过使用闭包,您可以查询 DOM 一次,并创建一次 RegExp 的实例,并在每次调用时重复使用它。
在这种情况下,它的效率更高,并且进行了微优化,但我情不自禁;)

于 2013-07-31T14:10:33.333 回答
0

我会这样做。首先将所有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";
        }
    }
}
于 2013-07-31T14:39:14.303 回答