【问题标题】:Function only runs on latest elements it was called on函数仅在调用它的最新元素上运行
【发布时间】:2017-04-12 10:30:24
【问题描述】:

我有一个在通用表上运行的函数,它不能是特定的,它需要能够在许多不同的表上运行。我遇到的问题是它是否在同一页面上的多个表上运行。点击事件触发得很好,但它们只作用于最终表格中的检查元素,而不是它们应该处理的表格中的检查元素。

代码如下:

            $parent = $table.parents('div.ibox').find('div.ibox-title');
            $select_all = $parent.find('button.select_all');
            $deselect_all = $parent.find('button.deselect_all');
            $input_delete = $table.find('input.delete');

            if ($table.find('input.delete').length >= 2) {
                $select_all.removeClass('hidden');
            } else {
                $select_all.addClass('hidden');
                $deselect_all.addClass('hidden');
            }

            $select_all.on('click', function(event) {
                $input_delete.each(function() {
                    $(this).prop('checked', true).trigger('change');
                    $select_all.addClass('hidden');
                    $deselect_all.removeClass('hidden');
                });
            });

            $deselect_all.on('click', function(e) {
                $table.find('input.delete:checked').each(function() {
                    $(this).prop('checked', false).trigger('change');
                    $deselect_all.addClass('hidden');
                    $select_all.removeClass('hidden');
                });
            });

$table 是一个变量,其中包含正在运行函数的$('table') 元素,它被传递到函数中。

只是想知道是否有人对如何让点击元素在他们应该在表格中的复选框上触发,而不是页面上的最终表格有任何想法。

【问题讨论】:

    标签: javascript jquery jquery-3


    【解决方案1】:

    假设除了实际的 function someFunc() { 和关闭 } 部分之外,您没有从函数中省略任何代码,这些行:

            $parent = $table.parents('div.ibox').find('div.ibox-title');
            $select_all = $parent.find('button.select_all');
            $deselect_all = $parent.find('button.deselect_all');
            $input_delete = $table.find('input.delete');
    

    ...所有声明(或更新)全局变量。因此,在对几个不同的表运行该函数后,这些变量将继续引用 last 表的元素。

    这些变量都应该用var 声明,使它们在你的函数中是本地的。然后你的点击事件处理程序将引用他们自己的变量而不是共享全局变量。 (即使在包含函数完成后,点击处理程序也可以继续引用其包含范围内的局部变量,因为closures。)

    【讨论】:

    • 非常感谢,这对我有用。令人惊讶的是,我以前从未遇到过全局变量和局部变量的问题,所以这对我来说是新的。感谢您的时间和帮助。
    • 不客气。作为一般规则,始终使用var(或较新的letconst)声明所有变量,包括全局变量(显然必须在任何函数之外声明),因为这让阅读代码的人清楚地知道,您是故意声明全局变量,而不是从本应是局部变量声明中意外遗漏 var
    • P.S.您也可以考虑使用strict mode,在这种情况下,意外的全局变量会引发错误——这是一件的事情,因为它可以帮助您立即发现错误。
    • 太棒了,我也不知道。你每天学习新的东西。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多