手寫jquery.cookie外掛

吳越南蠻發表於2020-12-31
/**
 * 設定cookie
 * @param name
 * @param value
 * @param config    expires:(Number|Date)有效期;設定一個整數時,單位是天;也可以設定一個日期物件作為Cookie的過期日期;
 path:(String)建立該Cookie的頁面路徑;
 domain:(String)建立該Cookie的頁面域名;
 secure:(Boolean)如果設為true,那麼此Cookie的傳輸會要求一個安全協議,例如:HTTPS;
 */
function addCookie(name,value,config = {
    expires: null,
    path: null,
    maxAge: null,
    domain: null,
    secure: true,
    httpOnly: true
}) {
    value = $.cookie.json ? JSON.stringify(value) : value;
    value = $.cookie.raw ? value : encodeURIComponent(value);
    let cookieStr = name + '=' + value;
    if(config) {
        if(config.expires) {
            if(typeof config.expires === 'number') {
                const date=new Date();
                date.setTime(date.getTime()+config.expires*86400000);
                cookieStr += '; expires=' + date.toUTCString();
            }else if(config.expires instanceof Date) {
                cookieStr += '; expires=' + config.expires.toUTCString();
            }else {
                throw new Error('expires屬性必須為Number或Date型別')
            }
        }
        cookieStr += config.path ? '; path='+config.path : '';
        cookieStr += config.maxAge ? '; max-age='+config.maxAge : '';
        cookieStr += config.domain ? '; domain=' + config.domain : '';
        cookieStr += config.secure ?  '; secure' : '';
        cookieStr += config.httpOnly ? ';httpOnly' : '';
    }
    document.cookie = cookieStr;
}

/**
 * 獲取cookie
 * @param name
 * @returns {{}|*}
 */
function getCookie(name) {
    let cookieStrArr = document.cookie.split(';');
    let cookieObj = {};
    cookieStrArr.forEach(cookieStr => {
        let temp = cookieStr.split('=');
        let key = temp[0].trim();
        let value = temp[1];
        value = $.cookie.json ? JSON.parse(value) : value;
        value = $.cookie.raw ? value : decodeURIComponent(value);
        cookieObj[key] = value;
    });
    if(name) {
        return cookieObj[name];
    }else {
        return cookieObj;
    }
}

/**
 * 移除cookie
 * @param name
 * @param config
 */
function removeCookie(name,config) {
    //過期時間設為以前的時間就是刪除cookie
    config.expires = -1;
    addCookie(name,null,config);
}

$.extend({
    /**
     * 設定,獲取或移除cookie
     * @param name
     * @param value
     * @param config
     */
    cookie: function (name,value,config) {
        if(value) {
            addCookie(name,value,config);
        }else if(value == null) {
            removeCookie(name,null,config);
        }else {
            getCookie(name);
        }
    },
    /**
     * 移除cookie
     * @param name
     * @param config
     * @returns {boolean}
     */
    removeCookie(name,config) {
        if(getCookie(name)) {
            removeCookie(name,config);
            return true;
        }else {
            return false;
        }
    }
});

/**
 * 預設值:false。
 預設情況下,讀取和寫入 cookie 的時候自動進行編碼和解碼(使用 encodeURIComponent 編碼,decodeURIComponent 解碼)。要關閉這個功能設定 raw:true 即可:
 * @type {boolean}
 */
$.cookie.raw = false;
/**
 * 預設值:false。
 * 設定 cookie 的資料使用 json 儲存與讀取,這時就不需要使用 JSON.stringify 和 JSON.parse 了。
 * @type {boolean}
 */
$.cookie.json = false;

相關文章