设置cookie并使用JavaScript获取cookie

DrW*_*lie 486 html javascript css cookies

我正在尝试根据我在HTML中选择的CSS文件来设置cookie.我有一个包含选项列表的表单,以及不同的CSS文件作为值.当我选择一个文件时,它应该保存到cookie大约一个星期.下次打开HTML文件时,它应该是您选择的上一个文件.

JavaScript代码:

function cssLayout() {
    document.getElementById("css").href = this.value;
}


function setCookie(){
    var date = new Date("Februari 10, 2013");
    var dateString = date.toGMTString();
    var cookieString = "Css=document.getElementById("css").href" + dateString;
    document.cookie = cookieString;
}

function getCookie(){
    alert(document.cookie);
}
Run Code Online (Sandbox Code Playgroud)

HTML代码:

<form>
    Select your css layout:<br>
    <select id="myList">
        <option value="style-1.css">CSS1</option>
        <option value="style-2.css">CSS2</option>  
        <option value="style-3.css">CSS3</option>
        <option value="style-4.css">CSS4</option>
    </select>
</form>
Run Code Online (Sandbox Code Playgroud)

Man*_*jua 734

我发现以下代码比其他任何代码简单得多:

function setCookie(name,value,days) {
    var expires = "";
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days*24*60*60*1000));
        expires = "; expires=" + date.toUTCString();
    }
    document.cookie = name + "=" + (value || "")  + expires + "; path=/";
}
function getCookie(name) {
    var nameEQ = name + "=";
    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,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}
function eraseCookie(name) {   
    document.cookie = name+'=; Max-Age=-99999999;';  
}
Run Code Online (Sandbox Code Playgroud)

现在,调用函数

setCookie('ppkcookie','testcookie',7);

var x = getCookie('ppkcookie');
if (x) {
    [do something with x]
}
Run Code Online (Sandbox Code Playgroud)

来源 - http://www.quirksmode.org/js/cookies.html

他们今天更新了页面,因此页面中的所有内容都应该是最新版本.

  • 如果您的cookie包含分号,则无法使用此功能. (11认同)
  • 不推荐使用`toGMTString()` - 仅供参考.[参考文献](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toGMTString) (4认同)
  • 为什么这么复杂?使用`date.setDate(date.getDate()+ days);`代替 (4认同)
  • cookies-js与你在这里提供的API基本相同,只有很少的额外内容:https://github.com/ScottHamper/Cookies (3认同)
  • 干净,功能短.我建议在顶部声明你的vars(由于悬挂)并在你的其他地方添加卷曲.除非你使用Coffee脚本.如果你在if之前将expires设置为空,则不需要else (3认同)
  • @基思W。如上所述将 document.cookie 设置为 cookie 是否会删除该站点之前设置的所有 cookie? (3认同)
  • 对于每小时 cookie,只需将 `days` 更改为 `hours` 变量,并删除乘法的 `*24` 部分 (2认同)
  • @MohammedShareefC 好问题,但好答案 - /sf/ask/475436111/ (2认同)
  • eraseCookie **功能对我不起作用(FireFox Developer Edition 66.0b4)。相反,我不得不使用BT的答案中的代码:`document.cookie = name +'=; expires =星期四,1970年1月1日00:00:00 UTC;path = /'`。 (2认同)
  • 很好的答案。在 cookie 值中使用分号 (;) 时,我遇到了问题。所以我细化了一些线条。请更新您的答案。来自 **function setCookie(name,value,days)** `document.cookie = name + "=" + (encodeURIComponent(value) || "") + expires + "; path=/";` 来自 **function getCookie(name)** `if (c.indexOf(nameEQ) == 0) return decodeURIComponent(c.substring(nameEQ.length,c.length));` 在retutn 语句中使用`encodeURIComponent(), decodeURIComponent()` ; (2认同)

B T*_*B T 325

这些都是很多很多比W3Schools的(最可怕的Web引用做过)更好的引用:

从这些参考中得出的例子:

// sets the cookie cookie1
document.cookie =
 'cookie1=test; expires=Fri, 19 Jun 2020 20:47:11 UTC; path=/'

// sets the cookie cookie2 (cookie1 is *not* overwritten)
document.cookie =
 'cookie2=test; expires=Fri, 19 Jun 2020 20:47:11 UTC; path=/'

// remove cookie2
document.cookie = 'cookie2=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/'
Run Code Online (Sandbox Code Playgroud)

Mozilla参考甚至还有一个很好的cookie库,你可以使用它.

  • 看起来IE8及以下版本不支持`max-age`,所以`expires`是更安全的选择.http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx (53认同)
  • 那只是你的意见.你提供的quirksmode页面并不像w3school那样清晰,所以我认为它不会更好(除非你能给出任何其他原因).如果你真的看到w3fools,你会发现他们实际上已经删除了他们网站上的所有内容(大概是因为他们所有的批评都是无效的).当我看到人们在不使用他们自己的判断的情况下加入'w3fools'时,它只会让我感到恼火. (35认同)
  • @CpnCrunch W3schools十年前摧毁了他们的品牌.我不会因为不相信他们而道歉.他们唯一擅长10年的是SEO. (26认同)
  • expires变量已过时,但仍受浏览器支持.请改用max-age! (21认同)
  • @BT quirks说:"一个cookie只不过是一个存储在浏览器中的小文本文件." - 从未听说过该文件系统.必须是新的.W3schools声明它存储在计算机上.小资,但W3schools的抨击也是如此. (16认同)
  • 请注意,MDN 参考页面没有提及“expires”已被弃用/过时。这是因为它有时可以达到“max-age”未涵盖的目的。“max-age”的值必须是一个解释为秒数的数值,而“expires”值可以设置为特殊值“Session”,它与“max-age=0”不同;`**。 (5认同)
  • 您还可以在Cookie上设置`domain`参数,如果您想在网站上的不同子域中使用Cookie,这将非常有用. (3认同)
  • 只是为了添加关于w3schools,网站w3fools被创建以指出该网站上的所有错误,但该网站现在只是说"W3Schools已基本解决了这些问题" (3认同)
  • @CpnCrunch我的答案链接到两个比w3schools写得好得多的参考文献.似乎w3schools比以前更糟糕,但它仍然不是最好的网络参考.请阅读此处了解更多信息:http://www.w3fools.com/ (2认同)
  • 不适用于 Chrome。在这里查看原因:/sf/ask/1844433671/ (2认同)

Dan*_*Dan 26

我确定这个问题应该有一个更通用的答案,一些可重复使用的代码可以使用cookie作为键值对.

此片段取自MDN,可能是值得信赖的.这是使用cookie的UTF安全对象:

var docCookies = {
  getItem: function (sKey) {
    return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
  },
  setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) {
    if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; }
    var sExpires = "";
    if (vEnd) {
      switch (vEnd.constructor) {
        case Number:
          sExpires = vEnd === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; max-age=" + vEnd;
          break;
        case String:
          sExpires = "; expires=" + vEnd;
          break;
        case Date:
          sExpires = "; expires=" + vEnd.toUTCString();
          break;
      }
    }
    document.cookie = encodeURIComponent(sKey) + "=" + encodeURIComponent(sValue) + sExpires + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "") + (bSecure ? "; secure" : "");
    return true;
  },
  removeItem: function (sKey, sPath, sDomain) {
    if (!sKey || !this.hasItem(sKey)) { return false; }
    document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + ( sDomain ? "; domain=" + sDomain : "") + ( sPath ? "; path=" + sPath : "");
    return true;
  },
  hasItem: function (sKey) {
    return (new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie);
  },
  keys: /* optional method: you can safely remove it! */ function () {
    var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/);
    for (var nIdx = 0; nIdx < aKeys.length; nIdx++) { aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]); }
    return aKeys;
  }
};
Run Code Online (Sandbox Code Playgroud)

Mozilla有一些测试证明这在所有情况下都有效.

还有一个另外的片段在这里:

  • GPL与否,我更喜欢我能读**的代码. (11认同)
  • @SandipPingle这是GPL的"魅力",你不能(除非你转动你的应用程序GPL).这段代码有点类似于问题的通用解决方案,因此它引出一个问题:通用代码是否可以实际获得许可(或者在通用代码的情况下这样的许可是否有效)?尝试使用不同的(非GPL)代码来解决您的问题. (6认同)
  • 只是警告@SandipPingle,这个答案中提供的代码实际上是GPL许可的. (5认同)

小智 22

检查W3Schools.com上的JavaScript Cookies,以便通过JS设置和获取cookie值.

只需使用那里提到的setCookie和getCookie方法.

所以,代码看起来像:

<script>
function setCookie(c_name, value, exdays) {
    var exdate = new Date();
    exdate.setDate(exdate.getDate() + exdays);
    var c_value = escape(value) + ((exdays == null) ? "" : "; expires=" + exdate.toUTCString());
    document.cookie = c_name + "=" + c_value;
}

function getCookie(c_name) {
    var i, x, y, ARRcookies = document.cookie.split(";");
    for (i = 0; i < ARRcookies.length; i++) {
        x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("="));
        y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1);
        x = x.replace(/^\s+|\s+$/g, "");
        if (x == c_name) {
            return unescape(y);
        }
    }
}

function cssSelected() {
    var cssSelected = $('#myList')[0].value;
    if (cssSelected !== "select") {
        setCookie("selectedCSS", cssSelected, 3);
    }
}

$(document).ready(function() {
    $('#myList')[0].value = getCookie("selectedCSS");
})
</script>
<select id="myList" onchange="cssSelected();">
    <option value="select">--Select--</option>
    <option value="style-1.css">CSS1</option>
    <option value="style-2.css">CSS2</option>
    <option value="style-3.css">CSS3</option>
    <option value="style-4.css">CSS4</option>
</select>
Run Code Online (Sandbox Code Playgroud)

  • @BT你能否详细说明上述代码已经过时并被误导了? (12认同)
  • @BT,我还没有看到过时的w3schools的参考文献或包含不正确的信息. (12认同)
  • 我刚检查了我们的分析,10%的IE用户仍然使用IE8或更低版本.所以使用'max-age'是一个非常糟糕的主意. (8认同)
  • Stupidness!对于工作示例+1,我实际上并没有看到w3schools的问题, (8认同)
  • -1为w3schools (6认同)
  • w3fools过时的一个例子是"过期",最好根据tman的评论使用"max-age".IE8当然也是过时的,所以如果你定位IE8,你可能还需要使用expires. (4认同)
  • 转义已被弃用,并且会导致很多问题。你应该改变这个答案。 (2认同)