zoukankan      html  css  js  c++  java
  • 好用的js-cookies工具

    背景

    回顾一年前的代码,关于cookies这块,增删改查完全可以封装成一个模块。在MDN上看到一款很全的分享,在此做个记录。

    cookies模块

    /*
    |*|
    |*|    :: cookies.js ::
    |*|
    |*|    A complete cookies reader/writer framework with full unicode support.
    |*|
    |*|    Revision #5 - August 14th, 2018
    |*|
    |*|    https://developer.mozilla.org/en-US/docs/Web/API/document.cookie
    |*|    https://developer.mozilla.org/User:fusionchess
    |*|    https://github.com/madmurphy/cookies.js
    |*|
    |*|    This framework is released under the GNU Public License, version 3 or later.
    |*|    http://www.gnu.org/licenses/gpl-3.0-standalone.html
    |*|
    |*|    Syntaxes:
    |*|
    |*|    * docCookies.setItem(name, value[, end[, path[, domain[, secure]]]])
    |*|    * docCookies.getItem(name)
    |*|    * docCookies.removeItem(name[, path[, domain]])
    |*|    * docCookies.hasItem(name)
    |*|    * docCookies.keys()
    |*|    * docCookies.clear([path[, domain]])
    |*|
    */
    
    var docCookies = {
        getItem: function (sKey) {
            if (!sKey) { return null; }
            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;
                        /*
                        Note: Despite officially defined in RFC 6265, the use of `max-age` is not compatible with any
                        version of Internet Explorer, Edge and some mobile browsers. Therefore passing a number to
                        the end parameter might not work as expected. A possible solution might be to convert the the
                        relative time to an absolute time. For instance, replacing the previous line with:
                        */
                        /*
                        sExpires = vEnd === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; expires=" + (new Date(vEnd * 1e3 + Date.now())).toUTCString();
                        */
                        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 (!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) {
            if (!sKey || /^(?:expires|max-age|path|domain|secure)$/i.test(sKey)) { return false; }
            return (new RegExp("(?:^|;\s*)" + encodeURIComponent(sKey).replace(/[-.+*]/g, "\$&") + "\s*\=")).test(document.cookie);
        },
        keys: function () {
            var aKeys = document.cookie.replace(/((?:^|s*;)[^=]+)(?=;|$)|^s*|s*(?:=[^;]*)?(?:1|$)/g, "").split(/s*(?:=[^;]*)?;s*/);
            for (var nLen = aKeys.length, nIdx = 0; nIdx < nLen; nIdx++) {
                aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]);
            }
            return aKeys;
        },
        clear: function (sPath, sDomain) {
            var aKeys = this.keys();
            for (var nLen = aKeys.length, nIdx = 0; nIdx < nLen; nIdx++) {
                this.removeItem(aKeys[nIdx], sPath, sDomain);
            }
        }
    };
    
    if (typeof module !== "undefined" && typeof module.exports !== "undefined") {
        module.exports = docCookies;
    }

    cookies示例

    docCookies.setItem("test0", "Hello world!");
    docCookies.setItem("test1", "Unicode test: u00E0u00E8u00ECu00F2u00F9", Infinity);
    docCookies.setItem("test2", "Hello world!", new Date(2020, 5, 12));
    docCookies.setItem("test3", "Hello world!", new Date(2027, 2, 3), "/blog");
    docCookies.setItem("test4", "Hello world!", "Sun, 06 Nov 2022 21:43:15 GMT");
    docCookies.setItem("test5", "Hello world!", "Tue, 06 Dec 2022 13:11:07 GMT", "/home");
    docCookies.setItem("test6", "Hello world!", 150);
    docCookies.setItem("test7", "Hello world!", 245, "/content");
    docCookies.setItem("test8", "Hello world!", null, null, "example.com");
    docCookies.setItem("test9", "Hello world!", null, null, null, true);
    docCookies.setItem("test1;=", "Safe character test;=", Infinity);
     
    alert(docCookies.keys().join("
    "));
    alert(docCookies.getItem("test1"));
    alert(docCookies.getItem("test5"));
    docCookies.removeItem("test1");
    docCookies.removeItem("test5", "/home");
    alert(docCookies.getItem("test1"));
    alert(docCookies.getItem("test5"));
    alert(docCookies.getItem("unexistingCookie"));
    alert(docCookies.getItem());
    alert(docCookies.getItem("test1;="));

    总结

    cookie只是浏览器缓存机制中的一种,由于篇幅有限,会在下一篇文章介绍几种浏览器常用的缓存技术。

    cookie.js 作者 github持续更新链接:github传送门

  • 相关阅读:
    关于React的脚手架
    yarn和npm
    谈谈NPM和Webpack的关系
    php开发环境和框架phalcon的搭建
    Centos6.5--svn搭建
    System.Diagnostics.Process.Start(ProcessStartInfo)
    PHP错误:call to undefined function imagecreatetruecolor
    PostgreSQL删除表中重复数据行
    URL存在http host头攻击漏洞-修复方案
    for循环的执行顺序
  • 原文地址:https://www.cnblogs.com/hongdiandian/p/9503887.html
Copyright © 2011-2022 走看看