ajax获取所有数据,前台分页,搜索

背景: 因为项目特殊性,分页功能,后台没法像常规方法一样从数据库分页查找数据。所以前台会获取所有的数据,然后进行前台分页。关键字查询也是因为上述原因,用的是js自带的indexOf()方法。

使用的插件和方法:
1. ajax
2. handlerbars模板引擎
3. jQuery插件开发过程

代码结构如下:

html代码:

<!-- 数据展示区域-->
<table>
    <tbody id="margin-panel"></tbody>
</table>
<div class="page">
        <ul class="pure-paginator">
            <li><a class="pure-button first" href="javascript:void(0)" data-page-index="1">首页</a></li>
            <li><a class="pure-button prev" href="javascript:void(0)">上一页</a></li>
            <li class="pageBtnGroup"></li>
            <!--翻页按钮-->
            <li><a class="pure-button next" href="javascript:void(0)">下一页</a></li>
            <li><a class="pure-button last" href="javascript:void(0)" data-page-index="">尾页</a></li>
        </ul>
    </div>
<!-- 所需要的模板 -->
<script id="finamceStocks-template" type="text/x-handlebars-template">
{{#each stocksdata}}
    <tr>
        <td>{{id}}</td>
        <td>{{secCode}}</td>
        <td>{{secAbbr}}</td>
        <td>{{rate}}</td>
        <td>{{branch}}</td>
        <td>{{lastUpdateTime}}</td>
    </tr>
{{/each}}
</script>

js代码部分:

*.render = function(data){
    $(".pure-paginator").paging({
        data          : stocksdata,                   /*所有数据*/
        numBtnOnepage : 5,                            /*带页数的按钮数量*/
        numOnePage    : 10,                           /*每页显示数据*/
        btnGroupLoc   : ".pageBtnGroup",              /*带页数按钮组容器*/
        tpl           : "#finamceStocks-template",    /*数据展示视图模板*/
        tplParam      : "stocksdata",                 /*视图模板参数对象*/
        dataLoc       : "#margin-panel"               /*数据展示容器*/
    });
}

自己写的jquery插件paging

/**
 * 翻页
 * created by wangdong
 * 2017/01/23
 * 
 * 数据从0开始计数
 * 页数从1开始计数
 * 当前对象是所有按钮组(包括上一页、下一页、首页、尾页)
 * 
 */
(function($){
    jQuery.fn.paging = function(options){
        /**
        @param data            {json}                  所有的数据
        @param numBtnOnePage   {number}                显示几个带页数按钮
        @param numOnePage      {number}                每页显示几条数据
        @param btnGroupLoc     {selector}              带页数按钮位置
        @param tpl             {selector}              视图模板
        @param tplParam        {string}                视图模板的参数对象
        @param dataLoc         {selector}              视图显示位置
        */

        var defaults = {
            numBtnOnePage  : 5,             /*默认5个翻页按钮*/
            numOnePage     : 7,             /*默认显示7条数据*/
        };
        var opts = $.extend(defaults, options);
        opts.numBtnOnePage = Number(opts.numBtnOnePage);
        opts.numOnePage = Number(opts.numOnePage);

        var $this          = $(this),
            $firstPageBtn  = $this.find(".pure-button.first"),           /*首页*/
            $lastPageBtn   = $this.find(".pure-button.last") ,          /*尾页*/
            $prevPageBtn   = $this.find(".pure-button.prev") ,           /*上一页*/
            $nextPageBtn   = $this.find(".pure-button.next") ;           /*下一页*/

        if(opts.data){
            var dataLength  = opts.data.length,
                pageCount   = Math.ceil(dataLength/opts.numOnePage);    //总页数
            // 为产品专区添加显示记录和页数
            $this.find(".recordCount .num").text(dataLength);
            $this.find(".pageCount .num").text(pageCount);
            if(dataLength == 0){
                $firstPageBtn.addClass("disabled");
                $lastPageBtn.addClass("disabled");
                $prevPageBtn.addClass("disabled");
                $nextPageBtn.addClass("disabled");
                $(opts.dataLoc).html("");
                $(opts.btnGroupLoc).html("");
                $firstPageBtn.attr({"data-page-index": ""});
                $lastPageBtn.attr({"data-page-index": ""});
                return 0;
            }else {
                $firstPageBtn.removeClass("disabled");
                $lastPageBtn.removeClass("disabled");
                $prevPageBtn.removeClass("disabled");
                $nextPageBtn.removeClass("disabled");
                $firstPageBtn.attr({"data-page-index": 1});
                $lastPageBtn.attr({"data-page-index": pageCount});
            }

        }


        /*
         * 切割数据
         * @param  {number} group    第几组数据
         * @return {data}            截取之后的数据
         */
        function sliceData(group){
            var result = opts.data.slice(0+opts.numOnePage*(group-1), opts.numOnePage+opts.numOnePage*(group-1));
            return result;
        }

        /**
         * 创建翻页按钮,创建的新的翻页视图,视方向而定,选中第一个或者最后一个按钮
         * @param  {number} n                   为第几组翻页按钮
         * @param  {string} direction           翻页方向
         * @return {view}                       返回一个视图
         */
        function pagingBtn(n, direction){
            if(direction == "left"){
                var lengthBtns = opts.numBtnOnePage;
                for(var i = 0, itemList=""; i < lengthBtns; i++){
                    if(i == lengthBtns-1){
                        itemList = itemList + '<li><a class="pure-button pure-button-active nowPage" href="javascript:void(0)" data-page-index="'+Number(opts.numBtnOnePage*(n-1)+Number(i+1))+'">'+Number(opts.numBtnOnePage*(n-1)+(i+1))+'</a></li>';
                    }else{
                        itemList = itemList + '<li><a class="pure-button" href="javascript:void(0)" data-page-index="'+Number(opts.numBtnOnePage*(n-1)+(i+1))+'">'+Number(opts.numBtnOnePage*(n-1)+(i+1))+'</a></li>';
                    }
                }
            }
            if(direction == "right"){
                var remainPage = pageCount-opts.numBtnOnePage*(n-1);
                var lengthBtns = (opts.numBtnOnePage<remainPage)? opts.numBtnOnePage : remainPage;
                for(var i = 0, itemList = ""; i < lengthBtns; i++){
                    if(i == 0){
                        itemList = itemList + '<li><a class="pure-button pure-button-active nowPage" href="javascript:void(0)" data-page-index="'+Number(opts.numBtnOnePage*(n-1)+(i+1))+'">'+Number(opts.numBtnOnePage*(n-1)+(i+1))+'</a></li>';
                    }else{
                        itemList = itemList + '<li><a class="pure-button" href="javascript:void(0)" data-page-index="'+Number(opts.numBtnOnePage*(n-1)+(i+1))+'">'+Number(opts.numBtnOnePage*(n-1)+(i+1))+'</a></li>';
                    }
                }
            }
            $(opts.btnGroupLoc).html(itemList);
        }

        /**
         * [renderTpl description]
         * @param  {selector}    tpl       模板的选择器
         * @param  {json}        pagedata  需要渲染的数据
         * @return {view}                  返回视图
         */
        function renderTpl(tpl, pagedata, dataLoc){
            pagedata[opts.tplParam] = pagedata;
            var source   = $(tpl).html();
            var template = Handlebars.compile(source);
            $(dataLoc).html(template(pagedata));
        }

        function bindEvent(){
            $this.off("click", ".pure-button").on("click", ".pure-button", function(){
                var $thisPage = $(this);
                if($thisPage.attr("data-page-index")!=undefined&&$thisPage.attr("data-page-index")!=""){
                    var thisPageIndex   = $thisPage.attr("data-page-index");
                    var tempData        = sliceData(thisPageIndex);
                    tempData[opts.tplParam] = tempData;
                    renderTpl(opts.tpl, tempData, opts.dataLoc);
                    $thisPage.addClass("pure-button-active nowPage")
                             .parent().siblings().find("a").removeClass("pure-button-active nowPage");
                    if($this.find("[data-page-index="+thisPageIndex+"]").length>1){
                        $this.find("[data-page-index="+thisPageIndex+"]").addClass("pure-button-active nowPage");
                        $this.find("[data-page-index!="+thisPageIndex+"]").removeClass("pure-button-active nowPage");
                    }else {
                        $firstPageBtn.removeClass("pure-button-active nowPage");
                        $lastPageBtn.removeClass("pure-button-active nowPage");
                    }
                    if(pageCount == 1){
                        $prevPageBtn.addClass("disabled");
                        $nextPageBtn.addClass("disabled");
                    }else {
                        if(thisPageIndex == 1) {
                            $prevPageBtn.addClass("disabled");
                            $nextPageBtn.removeClass("disabled");
                        }else if(thisPageIndex == pageCount){
                            $prevPageBtn.removeClass("disabled");
                            $nextPageBtn.addClass("disabled");
                        }else {
                            $prevPageBtn.removeClass("disabled");
                            $nextPageBtn.removeClass("disabled");
                        }
                    }
                }
            });
            $this.off("click", ".pure-button.prev,.pure-button.next")
                 .on("click", ".pure-button.prev,.pure-button.next", function(){
                var $pageSwitch = $(this);
                if($pageSwitch.hasClass("disabled")){
                    return 0;
                }else {
                    var currentPage      = $(opts.btnGroupLoc).find(".pure-button-active.nowPage");
                    var currentPageIndex = currentPage.attr("data-page-index");
                    if($pageSwitch.hasClass("prev")){
                        var prevPageIndex = currentPageIndex - 1;
                        if(currentPageIndex%opts.numBtnOnePage == 1){
                            var nGroup = Math.floor(currentPageIndex/opts.numBtnOnePage);
                            pagingBtn(nGroup, "left");
                            renderTpl(opts.tpl, sliceData(prevPageIndex), opts.dataLoc);
                            $nextPageBtn.removeClass("disabled");
                        }else{
                            $this.find("[data-page-index="+currentPageIndex+"]").removeClass("pure-button-active nowPage");
                            $this.find("[data-page-index="+prevPageIndex+"]").addClass("pure-button-active nowPage");
                            renderTpl(opts.tpl, sliceData(prevPageIndex), opts.dataLoc);
                            $nextPageBtn.removeClass("disabled");
                            if(prevPageIndex == 1){
                                $prevPageBtn.addClass("disabled");
                            }
                        }
                    }else if($pageSwitch.hasClass("next")){
                        var nextPageIndex = Number(currentPageIndex) + 1;
                        if(currentPageIndex%opts.numBtnOnePage == 0){
                            var nGroup = Math.floor(Number(currentPageIndex/opts.numBtnOnePage)+1);
                            pagingBtn(nGroup, "right");
                            renderTpl(opts.tpl, sliceData(nextPageIndex), opts.dataLoc);
                        }else{
                            $this.find("[data-page-index="+currentPageIndex+"]").removeClass("pure-button-active nowPage");
                            $this.find("[data-page-index="+nextPageIndex+"]").addClass("pure-button-active nowPage");
                            renderTpl(opts.tpl, sliceData(nextPageIndex), opts.dataLoc);
                            $prevPageBtn.removeClass("disabled");
                        }
                        if(nextPageIndex == pageCount){
                            $nextPageBtn.addClass("disabled");
                        }
                    }
                }
            });
            $this.off("click", ".pure-button.first,.pure-button.last")
                 .on("click", ".pure-button.first,.pure-button.last", function(){
                var $pageBothEnd  = $(this),
                    currentPage   = $pageBothEnd.attr("data-page-index");
                if(currentPage!=""){
                    if($pageBothEnd.hasClass("first")){
                        if($(opts.btnGroupLoc).filter("li:first").children("a").attr("data-page-index")==1){
                            return 0;
                        }else {
                            pagingBtn(1, "right");
                            $this.find("[data-page-index=1]").addClass("pure-button-active nowPage");
                            $this.find("[data-page-index!=1]").removeClass("pure-button-active nowPage");
                            $prevPageBtn.addClass("disabled");
                        }
                    }else if($pageBothEnd.hasClass("last")){
                        if($(opts.btnGroupLoc).find("li:last").children("a").attr("data-page-index")==pageCount){
                            return 0;
                        }else {
                            pagingBtn(Math.ceil(pageCount/opts.numBtnOnePage), "right");
                            $this.find("[data-page-index="+pageCount+"]").addClass("pure-button-active nowPage");
                            $this.find("[data-page-index!="+pageCount+"]").removeClass("pure-button-active nowPage");
                            $nextPageBtn.addClass("disabled");
                        }                   
                    }
                }
            });
        } 

        /*函数执行入口*/
        $firstPageBtn.removeClass("pure-button-active nowPage");
        $lastPageBtn.removeClass("pure-button-active nowPage");
        $prevPageBtn.removeClass("disabled");
        $nextPageBtn.removeClass("disabled");
        pagingBtn(1, "right");
        $firstPageBtn.addClass("pure-button-active nowPage");
        renderTpl(opts.tpl, sliceData(1), opts.dataLoc);
        if(pageCount == 1){
            $prevPageBtn.addClass("disabled");
            $nextPageBtn.addClass("disabled");
            $firstPageBtn.addClass("pure-button-active nowPage");
            $lastPageBtn.addClass("pure-button-active nowPage");
            bindEvent();
        }else if(pageCount == 0){
            $prevPageBtn.addClass("disabled");
            $nextPageBtn.addClass("disabled");
            $prevPageBtn.addClass("disabled");
            $nextPageBtn.addClass("disabled");
        }else{
            $prevPageBtn.addClass("disabled");
            bindEvent();
        }

    }   
})(jQuery);

总结:根据设置的每页显示的条数和每页要显示的页数,切割获取来的data,绘制页面和绘制新的按钮组。

前端搜索也是对json进行操作,这个方法仅适用相关字段”secCode”和”secAbbr”

function newsSelect(keyword, jsonData) {
  if (keyword == "") {
    return jsonData;
  } else {
    for (var i = 0; i < jsonData.length; {
      if (jsonData[i].secCode.indexOf(keyword) > -1 || jsonData[i].secAbbr.indexOf(keyword) > -1) {
        i++;
      } else {
        jsonData.splice(i, 1);
      }
    }
    return jsonData;
  }
}

欢迎分享本文,转载请保留出处:前端ABC » ajax获取所有数据,前台分页,搜索

分享到:更多 ()

发表评论 0