选择多行的所有javascript逻辑

时间:2014-03-03 23:10:47

标签: javascript checkbox selectall

当我对“checkAllAud”类的五个“全选”按钮之一进行更改时,我会调用以下Javascript函数。我基本上有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/

2 个答案:

答案 0 :(得分: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);
});

答案 1 :(得分:0)

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

这是这个例子的小提琴:

See fiddle example here

你需要你的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);
            });

        });
    });
});