Administrator
2022-09-14 58d006e05dcf2a20d0ec5367dd03d66a61db6849
提交 | 用户 | 时间
58d006 1 /**
A 2  * @preserve
3  * bootpag - jQuery plugin for dynamic pagination
4  *
5  * Copyright (c) 2015 botmonster@7items.com
6  *
7  * Licensed under the MIT license:
8  *   http://www.opensource.org/licenses/mit-license.php
9  *
10  * Project home:
11  *   http://botmonster.com/jquery-bootpag/
12  *
13  * Version:  1.0.7
14  *
15  */
16 (function($, window) {
17
18     $.fn.bootpag = function(options){
19
20         var $owner = this,
21             settings = $.extend({
22                 total: 0,
23                 page: 1,
24                 maxVisible: null,
25                 leaps: true,
26                 href: 'javascript:void(0);',
27                 hrefVariable: '{{number}}',
28                 next: '»',
29                 prev: '«',
30                 firstLastUse: false,
31                 first: '<span aria-hidden="true">&larr;</span>',
32                 last: '<span aria-hidden="true">&rarr;</span>',
33                 wrapClass: 'pagination',
34                 activeClass: 'active',
35                 disabledClass: 'disabled',
36                 nextClass: 'next',
37                 prevClass: 'prev',
38                 lastClass: 'last',
39                 firstClass: 'first'
40             },
41             $owner.data('settings') || {},
42             options || {});
43
44         if(settings.total <= 0)
45             return this;
46
47           if(!$.isNumeric(settings.maxVisible) && !settings.maxVisible){
48             settings.maxVisible = parseInt(settings.total, 10);
49         }
50
51         $owner.data('settings', settings);
52
53         function renderPage($bootpag, page){
54
55             page = parseInt(page, 10);
56             var lp,
57                 maxV = settings.maxVisible == 0 ? 1 : settings.maxVisible,
58                 step = settings.maxVisible == 1 ? 0 : 1,
59                 vis = Math.floor((page - 1) / maxV) * maxV,
60                 $page = $bootpag.find('li');
61             settings.page = page = page < 0 ? 0 : page > settings.total ? settings.total : page;
62             $page.removeClass(settings.activeClass);
63             lp = page - 1 < 1 ? 1 :
64                     settings.leaps && page - 1 >= settings.maxVisible ?
65                         Math.floor((page - 1) / maxV) * maxV : page - 1;
66
67             if(settings.firstLastUse) {
68                 $page
69                     .first()
70                     .toggleClass(settings.disabledClass, page === 1);
71             }
72
73             var lfirst = $page.first();
74             if(settings.firstLastUse) {
75                 lfirst = lfirst.next();
76             }
77
78             lfirst
79                 .toggleClass(settings.disabledClass, page === 1)
80                 .attr('data-lp', lp)
81                 .find('a').attr('href', href(lp));
82
83             var step = settings.maxVisible == 1 ? 0 : 1;
84
85             lp = page + 1 > settings.total ? settings.total :
86                     settings.leaps && page + 1 < settings.total - settings.maxVisible ?
87                         vis + settings.maxVisible + step: page + 1;
88
89             var llast = $page.last();
90             if(settings.firstLastUse) {
91                 llast = llast.prev();
92             }
93
94             llast
95                 .toggleClass(settings.disabledClass, page === settings.total)
96                 .attr('data-lp', lp)
97                 .find('a').attr('href', href(lp));
98
99             $page
100                 .last()
101                 .toggleClass(settings.disabledClass, page === settings.total);
102
103
104             var $currPage = $page.filter('[data-lp='+page+']');
105
106             var clist = "." + [settings.nextClass,
107                                settings.prevClass,
108                                settings.firstClass,
109                                settings.lastClass].join(",.");
110             if(!$currPage.not(clist).length){
111                 var d = page <= vis ? -settings.maxVisible : 0;
112                 $page.not(clist).each(function(index){
113                     lp = index + 1 + vis + d;
114                     $(this)
115                         .attr('data-lp', lp)
116                         .toggle(lp <= settings.total)
117                         .find('a').html(lp).attr('href', href(lp));
118                 });
119                 $currPage = $page.filter('[data-lp='+page+']');
120             }
121             $currPage.not(clist).addClass(settings.activeClass);
122             $owner.data('settings', settings);
123         }
124
125         function href(c){
126
127             return settings.href.replace(settings.hrefVariable, c);
128         }
129
130         return this.each(function(){
131
132             var $bootpag, lp, me = $(this),
133                 p = ['<ul class="', settings.wrapClass, ' bootpag">'];
134
135             if(settings.firstLastUse){
136                 p = p.concat(['<li data-lp="1" class="', settings.firstClass,
137                        '"><a href="', href(1), '">', settings.first, '</a></li>']);
138             }
139             if(settings.prev){
140                 p = p.concat(['<li data-lp="1" class="', settings.prevClass,
141                        '"><a href="', href(1), '">', settings.prev, '</a></li>']);
142             }
143             for(var c = 1; c <= Math.min(settings.total, settings.maxVisible); c++){
144                 p = p.concat(['<li data-lp="', c, '"><a href="', href(c), '">', c, '</a></li>']);
145             }
146             if(settings.next){
147                 lp = settings.leaps && settings.total > settings.maxVisible
148                     ? Math.min(settings.maxVisible + 1, settings.total) : 2;
149                 p = p.concat(['<li data-lp="', lp, '" class="',
150                              settings.nextClass, '"><a href="', href(lp),
151                              '">', settings.next, '</a></li>']);
152             }
153             if(settings.firstLastUse){
154                 p = p.concat(['<li data-lp="', settings.total, '" class="last"><a href="',
155                              href(settings.total),'">', settings.last, '</a></li>']);
156             }
157             p.push('</ul>');
158             me.find('ul.bootpag').remove();
159             me.append(p.join(''));
160             $bootpag = me.find('ul.bootpag');
161
162             me.find('li').click(function paginationClick(){
163
164                 var me = $(this);
165                 if(me.hasClass(settings.disabledClass) || me.hasClass(settings.activeClass)){
166                     return;
167                 }
168                 var page = parseInt(me.attr('data-lp'), 10);
169                 $owner.find('ul.bootpag').each(function(){
170                     renderPage($(this), page);
171                 });
172
173                 $owner.trigger('page', page);
174             });
175             renderPage($bootpag, settings.page);
176         });
177     }
178
179 })(jQuery, window);