一個簡單的全站記憶功能

        對於不少網站來講,可以記住用戶的點擊選項是有必要的,好比頁面上的單選項、複選項、下拉框等,但是網站上可能有不少這種選項,如何能快速地、方便地實現這個功能呢?緩存

        個人想法是,針對每個選項進行JS代碼編寫太繁瑣,最好能寫一個通用的代碼,而後在每一個須要記憶的地方加個標識便可。cookie

        通常來講,每一個網站都會有一個公用的相似叫globle.js的一個文件,每一個頁面都會引用這個文件,那麼不如就在這個文件中動點手腳吧,如下是我加在globle.js文件中的代碼:網站

/* 
 * 緩存全站的複選框、單選框、下拉框值,再次打開時會默認上次的選項.默認在頁面加載500毫秒後觸發。
 * 也能夠手動觸發只對一個DIV操做,若有些頁面須要某個動做觸發時纔會初始化,以後再加載cookie記憶
*/
cookiememory = function(div){
    var pre = (div==null ? '' : ('#' + div + ' ')),
        inputArr = $(pre + 'input[data-memory]'),
        selectArr = $(pre + "select[data-memory]");
    
    inputArr.each(function(idx,ele){
        var    eleType = $(ele).attr('type');
        
        if(eleType == 'checkbox'){//針對checkbox的處理
            memory4checkbox(ele);
        }else if(eleType == 'radio'){//針對radio的處理
            memory4radio(ele);
        }
    });
    
    selectArr.each(function(idx,ele){//針對下拉框的處理
        memory4selector(ele);
    });
};var memoryTimer = setTimeout("cookiememory()", 500);事件

function memory4radio(ele){
    var cookieName = $.cookie("userId") + '_' + $(ele).attr('data-memory'),//用戶級別的cookie因此須要加上userid
        cookieVal = $.cookie(cookieName),
        radioName = $(ele).attr('name');
    
    //cookie值不爲空時相應的radio爲點選狀態,不然第一個元素爲點選狀態
    if(!isNull(cookieVal)){
        $("input[name='" + radioName + "'][value=" + cookieVal +"]").prop("checked",true);
    }else{
        $("input[name='" + radioName + "']:first").prop("checked",true);
    }
    $(ele).trigger('change');
    
    //事件只須要綁定一次
    if($(ele).attr('bebound')){
        return;
    }else{
        $("input[name='" + radioName + "']").change(function(){
            $.cookie(cookieName,$("input[name='" + radioName + "']:checked").val());
        });
        $(ele).attr('bebound',true);
    }
        
}input

function memory4checkbox(ele){
    var cookieName = $.cookie("userId") + '_' + $(ele).attr('data-memory'),//用戶級別的cookie因此須要加上userid
        cookieVal = $.cookie(cookieName);
    
    if(cookieVal != undefined && cookieVal == 'false'){
        $(ele).prop('checked',false);
    }else{
        $(ele).prop('checked',true);
    }
    
    //事件只須要綁定一次
    if($(ele).attr('bebound')){
        return;
    }else{
        $(ele).on('click',function(){
            $.cookie(cookieName,$(ele).prop('checked'));
        });
        $(ele).attr('bebound',true);
    }
}io

function memory4selector(ele){
    var cookieName = $.cookie("userId") + '_' + $(ele).attr('data-memory'),//用戶級別的cookie因此須要加上userid
        cookieVal = $.cookie(cookieName);
    
    //事件只須要綁定一次
    if(!$(ele).attr('bebound')){
        $(ele).on('change',function(){
            if(isNull($(ele).val())){return}
            $.cookie(cookieName,$(ele).val());
        });
        $(ele).attr('bebound',true);
    }
    
    if(isNull(cookieVal)){return}
    if($(ele).find('option[value=' + cookieVal + ']').length < 1){return;}//cookie的值不在select值範圍以內function

    $(ele).val(cookieVal);
    $(ele).trigger('change');
}cli

 

以上的代碼顯示,只要你在須要記憶的控件上加一個「data-memory=cookiekey」就能夠了,固然這個「cookiekey」每一個不一樣而且要惟一。而且在設置完cookie值以後還會觸發相應的click或change事件。select

相關文章
相關標籤/搜索