0

我有以下 Javascript 函数,当对“checkAllAud”类的五个“全选”按钮之一进行更改时调用该函数。我基本上有 5 个垂直行,每个下可能有数百个复选框需要选中/取消选中。

当您想在所有 5 列上单击全选时,我当前的代码存在问题,只有其他列的所有复选框都被选中。所以我的问题是如何重写此代码,以便它可以与我选择所有列和复选框的多个实例一起使用。

var toggle = true;
    //on click function  here
    $(".checkAllAud").change(function() {
        var toggled = $(this).val();
                //alert('checkallaud function triggered');
                toggleBox(toggled);
            });
    //end on click function
    function toggleBox(toggled) {
        var objList = document.getElementsByName(toggled)
    //alert('toggleBox function triggered');
    for(i = 0; i < objList.length; i++)
        objList[i].checked = toggle;

    toggle = !toggle;
}

这是我的代码目前的工作方式

            column1   column 2   column 3   column 4   column 5
(select all) [x]        [x]         [x]        [x]        [x]
             [x]        [ ]         [x]        [ ]        [x]

JSFiddle:http: //jsfiddle.net/8KQcp/8/

4

2 回答 2

0

您不需要使用全局,只需从您更改的输入中获取选中状态;-)

$(".checkAllAud").change(function() {
   var toggled = $(this).val();
   //alert('checkallaud function triggered');
   toggleBox(toggled, this.checked);
});

function toggleBox(toggled, checked) {
   var objList = document.getElementsByName(toggled)
   //alert('toggleBox function triggered');
   for(i = 0; i < objList.length; i++)
      objList[i].checked = checked;

}

工作jsFiddle:http: //jsfiddle.net/8KQcp/9/


改进:http: //jsbin.com/cakogulu/1/

$(".checkAllAud").change(function() {
   $('input[name^="' + this.value + '"]:checkbox').prop('checked', this.checked);
});
于 2014-03-03T23:33:28.737 回答
0

在分配事件处理程序之前,您可能会考虑一些 html 扩充。

这是此示例的小提琴:

在此处查看小提琴示例

您需要您的 javascript 来遍历可重复的 html 结构。所以,假设你有一个这样的 html 结构:(见小提琴)

<table class="jsSelectAll">
    <tbody>
        <tr class="select-all">
            <td>Select All</td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
        </tr>
        <tr>
            <td>Row Label</td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
        </tr>
        <tr>
            <td>Row Label</td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
        </tr>
    </tbody>
    <tbody>
        <tr class="select-all">
            <td>Select All</td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
        </tr>
        <tr>
            <td>Row Label</td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
            <td><input type="checkbox" /></td>
        </tr>
    </tbody>
</table>

然后,我会考虑根据需要拆分表中的每个表和 tbody,并将行(如果需要)和列指针添加到复选框。另外,我会使用闭包来简化事件连接,如下所示:

jQuery(function ($) {
    // closures
    var $tables = $('table.jsSelectAll');

    $tables.each(function () {
        // closures
        var $table = $(this);
        var $tbodies = $table.find('tbody');

        $tbodies.each(function () {
            // closures
            var $tbody = $(this);
            var $rows = $tbody.find('tr');
            var $selectAllCheckboxes = $tbody.find('.select-all input[type="checkbox"]');
            var $allCheckboxes = $tbody.find('tr td input[type="checkbox"]')

            // label data cells with rows(if desired) and collumns
            $rows.each(function (rowIndex) {
                // closures
                var $row = $(this);
                var $inputs = $row.find('input[type="checkbox"]');

                $row.attr('data-row', rowIndex);
                $inputs.each(function (colIndex) {
                    // closures
                    $cbx = $(this);

                    $cbx.attr('data-col', colIndex);
                });
            });

            // wire select all for each select-all row checkbox
            $selectAllCheckboxes.each(function () {
                // closures
                var $cbx = $(this)
                var fClick = function () {
                    var iCol = $cbx.attr('data-col');
                    $allCheckboxes
                        .filter('[data-col="' + iCol + '"]')
                        .each(function () {
                            $(this).prop('checked', true);
                        });
                };
                $cbx.click(fClick);
            });

        });
    });
});
于 2014-03-03T23:49:24.113 回答