smart table2
此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.greasyfork.org/scripts/482599/1298245/smart%20table.js
(function ($) { "use strict"; $.fn.smartTable = function (options) { var defaults = { // true|false filterOn: true, // true|false sortingOn: true, // true|false hideColumnOn: true, // null|html sortAscHtml: '<span></span>', // null|html sortDescHtml: '<span></span>', // null|html hideColumnHtml: 'x', // null|className zebraClass: 'zebra-odd-bg', // int (0 to disable pagination) paginationPerPage: 10 }; var settings = $.extend({}, defaults, options); var $tbody; return this.each(function () { var $table = $(this); var $thead = $('thead', $table); $tbody = $('tbody', $table); function pageClick(i, $link) { return function() { $('.st-nav-link').removeClass('active'); var page = $link.data('idx'); var start = page * settings.paginationPerPage; var end = start + settings.paginationPerPage; $('tr', $tbody).each(function (tix, tr) { var $tr = $(this); if (tix < start || tix >= end) { $tr.addClass('st-hide'); } else { $tr.removeClass('st-hide'); } }); $link.addClass('active'); }; } if (!$thead.length || !$tbody.length) { window.console.error('I don\'t like tables without thead and tbody'); return; } var $trs = $('tr', $thead); var $headers = $trs.first(); var td_th = $('th', $headers).length ? 'th' : 'td'; var $rows_orig = $('tr', $tbody); var $insert_after = $headers; // filter if (settings.filterOn) { var $filter = $('<tr></tr>').addClass('st-filter-row'); var $inputs = []; var type = 'string'; $(td_th, $headers).each(function (idx, th) { var $th = $(this); $inputs[idx] = $('<input>'); $inputs[idx].data('idx', idx); $inputs[idx].width($th.width()); if ($th.hasClass('st-number')) { $inputs[idx].attr('type', 'number'); } else { $inputs[idx].attr('type', 'text'); type = 'string'; } $inputs[idx].keyup(function () { var $rows = $('tr', $tbody); var $iev = $(this); var idx = parseInt($iev.data('idx')); var search = $iev.val(); for (var i = 0, l = $rows.length; i < l; i++) { var $tr = $($rows[i]); var search_text = $('td:eq(' + idx + ')', $tr).text().toLowerCase(); if (search.length && $iev.attr('type') === 'text' && search_text.indexOf(search) < 0) { $tr.addClass('st-hide'); } else if (search.length && $iev.attr('type') === 'number' && search_text != search) { $tr.addClass('st-hide'); } else { $tr.removeClass('st-hide'); } } paginate(); }); $('<td></td>').append($inputs[idx]).appendTo($filter); }); $filter.insertAfter($insert_after); $insert_after = $filter; } // buttons var $sort_rows = $rows_orig.clone(); if (settings.sortingOn || settings.hideColumnOn) { var $buttons = $('<tr></tr>').addClass('st-buttons-row'); $(td_th, $headers).each(function (idx, th) { var $th = $(this); var is_number = $th.hasClass('st-number'); var is_money = $th.hasClass('st-money'); var $btn_td = $('<td></td>'); if (settings.sortingOn) { // sort ascending var $sort_asc = $('<span></span>').addClass('st-btn st-sort-btn st-sort-asc').html(settings.sortAscHtml); $sort_asc.click(function () { $('.st-sort-btn').removeClass('active'); $(this).addClass('active'); $sort_rows.sort(function (a, b) { var text_a = $($('td:eq(' + idx + ')', a)[0]).text(); var text_b = $($('td:eq(' + idx + ')', b)[0]).text(); if (is_number) { text_a = parseFloat(text_a); text_b = parseFloat(text_b); } else if (is_money) { text_a = parseFloat(text_a.replace(/[^\d\.\-]/g, '')); text_b = parseFloat(text_b.replace(/[^\d\.\-]/g, '')); } if (text_a === text_b) { return 0; } else { return (text_a > text_b ? 1 : -1); } }); $('tr', $tbody).remove(); $tbody.append($sort_rows); }); // sort descending var $sort_desc = $('<span></span>').addClass('st-btn st-sort-btn st-sort-desc').html(settings.sortDescHtml); $sort_desc.click(function () { $('.st-sort-btn').removeClass('active'); $(this).addClass('active'); $sort_rows.sort(function (a, b) { var text_a = $($('td:eq(' + idx + ')', a)[0]).text(); var text_b = $($('td:eq(' + idx + ')', b)[0]).text(); if (is_number) { text_a = parseFloat(text_a); text_b = parseFloat(text_b); } else if (is_money) { text_a = parseFloat(text_a.replace(/[^\d\.\-]/g, '')); text_b = parseFloat(text_b.replace(/[^\d\.\-]/g, '')); } if (text_a === text_b) { return 0; } else { return (text_a < text_b ? 1 : -1); } }); $('tr', $tbody).remove(); $tbody.append($sort_rows); }); $btn_td.append($sort_asc).append($sort_desc); } // hide columns if (settings.hideColumnOn) { var $hide_col = $('<span></span>').addClass('st-btn st-close').html(settings.hideColumnHtml); $hide_col.click(function () { $('tr', $table).each(function () { $($('td:eq(' + idx + '), th:eq(' + idx + ')', $(this))[0]).addClass('st-hide st-hide-col'); }); // update table rows $trs = $('tr', $thead); $rows_orig = $('tr', $tbody); $sort_rows = $rows_orig.clone(); $headers = $trs.first(); }); $btn_td.append($hide_col); } $btn_td.appendTo($buttons); }); $buttons.insertAfter($insert_after); $insert_after = $buttons; } // zebra if (settings.zebraClass !== null) { $('tr:nth-child(odd)', $tbody).addClass(settings.zebraClass); } // pagination function paginate() { if (settings.paginationPerPage > 0) { var $nav_bar = $('.st-nav-bar'); if ($nav_bar.length) { $nav_bar.html(''); } var page = 0; var total = $('tr:not(.st-hide)', $tbody).length; var page_count = Math.floor(total / settings.paginationPerPage); if (page_count > 0) { var $link1 = null; if (!$nav_bar.length) { $nav_bar = $('<td></td>').addClass('st-nav-bar').attr('colspan', $(td_th, $headers).length); } for (var i = 0; i < page_count; i++) { var $link = $('<span></span>').data('idx', i).addClass('st-nav-link').html(i + 1); $link.on('click', pageClick(i, $link)); if ($link1 === null) { $link1 = $link; } $link.appendTo($nav_bar); } var $nav_bar_row = $('.st-nav-bar-row'); if (!$nav_bar_row.length) { $nav_bar_row = $('<tr></tr>').addClass('st-nav-bar-row'); } $nav_bar_row.append($nav_bar); //$nav_bar_row.insertAfter($insert_after); //$insert_after = $nav_bar_row; var $tfoot = $('tfoot', $table); if (!$tfoot.length) { $tfoot = $('<tfoot></tfoot>'); } $tfoot.append($nav_bar_row); $tfoot.insertAfter($tbody); $link1.click(); } } } paginate(); }); }; }(jQuery));