1. 程式人生 > >移動端下滑刷新插件(jQuery插件)

移動端下滑刷新插件(jQuery插件)

img load mode 正則 width rip 而且 參數 turn

題外話:好久沒寫過博客了,感覺還是在校園的舒服。感覺實習都很累,一天負責得好多事情。不過值得炫耀的是,以前上大一時候,某老師拿出他們企業的項目,說這個項目單純源代碼就1個G。當時覺得,這麽大的項目,肯定很多人一起做並且花費許多時間。現在出來實習了兩個月,獨自從前端到後臺,都獨自敲了上G的代碼,覺得當時是沒見過。而且現在一個人就承擔公司大部分的業務,感覺還是不錯的。

好了,回到話題,由於不能獨自開發,而且為了給他們方便,自己寫過不少的插件,不過今天剛好空閑,發出剛好完成的,移動端的下滑到底刷新插件。我不是很喜歡寫插件給別人用,因為用起來自然是簡單的,沒什麽難度,所以一起分享下設計思路。

關鍵在數據傳送部分,樣式可以自由定義,再帶到插件中用,插件中使用到別處的加載插件(layer插件,蠻好用的,推薦個廣告~)

首先,看下demo(只是簡單的,沒有帶樣式,讀者自己寫樣式,帶到裏面使用):

使用方式:(傳送數據,我只寫了json格式,數據是json格式,如果需要用到排序或者別的需求,可以帶上data參數,一並上傳到後臺的)

var load;
    $(‘#list‘).paging({
        //從後臺接收數據
        url: "/WebSite1/Test.aspx?action=test",
        //每頁大小
        size: 20,
        //單項模板 model 用 { *** }方式,並且跟後臺傳到前臺的json對象中必須是一致的名字
        temp: "<div style=‘width:100%;height:50px;‘>姓名:{ Name }&nbsp;學號{ No }</div>",
        
//在提交前執行方法,可以用於顯示加載中狀態 before: function () { load = layer.load(1); }, //不管在單次結束時候回調方法,可以用於結束當前加載中狀態 over: function () { layer.close(load); }, //過濾器,在獲取的每行數據,可以自定義修改填充數據,必須跟後臺傳到前臺json一致的名字 filter: { Name: function (data) {
return "<a onclick=‘alert(\"" + data + "\");‘>" + data + "</a>"; } }, //在所有數據加載完成時候觸發,判斷數據是否結束的依據是當前獲取數據的數目 是否大於 每頁的大小 pageover: function () { $(‘#isover‘).html(‘加載結束‘); } //next是翻下一頁,一開始時候必須這樣,加載一次,後邊可以自己控制加載,或者在後邊加上pageload,就可以滑到底部時候,自動加載數據了 }).next().pageload();

效果:

技術分享

先上js代碼

//手機端往下移動加載更多

(function($,window){
    $.fn.paging = function(obj){
        this.bpage = obj;
        //默認開始第一頁
        this.bpage.currentpage = 1;
        //每頁大小 默認5
        this.bpage.size = this.bpage.size || 5;
        //是否是第一次加載
        this.bpage.isfirst = true;
        //當返回的總數小於頁大小時候,就是結束時候
        this.bpage.isover = false;
        //判斷是否能加載數據
        this.bpage.flag = true;
        //清空當前的list列表頁內容
        this.html(‘‘);
        $.pagingreg = /\{\s*([^\{\}\s]+)\s*\}/g;
        //$.pagingreg = /\{\s*([^\{\}]+)\s*\}/g;
        //翻頁
        this.next = function(){
            this.bpage.flag = false;
            this.bpage.isfirst = false;
            //在加載時候執行,可以顯示狀態加載中
            if(this.bpage.before){
                this.bpage.before();
            }
            if(!this.bpage.data){
                this.bpage.data = {};
            }
            var _this = this;
            $.ajax({
                url:_this.bpage.url,
                data:$.extend(true, obj.data, {
                    size:_this.bpage.size,
                    current:_this.bpage.currentpage,
                }),
                type:_this.bpage.type || ‘post‘,
                dataType : _this.bpage.dataType || ‘json‘,
                success:function(data){
                    //後臺傳給前臺數據必須在 data.Data中
                    //alert(data);
                    var da = data.Data;
                    var str = "";
                    for(var i = 0;i<da.length;i++){
                        var temp = _this.bpage.temp;
                        //填充數據
                        var match = $.pagingreg.exec(_this.bpage.temp);
                        while(match){
                            if(_this.bpage.filter && _this.bpage.filter[match[1]]){
                                //用戶可以自定義數據
                                temp = temp.replace(match[0],_this.bpage.filter[match[1]](da[i][match[1]]),da[i]);
                            }else{
                                temp = temp.replace(match[0],da[i][match[1]]);
                            }
                            //alert("‘"+match[1]+"‘");
                            match = $.pagingreg.exec(_this.bpage.temp);
                        }
                        //alert(temp);
                        str +=temp;
                    }
                    //顯示在頁面上
                    _this.html(_this.html()+str);
                    _this.bpage.currentpage++;
                    //成功的回調
                    if(_this.bpage.success){
                        _this.bpage.success();
                    }
                    if(_this.bpage.over){
                        _this.bpage.over();
                    }
                    
                    if(da.length < _this.bpage.size){
                        _this.bpage.isover = true;
                        //結束時候執行
                        if(_this.bpage.pageover){
                            //分頁獲取數據完全結束時候執行
                            _this.bpage.pageover();
                        }
                    }
                    _this.bpage.flag = true;
                },
                error:function(){
                    //錯誤時候執行
                    if(_this.bpage.error){
                        _this.bpage.error();
                    }
                    if(_this.bpage.over){
                        _this.bpage.over();
                    }
                }
            });
            return this;
        };
        //ready綁定滾動事件
        this.pageload = function(){
            var _this = this;
            $(window).scroll(function () {
                if (_this.bpage.flag) {
                    if ($(document).scrollTop() >= $(document).height() - $(window).height()) {
                        if (!_this.bpage.isover) {
                            if(!_this.bpage.isfirst){
                                _this.next();
                            }
                        }
                    }
                }
            });
        };

        return this;
    };
    
})(jQuery,window);

講解下制作的思路:

其實下滑加載,只是一個分頁,加上前臺的配合而已。

想要獲取到分頁的數據,首先,前臺傳到後臺需要的基本參數:當前的頁數和每頁的大小數。

因此,在這個插件中,在當前的jquery對象中,保存了這兩個對象,因為每一頁大小,可以由用戶自己定義,所以,在設置每頁大小時候,先判斷用戶有沒有自己定義了。

還有,所需要的其他參數是,判斷是否結束的參數,這個其實就是一個標記,根據獲取數據的數目大小和當前的每頁大小來判斷是否結束。

最後,還有一個很重要的正則表達式,是用於匹配模板中的要填充的地方,看過大部分的框架,其實很多字符串匹配,基本是用正則表達式。

paging 其實只是初始化,並還沒加載數據,這時候將一些關鍵的參數初始化。

主要功能在next中,其實說完上邊的參數,應該大概就知道是怎樣的,在next中,因為在插件中,一定要有些操作,比如加載狀態的切換,還有當數據不滿足自己的使用,需要額外的方法。

第一個就是berofe,在提交之前,可以從源碼中看到,很簡單的。

提交中,也就是把所需要的參數放上去就可以了,jquery本身封裝就很好。

在data中,比較特殊,因為有可能有用戶自己定義的上傳的數據,所以這裏使用jquery的將兩個對象合並。

在獲取完數據,其實這個插件是前臺控制後臺的頁數和大小,所以後臺其實除了數據,不需要其他內容到前臺的。

不過,從後臺傳前臺的數據,一定要要將數組數據放在 Data中,我固定了它,獲取數據從返回json對象中的Data中拿的,下面遍歷也是從這開始。

最主要的功能,遍歷並填充數據:

一開始時候,用戶將模板放在temp中。那在循環中,將它拿出來,並且使用正則式的匹配,自動的將 { *** } 格式的篩選出來,篩選出來,先判斷用戶有沒有filter對象,在filter對象中有沒有使用對數據的過濾,過濾的方法有兩個參數,第一個是當前列的數據,第二個是當前行的所有數據。這樣就能顯示很多復雜的數據,這樣也就增加了靈活性。

好了,大部分功能就實現了。

在每一行讀取數據時候,先會去匹配是否當前的對象在filter中有

後邊就是結束時候的回調方法。

看下實際項目中的使用,不過數據不多。只有一行。主要演示filter功能:

json對象:

{
    "State": 0,
    "Content": null,
    "Data": [
        {
            "id": 1,
            "sex": 0,
            "phone": "123",
            "qq_wx": "123",
            "teachaddress": "中國福建",
            "memo": "哈哈",
            "teachersex": 0,
            "teachermemo": "哈哈",
            "name": "mcg",
            "grade": {
                "id": 1,
                "gradename": "一年級",
                "cover": "",
                "delstate": 0,
                "createdate": null
            },
            "subject": {
                "id": 1,
                "subjectname": "英語",
                "createdate": null,
                "delstate": 0
            },
            "time": {
                "id": 1,
                "teachdate": "一周兩次,一次2個小時",
                "delstate": 0,
                "createdate": null
            },
            "createtime": "/Date(1503127735000)/"
        }
    ]
}

比較復雜的對象,然後在前臺使用:

<script src="~/Scripts/page.js"></script>
<script type="text/javascript">
    var load;
    $(#studentlist).paging({
        url: "/Student/getStudentsList",
        //每頁大小
        size: 10,
        //填充的模板 每個item項 裏面對象和後臺傳到前臺數據必須一致,並且使用 { *** } 方式使用,存放數據必須在 Data對象下,可參照後臺數據。其他可自定義
        temp: "<div class=‘content-student-list-item‘>"
                +"<p style=‘text-align: left;‘><span>訂單編號:</span>{ id }</p>"
                + "<p><span>求教科目:</span>{ subject }</p>"
                + "<p><span>學員要求:</span>{ teachersex }&nbsp;{ teachermemo }</p>"
                + "<p><span>學員情況:</span>{ sex }&nbsp;{ grade }&nbsp;{ memo }</p>"
                + "<p><span>授課地址:</span>{ teachaddress }</p>"
                + "<p><span>報酬:</span>¥110元</p><p><span>發布時間:</span>{ createtime }</p></div>",
        //在獲取數據前回調,可以顯示加載中等操作
        before: function () {
            load = layer.load(1);
        },
        //不管有沒有成功的獲取數據,在提交獲取結束都會執行 ,可以用於結束加載
        over: function () {
            layer.close(load);
        },
        filter: {
            subject: function (data) {
                return data.subjectname;
            },
            teachersex: function (data) {
                if (data == -1) {
                    return 不限;
                } else if (data == 0) {
                    return ;
                } else {
                    return ;
                }
            },
            sex: function (data) {
                return data == 0 ? "" : "";
            },
            grade: function (data) {
                return data.gradename;
            },
            createtime: function (data) {
                return $.jsonDateFormatA(data);
            }
        }
    }).next().pageload();
</script>

,,就可以顯示出各式各樣的數據

技術分享

解釋了之後,是不是覺得其實很簡單,這樣寫完,使用起來也是很便捷。

最後,還有個滑動到底部刷新方法,只需要調用pageload方法,裏面其實將滾動到底部的方法裏添加執行next的翻頁方法,就可以實現了,很簡單的下滑刷新功能。

好了,今天就到這吧。

移動端下滑刷新插件(jQuery插件)