smart table

smart table2

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/482599/1298245/smart%20table.js

  1. (function ($) {
  2. "use strict";
  3. $.fn.smartTable = function (options) {
  4. var defaults = {
  5. // true|false
  6. filterOn: true,
  7. // true|false
  8. sortingOn: true,
  9. // true|false
  10. hideColumnOn: true,
  11. // null|html
  12. sortAscHtml: '<span></span>',
  13. // null|html
  14. sortDescHtml: '<span></span>',
  15. // null|html
  16. hideColumnHtml: 'x',
  17. // null|className
  18. zebraClass: 'zebra-odd-bg',
  19. // int (0 to disable pagination)
  20. paginationPerPage: 10
  21. };
  22.  
  23. var settings = $.extend({}, defaults, options);
  24. var $tbody;
  25.  
  26. return this.each(function () {
  27. var $table = $(this);
  28. var $thead = $('thead', $table);
  29. $tbody = $('tbody', $table);
  30. function pageClick(i, $link) {
  31. return function() {
  32. $('.st-nav-link').removeClass('active');
  33. var page = $link.data('idx');
  34. var start = page * settings.paginationPerPage;
  35. var end = start + settings.paginationPerPage;
  36. $('tr', $tbody).each(function (tix, tr) {
  37. var $tr = $(this);
  38. if (tix < start || tix >= end) {
  39. $tr.addClass('st-hide');
  40. } else {
  41. $tr.removeClass('st-hide');
  42. }
  43. });
  44. $link.addClass('active');
  45. };
  46. }
  47. if (!$thead.length || !$tbody.length) {
  48. window.console.error('I don\'t like tables without thead and tbody');
  49. return;
  50. }
  51. var $trs = $('tr', $thead);
  52. var $headers = $trs.first();
  53. var td_th = $('th', $headers).length ? 'th' : 'td';
  54. var $rows_orig = $('tr', $tbody);
  55. var $insert_after = $headers;
  56. // filter
  57. if (settings.filterOn) {
  58. var $filter = $('<tr></tr>').addClass('st-filter-row');
  59. var $inputs = [];
  60. var type = 'string';
  61. $(td_th, $headers).each(function (idx, th) {
  62. var $th = $(this);
  63. $inputs[idx] = $('<input>');
  64. $inputs[idx].data('idx', idx);
  65. $inputs[idx].width($th.width());
  66. if ($th.hasClass('st-number')) {
  67. $inputs[idx].attr('type', 'number');
  68. } else {
  69. $inputs[idx].attr('type', 'text');
  70. type = 'string';
  71. }
  72. $inputs[idx].keyup(function () {
  73. var $rows = $('tr', $tbody);
  74. var $iev = $(this);
  75. var idx = parseInt($iev.data('idx'));
  76. var search = $iev.val();
  77. for (var i = 0, l = $rows.length; i < l; i++) {
  78. var $tr = $($rows[i]);
  79. var search_text = $('td:eq(' + idx + ')', $tr).text().toLowerCase();
  80. if (search.length && $iev.attr('type') === 'text' && search_text.indexOf(search) < 0) {
  81. $tr.addClass('st-hide');
  82. } else if (search.length && $iev.attr('type') === 'number' && search_text != search) {
  83. $tr.addClass('st-hide');
  84. } else {
  85. $tr.removeClass('st-hide');
  86. }
  87. }
  88. paginate();
  89. });
  90. $('<td></td>').append($inputs[idx]).appendTo($filter);
  91. });
  92. $filter.insertAfter($insert_after);
  93. $insert_after = $filter;
  94. }
  95. // buttons
  96. var $sort_rows = $rows_orig.clone();
  97. if (settings.sortingOn || settings.hideColumnOn) {
  98. var $buttons = $('<tr></tr>').addClass('st-buttons-row');
  99. $(td_th, $headers).each(function (idx, th) {
  100. var $th = $(this);
  101. var is_number = $th.hasClass('st-number');
  102. var is_money = $th.hasClass('st-money');
  103. var $btn_td = $('<td></td>');
  104. if (settings.sortingOn) {
  105. // sort ascending
  106. var $sort_asc = $('<span></span>').addClass('st-btn st-sort-btn st-sort-asc').html(settings.sortAscHtml);
  107. $sort_asc.click(function () {
  108. $('.st-sort-btn').removeClass('active');
  109. $(this).addClass('active');
  110. $sort_rows.sort(function (a, b) {
  111. var text_a = $($('td:eq(' + idx + ')', a)[0]).text();
  112. var text_b = $($('td:eq(' + idx + ')', b)[0]).text();
  113. if (is_number) {
  114. text_a = parseFloat(text_a);
  115. text_b = parseFloat(text_b);
  116. } else if (is_money) {
  117. text_a = parseFloat(text_a.replace(/[^\d\.\-]/g, ''));
  118. text_b = parseFloat(text_b.replace(/[^\d\.\-]/g, ''));
  119. }
  120. if (text_a === text_b) {
  121. return 0;
  122. } else {
  123. return (text_a > text_b ? 1 : -1);
  124. }
  125. });
  126. $('tr', $tbody).remove();
  127. $tbody.append($sort_rows);
  128. });
  129. // sort descending
  130. var $sort_desc = $('<span></span>').addClass('st-btn st-sort-btn st-sort-desc').html(settings.sortDescHtml);
  131. $sort_desc.click(function () {
  132. $('.st-sort-btn').removeClass('active');
  133. $(this).addClass('active');
  134. $sort_rows.sort(function (a, b) {
  135. var text_a = $($('td:eq(' + idx + ')', a)[0]).text();
  136. var text_b = $($('td:eq(' + idx + ')', b)[0]).text();
  137. if (is_number) {
  138. text_a = parseFloat(text_a);
  139. text_b = parseFloat(text_b);
  140. } else if (is_money) {
  141. text_a = parseFloat(text_a.replace(/[^\d\.\-]/g, ''));
  142. text_b = parseFloat(text_b.replace(/[^\d\.\-]/g, ''));
  143. }
  144. if (text_a === text_b) {
  145. return 0;
  146. } else {
  147. return (text_a < text_b ? 1 : -1);
  148. }
  149. });
  150. $('tr', $tbody).remove();
  151. $tbody.append($sort_rows);
  152. });
  153. $btn_td.append($sort_asc).append($sort_desc);
  154. }
  155. // hide columns
  156. if (settings.hideColumnOn) {
  157. var $hide_col = $('<span></span>').addClass('st-btn st-close').html(settings.hideColumnHtml);
  158. $hide_col.click(function () {
  159. $('tr', $table).each(function () {
  160. $($('td:eq(' + idx + '), th:eq(' + idx + ')', $(this))[0]).addClass('st-hide st-hide-col');
  161. });
  162. // update table rows
  163. $trs = $('tr', $thead);
  164. $rows_orig = $('tr', $tbody);
  165. $sort_rows = $rows_orig.clone();
  166. $headers = $trs.first();
  167. });
  168. $btn_td.append($hide_col);
  169. }
  170.  
  171. $btn_td.appendTo($buttons);
  172. });
  173. $buttons.insertAfter($insert_after);
  174. $insert_after = $buttons;
  175. }
  176. // zebra
  177. if (settings.zebraClass !== null) {
  178. $('tr:nth-child(odd)', $tbody).addClass(settings.zebraClass);
  179. }
  180. // pagination
  181. function paginate() {
  182. if (settings.paginationPerPage > 0) {
  183. var $nav_bar = $('.st-nav-bar');
  184. if ($nav_bar.length) {
  185. $nav_bar.html('');
  186. }
  187. var page = 0;
  188. var total = $('tr:not(.st-hide)', $tbody).length;
  189. var page_count = Math.floor(total / settings.paginationPerPage);
  190. if (page_count > 0) {
  191. var $link1 = null;
  192. if (!$nav_bar.length) {
  193. $nav_bar = $('<td></td>').addClass('st-nav-bar').attr('colspan', $(td_th, $headers).length);
  194. }
  195. for (var i = 0; i < page_count; i++) {
  196. var $link = $('<span></span>').data('idx', i).addClass('st-nav-link').html(i + 1);
  197. $link.on('click', pageClick(i, $link));
  198. if ($link1 === null) {
  199. $link1 = $link;
  200. }
  201. $link.appendTo($nav_bar);
  202. }
  203. var $nav_bar_row = $('.st-nav-bar-row');
  204. if (!$nav_bar_row.length) {
  205. $nav_bar_row = $('<tr></tr>').addClass('st-nav-bar-row');
  206. }
  207. $nav_bar_row.append($nav_bar);
  208. //$nav_bar_row.insertAfter($insert_after);
  209. //$insert_after = $nav_bar_row;
  210. var $tfoot = $('tfoot', $table);
  211. if (!$tfoot.length) {
  212. $tfoot = $('<tfoot></tfoot>');
  213. }
  214. $tfoot.append($nav_bar_row);
  215. $tfoot.insertAfter($tbody);
  216. $link1.click();
  217. }
  218. }
  219. }
  220. paginate();
  221. });
  222. };
  223.  
  224. }(jQuery));

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址