<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://81.70.248.142/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-Filterable.js</id>
	<title>MediaWiki:Gadget-Filterable.js - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://81.70.248.142/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-Filterable.js"/>
	<link rel="alternate" type="text/html" href="http://81.70.248.142/index.php?title=MediaWiki:Gadget-Filterable.js&amp;action=history"/>
	<updated>2026-06-13T05:47:22Z</updated>
	<subtitle>本wiki的该页面的版本历史</subtitle>
	<generator>MediaWiki 1.36.2</generator>
	<entry>
		<id>http://81.70.248.142/index.php?title=MediaWiki:Gadget-Filterable.js&amp;diff=1748&amp;oldid=prev</id>
		<title>Jienachou：创建页面，内容为“/* experimental filterable table function */ (function(mw, $) {     'use strict';     var filterIdCounter = 0;     var filterButtons = [];     var filterInputs = [];…”</title>
		<link rel="alternate" type="text/html" href="http://81.70.248.142/index.php?title=MediaWiki:Gadget-Filterable.js&amp;diff=1748&amp;oldid=prev"/>
		<updated>2022-07-11T13:37:59Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;experimental filterable table function：&lt;/span&gt; (function(mw, $) {     &amp;#039;use strict&amp;#039;;     var filterIdCounter = 0;     var filterButtons = [];     var filterInputs = [];…”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* experimental filterable table function */&lt;br /&gt;
(function(mw, $) {&lt;br /&gt;
    'use strict';&lt;br /&gt;
    var filterIdCounter = 0;&lt;br /&gt;
    var filterButtons = [];&lt;br /&gt;
    var filterInputs = [];&lt;br /&gt;
    var fb = new AttrData('filterable');&lt;br /&gt;
    var fbh = new AttrData('filterable-head');&lt;br /&gt;
    var fbb = new AttrData('filterable-button');&lt;br /&gt;
    var fbi = new AttrData('filterable-input');&lt;br /&gt;
    var fbig = new AttrData('filterable-input-group');&lt;br /&gt;
    function AttrData(name) {&lt;br /&gt;
        this.name = name;&lt;br /&gt;
        this.classSelector = '.' + name;&lt;br /&gt;
        this.activeClass = name + '-active';&lt;br /&gt;
        this.idPrefix = name + '-';&lt;br /&gt;
        this.idSelectorPrefix = '#' + name + '-';&lt;br /&gt;
    }&lt;br /&gt;
    function FilterButton($filterHead, filterid) {&lt;br /&gt;
        this.id = filterid;&lt;br /&gt;
        var $filterbutton = $('&amp;lt;span title=&amp;quot;筛选&amp;quot; id=&amp;quot;' + fbb.idPrefix + this.id + '&amp;quot; class=&amp;quot;' + fbb.name + '&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa fa-filter&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;');&lt;br /&gt;
        $filterHead.append($filterbutton);&lt;br /&gt;
        $filterbutton.click(this.id, function(event) {&lt;br /&gt;
            event.stopPropagation();&lt;br /&gt;
            var filterinputid = $(this).attr('id').replace(fbb.idPrefix, fbi.idPrefix);&lt;br /&gt;
            for (var i = 0; i &amp;lt;= filterIdCounter; i++) {&lt;br /&gt;
                if (fbi.idPrefix + i === filterinputid) {&lt;br /&gt;
                    continue;&lt;br /&gt;
                }&lt;br /&gt;
                if ($(fbi.idSelectorPrefix + i).css('display') !== 'none') {&lt;br /&gt;
                    $(fbi.idSelectorPrefix + i).fadeToggle();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            $('#' + filterinputid).fadeToggle(200);&lt;br /&gt;
            updateFilterableInputPosition(event.data);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    function FilterInput(filterid) {&lt;br /&gt;
        this.id = filterid;&lt;br /&gt;
        var index = $(fbb.idSelectorPrefix + filterid).parent('th,td').index();&lt;br /&gt;
        var filterItems = new Set();&lt;br /&gt;
        var filterInputItemsPart = '';&lt;br /&gt;
        $(fbb.idSelectorPrefix + filterid).parent('td,th').parent('tr').parent('thead,tbody,tfoot').parent(fb.classSelector).children('tbody').children('tr').each(function() {&lt;br /&gt;
            if ($(this).children('td,th').eq(index).text() &amp;amp;&amp;amp; !$(this).children('td,th').eq(index).hasClass(fbh.name)) {&lt;br /&gt;
                filterItems.add($(this).children('td,th').eq(index).text());&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        if (filterItems.size &amp;gt; 0) {&lt;br /&gt;
            filterInputItemsPart += '&amp;lt;li role=&amp;quot;separator&amp;quot;class=&amp;quot;divider&amp;quot;&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li class=&amp;quot;dropdown-header&amp;quot;&amp;gt;项目筛选：&amp;lt;/li&amp;gt;&amp;lt;li class=&amp;quot;dropdown-content&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;btn-group btn-group-justified&amp;quot;role=&amp;quot;group&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;btn-group btn-group-sm&amp;quot;role=&amp;quot;group&amp;quot;&amp;gt;&amp;lt;button type=&amp;quot;button&amp;quot;class=&amp;quot;btn btn-success checkbox-select-all&amp;quot;&amp;gt;全选&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;btn-group btn-group-sm&amp;quot;role=&amp;quot;group&amp;quot;&amp;gt;&amp;lt;button type=&amp;quot;button&amp;quot;class=&amp;quot;btn btn-warning checkbox-clear-all&amp;quot;&amp;gt;全清&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li class=&amp;quot;dropdown-content&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;checkbox-group list-group&amp;quot;&amp;gt;';&lt;br /&gt;
            filterItems.forEach(function(value) {&lt;br /&gt;
                filterInputItemsPart += '&amp;lt;div class=&amp;quot;list-group-item&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; checked=&amp;quot;true&amp;quot; value=&amp;quot;' + value + '&amp;quot; /&amp;gt;&amp;lt;span title=&amp;quot;' + value + '&amp;quot;&amp;gt;' + value + '&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;';&lt;br /&gt;
            });&lt;br /&gt;
            filterInputItemsPart += '&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;'&lt;br /&gt;
        }&lt;br /&gt;
        var $filterinput = $('&amp;lt;ul id=&amp;quot;' + fbi.idPrefix + filterid + '&amp;quot;class=&amp;quot;' + fbig.name + ' dropdown-menu&amp;quot;&amp;gt;&amp;lt;li class=&amp;quot;dropdown-header&amp;quot;&amp;gt;字段筛选：&amp;lt;/li&amp;gt;&amp;lt;li class=&amp;quot;dropdown-content&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;input-group input-group-sm&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot;class=&amp;quot;' + fbi.name + ' form-control&amp;quot;placeholder=&amp;quot;输入筛选字段&amp;quot;/&amp;gt;&amp;lt;span class=&amp;quot;input-group-btn&amp;quot;&amp;gt;&amp;lt;button class=&amp;quot;btn btn-warning btn-sm&amp;quot;type=&amp;quot;button&amp;quot;&amp;gt;清除&amp;lt;/button&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;' + filterInputItemsPart + '&amp;lt;/ul&amp;gt;');&lt;br /&gt;
        $(document.body).append($filterinput);&lt;br /&gt;
        $filterinput.find('.input-group input').keyup(function(event) {&lt;br /&gt;
            var filterid = $(this).parent('.input-group').parent('.dropdown-content').parent(fbig.classSelector).attr('id').match(/[0-9]+/);&lt;br /&gt;
            updateFilterButtonState(filterid);&lt;br /&gt;
            filterTable($(fbb.idSelectorPrefix + filterid).parent('td,th').parent('tr').parent('thead,tbody,tfoot').parent(fb.classSelector));&lt;br /&gt;
        });&lt;br /&gt;
        $filterinput.click(function(event) {&lt;br /&gt;
            event.stopPropagation();&lt;br /&gt;
        });&lt;br /&gt;
        $filterinput.find('.input-group-btn').click(function(event) {&lt;br /&gt;
            var filterid = $(this).parent('.input-group').parent('.dropdown-content').parent(fbig.classSelector).attr('id').match(/[0-9]+/);&lt;br /&gt;
            $(this).prev().val('');&lt;br /&gt;
            updateFilterButtonState(filterid);&lt;br /&gt;
            filterTable($(fbb.idSelectorPrefix + filterid).parent('td,th').parent('tr').parent('thead,tbody,tfoot').parent(fb.classSelector));&lt;br /&gt;
        });&lt;br /&gt;
        $filterinput.find('.checkbox-group input').click(function(event) {&lt;br /&gt;
            var filterid = $(this).parent('.list-group-item').parent('.checkbox-group').parent('.dropdown-content').parent(fbig.classSelector).attr('id').match(/[0-9]+/);&lt;br /&gt;
            updateFilterButtonState(filterid);&lt;br /&gt;
            filterTable($(fbb.idSelectorPrefix + filterid).parent('td,th').parent('tr').parent('thead,tbody,tfoot').parent(fb.classSelector));&lt;br /&gt;
        });&lt;br /&gt;
        $filterinput.find('.checkbox-select-all').click(function(event) {&lt;br /&gt;
            var filterid = $(this).parent('.btn-group').parent('.btn-group').parent('.dropdown-content').parent(fbig.classSelector).attr('id').match(/[0-9]+/);&lt;br /&gt;
            $(fbi.idSelectorPrefix + filterid + ' .checkbox-group input').prop('checked', true);&lt;br /&gt;
            updateFilterButtonState(filterid);&lt;br /&gt;
            filterTable($(fbb.idSelectorPrefix + filterid).parent('td,th').parent('tr').parent('thead,tbody,tfoot').parent(fb.classSelector));&lt;br /&gt;
        });&lt;br /&gt;
        $filterinput.find('.checkbox-clear-all').click(function(event) {&lt;br /&gt;
            var filterid = $(this).parent('.btn-group').parent('.btn-group').parent('.dropdown-content').parent(fbig.classSelector).attr('id').match(/[0-9]+/);&lt;br /&gt;
            $(fbi.idSelectorPrefix + filterid + ' .checkbox-group input').prop('checked', false);&lt;br /&gt;
            updateFilterButtonState(filterid);&lt;br /&gt;
            filterTable($(fbb.idSelectorPrefix + filterid).parent('td,th').parent('tr').parent('thead,tbody,tfoot').parent(fb.classSelector));&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    function updateFilterButtonState(id) {&lt;br /&gt;
        var keyword = $(fbi.idSelectorPrefix + id + ' .input-group input').val();&lt;br /&gt;
        var items = $(fbi.idSelectorPrefix + id + ' .checkbox-group input:not(:checked)');&lt;br /&gt;
        if (keyword || items.length) {&lt;br /&gt;
            $(fbb.idSelectorPrefix + id).addClass(fbb.activeClass);&lt;br /&gt;
        } else {&lt;br /&gt;
            $(fbb.idSelectorPrefix + id).removeClass(fbb.activeClass);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    function setupFilterable($filterable) {&lt;br /&gt;
        $filterable.children('thead,tbody,tfoot').children('tr').children(fbh.classSelector).each(function() {&lt;br /&gt;
            filterButtons.push(new FilterButton($(this),filterIdCounter));&lt;br /&gt;
            filterInputs.push(new FilterInput(filterIdCounter));&lt;br /&gt;
            filterIdCounter++;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    function updateFilterableInputPosition(id) {&lt;br /&gt;
        var $filterinput = $(fbi.idSelectorPrefix + id);&lt;br /&gt;
        var $filtericon = $(fbb.idSelectorPrefix + id);&lt;br /&gt;
        var offset = $filtericon.offset();&lt;br /&gt;
        var top = offset.top + $filtericon.height();&lt;br /&gt;
        var left = offset.left - ($filterinput.width() / 2);&lt;br /&gt;
        var right = left + $filterinput.width();&lt;br /&gt;
        var bottom = top + $filterinput.height();&lt;br /&gt;
        if (left &amp;lt; 0) {&lt;br /&gt;
            left = 0;&lt;br /&gt;
        } else if (right &amp;gt; $(document).width()) {&lt;br /&gt;
            left = $(document).width() - $filterinput.width();&lt;br /&gt;
        }&lt;br /&gt;
        if (bottom &amp;gt; $(document).height()) {&lt;br /&gt;
            top = $(document).height() - $filterinput.height();&lt;br /&gt;
        }&lt;br /&gt;
        $filterinput.offset({&lt;br /&gt;
            top: top,&lt;br /&gt;
            left: left,&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    function filterTable($filterabletable) {&lt;br /&gt;
        if (window.filterTimeoutId) {&lt;br /&gt;
            window.clearTimeout(window.filterTimeoutId);&lt;br /&gt;
            window.filterTimeoutId = null ;&lt;br /&gt;
        }&lt;br /&gt;
        window.filterTimeoutId = window.setTimeout(function() {&lt;br /&gt;
            var filters = {};&lt;br /&gt;
            $filterabletable.children('thead,tbody,tfoot').children('tr').children('th,td').children(fbb.classSelector).each(function() {&lt;br /&gt;
                var index = $(this).parent('th,td').index();&lt;br /&gt;
                filters[index] = {};&lt;br /&gt;
                var $filterInput = $('#' + $(this).attr('id').replace(fbb.idPrefix, fbi.idPrefix));&lt;br /&gt;
                filters[index].items = [];&lt;br /&gt;
                $filterInput.find('.checkbox-group input:not(:checked)').each(function() {&lt;br /&gt;
                    filters[index].items.push($(this).val());&lt;br /&gt;
                });&lt;br /&gt;
                filters[index].keyword = $filterInput.find('.input-group input').val().replace(/[.?*+^$[\]\\(){}|-]/g, &amp;quot;\\$&amp;amp;&amp;quot;);&lt;br /&gt;
            });&lt;br /&gt;
            $filterabletable.children('tbody').children('tr').each(function() {&lt;br /&gt;
                for (var col in filters) {&lt;br /&gt;
                    if (filters.hasOwnProperty(col)) {&lt;br /&gt;
                        var $cell = $(this).children('td,th').eq(col);&lt;br /&gt;
                        if ($cell.length === 0) {&lt;br /&gt;
                        	console.log('Filterable: Cannot find target cell(colspan?), skipping...')&lt;br /&gt;
                        	return;&lt;br /&gt;
                        }&lt;br /&gt;
                        if ($cell.hasClass(fbh.name)) {&lt;br /&gt;
                            return;&lt;br /&gt;
                        }&lt;br /&gt;
                        var keywordRegex = new RegExp(filters[col].keyword,'i');&lt;br /&gt;
                        if (!keywordRegex.test($cell.text())) {&lt;br /&gt;
                            $(this).hide();&lt;br /&gt;
                            return;&lt;br /&gt;
                        }&lt;br /&gt;
                        for (var item in filters[col].items) {&lt;br /&gt;
                            if (filters[col].items[item] == $cell.text()) {&lt;br /&gt;
                                $(this).hide();&lt;br /&gt;
                                return;&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                $(this).show();&lt;br /&gt;
            });&lt;br /&gt;
        }, 500);&lt;br /&gt;
    }&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
        if ($(fb.classSelector).length === 0) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        console.log('Filterable: Loading module...');&lt;br /&gt;
        $(fb.classSelector).each(function() {&lt;br /&gt;
        	if ($(this).prop('tagName') !== 'TABLE') {&lt;br /&gt;
        		console.log('Filterable: Invalid tag found, skipping...');&lt;br /&gt;
        		return;&lt;br /&gt;
        	}&lt;br /&gt;
            setupFilterable($(this));&lt;br /&gt;
        });&lt;br /&gt;
        &lt;br /&gt;
        $(window).resize(function(event) {&lt;br /&gt;
            for (var i = 0; i &amp;lt;= filterIdCounter; i++) {&lt;br /&gt;
                updateFilterableInputPosition(i);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        $(window).click(function() {&lt;br /&gt;
            for (var i = 0; i &amp;lt;= filterIdCounter; i++) {&lt;br /&gt;
                if ($(fbi.idSelectorPrefix + i).css('display') !== 'none') {&lt;br /&gt;
                    $(fbi.idSelectorPrefix + i).fadeToggle();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
}(mediaWiki, jQuery));&lt;/div&gt;</summary>
		<author><name>Jienachou</name></author>
	</entry>
</feed>