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