【问题标题】:javascript hide row in table local storagejavascript在表本地存储中隐藏行
【发布时间】:2013-10-08 14:00:17
【问题描述】:

我使用这个公式来隐藏整个 HTML 表格。

function tableExpander(tableId) {
    // Our flag to determine if rows are hidden or not
    var rowsVisible = localStorage.getItem('rowsVisible-'+tableId),
        // Table handler
        table = document.getElementById(tableId);

    // "rowHidden" not exists in localStorage yet
    if (rowsVisible === null) {
        rowsVisible = true;
    } else {
       // localStorage return string
        rowsVisible = rowsVisible === 'true' ? true : false;
    }

    toggleDisplay(table, rowsVisible ? '' : 'none');

    table.getElementsByClassName('toggleBtn')[0].addEventListener('click', function() {
        toggleDisplay(table);
    }, false);

    function toggleDisplay(tbl) {    
        var tblRows = table.rows,
            mode = rowsVisible ? '' : 'none';

        for (i = 0; i < tblRows.length; i++) {
            if (tblRows[i].className != "headerRow") {
                tblRows[i].style.display = mode;
            }
        }

        localStorage.setItem('rowsVisible-'+tableId, rowsVisible);
        rowsVisible = !rowsVisible;
    };    
};

tableExpander('table');
tableExpander('table1');

如何修改它以一次仅隐藏 1 行并在隐藏时将按钮颜色更改为红色?这里的例子http://jsfiddle.net/SXAZ4/85/

【问题讨论】:

    标签: javascript local-storage html-table


    【解决方案1】:

    演示:http://jsfiddle.net/nEh89/31/(代码如下)

    <table>
        <tr class='row-1'>
            <td>Foo</td>
        </tr>
        <tr class='row-2'>
            <td>Bar</td>
        </tr>
        <tr class='row-3'>
            <td>Rab</td>
        </tr>
    </table>
    
    <!-- This button will toggle all elements with css class "row-1" -->
    <a class='btn hide-1' data-hide-element='row-1' data-default-mode='visible'>Toggle row with class "row-1"</a>
    
    <!-- This button will toggle all elements with css class "row-2" -->
    <a class='btn hide-2' data-hide-element='row-2' data-default-mode='hidden'>Toggle row with class "row-2"</a>
    
    <!-- This button will toggle all elements with css class "row-3" -->
    <!-- if @data-default-mode is not specified it is "visible" -->
    <a class='btn hide-3' data-hide-element='row-3'>Toggle row with class "row-3"</a>
    
        /**
     * This function toggle (shows/hides) elements and 
     * remember visibility in browsers localStorage.
     *
     * @param {String} buttonsCssClass Buttons css class which will trigger toggle action.
     * @return {Void}
     */
    function toggleElements(buttonsCssClass) {
        var // Our object of flags to determine if elements are hidden or not
            elementsVisible = localStorage.getItem('elementsVisible'),
            // List of buttons
            btns = document.getElementsByClassName(buttonsCssClass);
    
        // "rowHidden" not exists in localStorage yet
        if (elementsVisible === null) {
            elementsVisible = {};
        } else {
           // localStorage return string
            elementsVisible = JSON.parse(elementsVisible);
        }
    
        // Bind buttons
        var i = btns.length,
            cls, mode, elements, x, btn;
        while (i--) {
            btn = btns[i];
            cls = btn.getAttribute('data-hide-element');
            mode = btn.getAttribute('data-default-mode');
    
            if (typeof elementsVisible[cls] !== 'boolean') {
                elementsVisible[cls] = (mode === 'visible' || mode === null) ? true : false;
            }
    
            btn.addEventListener('click', function() {
                var _cls = this.getAttribute('data-hide-element');
    
                elementsVisible[_cls] = ! elementsVisible[_cls];
                localStorage.setItem('elementsVisible', JSON.stringify(elementsVisible));
    
                toggleDisplay(_cls, elementsVisible[_cls]);
            }, false);
    
            toggleDisplay(cls, elementsVisible[cls], true);
        }
    
        function toggleDisplay(cls, visible) {    
            var elements = document.getElementsByClassName(cls);
                x = elements.length;
    
            while (x--) {
                elements[x].style.display = visible ? '' : 'none';   
            }
    
            // Change color of buttons
            var btns = document.querySelectorAll('[data-hide-element="'+cls+'"]'),
                i = btns.length;
            while (i--) {
                btns[i].style.backgroundColor = visible ? 'white' : 'red';   
            }
        };       
    };
    
    toggleElements('btn');
    

    【讨论】:

    • 几乎完美。唯一的问题是,如果触发器在表jsfiddle.net/nEh89/30 之外,它就不起作用。我喜欢 index.php 中的几个表,并希望在其中创建 settings.php,您可以单击按钮来显示/隐藏某些行。
    • 更新版本jsfiddle.net/nEh89/31(我也编辑了我的帖子)。如果需要,您可以拥有一个或多个按钮。脚本将所有按钮与指定的选择器绑定。
    • 几乎完美。只有一件小事。它不能正确保存。当我按下按钮时它工作正常,但重新加载时我只能按下所有按钮或不按下。 jsfiddle.net/nEh89/39
    • 我从基础重写了整个函数。这应该是jsfiddle.net/nEh89/55
    • 谢谢。现在它可以工作了,但是当我进入其他页面并使用与 相同的行时,它不遵循上一页的设置。使用前面的脚本来切换整个表格就是这样工作的。我正在尝试自己修复它,但我无法在几个小时内解决它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 2019-02-13
    • 2021-12-10
    相关资源
    最近更新 更多