JavaScript学习之路——分页类

在之前开发项目中,就一直想写一个分页类来去完成一些小数据的页面分页渲染工作。再之前工作的时候又不想调用第三方插件。所以基本上在展示数据量比较少的页面的时候,就直接用滚动来解决了。直到昨天有位新人问起分页相关问题的时候,发现自己的类库中始终缺少这么一个基本插件。于是趁着刚好有时间,赶紧写了一个,功能上勉强凑合着用。

总结:
在写的时候遇上了点小麻烦,根本原因在于对JavaScript中的对象概念理解不够深。在给对象中一个变量赋值自身某个对象属性的时候,其赋值结果是将该对象的地址赋值给该变量,而非变量值。自己编了一个小例子,加深理解。
代码:

var person  = {
    who : function() {
        this.student = {
            name : 'jack'
        };

        console.log(this.student.name); // jack
        var me = this.getPerson();
        me.name = 'tom'; // 原以为是me获取到的是student的值,其实是地址。所以在这里me就是this.student。
        console.log(this.student.name) // tom
    }
    getPerson : function() {
        return this.student;
    }
}
// @charset "utf-8";
/**
 * @function : 分页小插件
 * @author   : yinggaozhen
 * @create   : 2016-03-25 19:07
 * @version  : 0.0.0
 * @example  : 
    $('#page').pageshow({
        data        : data,    // 必须为数组
        style       : 'manu',  // 样式显示
        perPage     : 4,       // 每页显示
        renderFunc  : function(callbackdata) {
            console.log(callbackdata); // 当前页数数据
        }
    });
 */
 (function($, window, undefined) {
    var ext = 'pageshow';

    var DEFAULT = {
        data        : [],
        style       : 'manu',
        perPage     : 10,
        rollPage    : 5,
        jumpTag     : 'gz-jump-page',
        renderTpl   :   {
            first       : '首页',
            last        : '末页',
            prev        : '上一页',
            next        : '下一页',
            header      : '条记录',
            theme       : '%totalRow% %header% %nowPage%/%totalPage% %first%  %prevPage%  %linkPage% %nextPage% %last%'
        },
        renderFunc : function() {}
    };

    var PageShow = function(element, option) {
        this.init(element, option);
    };

    PageShow.prototype = {
        init : function(element, option) {
            this.$el 		= $(element);
            this.opt        = option;
            this.renderData = {};

            var totalRow  = this.opt.data.length || 0,
                totalPage = Math.ceil(totalRow / parseInt(this.opt.perPage));

            this.setRenderData({
                nowPage     : 1,
                totalRow    : totalRow,
                totalPage   : totalPage,
                header      : this.opt.renderTpl.header
            });

            this.$el.addClass(this.opt.style);

            this.bindEvt();
            this.pageshow();
        },

        bindEvt : function() {
            var me = this;

            me.$el.on('click', '['+ me.opt.jumpTag + ']', function(e) {
                if(!me.setNowPage($(this).attr(me.opt.jumpTag))) return;

                me.pageshow();
                me.opt.renderFunc(me.getLinkData());
            });
        },

        pageshow : function() {
            var me  = this;

            me.$el.empty();


            var renderData = me.getRenderData('', false);
            if (!renderData.totalRow) return '';

            var nowRollPage = Math.ceil(renderData.nowPage / me.opt.rollPage);

            // 上一页
            if (renderData.nowPage - 1 > 0) {
                renderData.prevPage = me.getRenderTag(renderData.nowPage - 1, me.opt.renderTpl['prev']);
            }

            // 下一页
            if (renderData.nowPage + 1 < renderData.totalPage) {
                renderData.nextPage = me.getRenderTag(renderData.nowPage + 1, me.opt.renderTpl['next']);    
            }

            // 首页
            if (renderData.nowPage !== 1) {
                renderData.first = me.getRenderTag(1, me.opt.renderTpl['first']);
            }

            // 尾页
            if (renderData.nowPage !== renderData.totalPage) {
                renderData.last = me.getRenderTag(renderData.totalPage, me.opt.renderTpl['last']);
            }

            renderData.linkPage = '';
            for (var i = 1; i <= me.opt.rollPage; i++) {
                var nPage  = (nowRollPage - 1) * me.opt.rollPage + i;

                if (nPage > renderData.totalPage) continue;
                renderData.linkPage += me.getRenderTag(nPage, '第' + nPage + '页   ', nPage == renderData.nowPage ? 'current' : '');
            }

            me.$el.append(me.opt.renderTpl.theme.replace(/%(\w+)%/g, function(p, $1) {
                return renderData[$1] ? renderData[$1] : '';
            }));
        },

        setRenderData : function(newRenderData) {
            var me = this;
            me.renderData = $.extend({}, me.getRenderData(), newRenderData);
        },

        getRenderData : function(key, isProp) {
            key     = key || '';
            isProp  = isProp === false ? false : true;

            if (key === '') return isProp ? (this.renderData || {}): $.extend({}, this.renderData);
            return typeof this.renderData[key] !== 'undefined' ? this.renderData[key] : '';
        },

        getLinkData : function() {
            var startRow = (this.getRenderData().nowPage - 1) * this.opt.perPage,
                endRow   = startRow + this.opt.perPage;

            return this.opt.data.slice(startRow, endRow);
        },

        setNowPage : function(page) {
            page = page && parseInt(page);
            if (!page) return false;

            return this.getRenderData().nowPage = page;
        },

        getRenderTag : function(jumpPage, jumpName, jumpStyle) {
            return $('<a>').attr(this.opt.jumpTag, jumpPage).html(jumpName).addClass(jumpStyle).prop('outerHTML');
        }
    };

    var Plugins = function(option) {
        option = $.extend(true, {}, DEFAULT, option);
        return this.each(function() {
            new PageShow(this, option);
        });
    };

    $.fn[ext] = Plugins;
 })(jQuery, window);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值