【问题标题】:Check and uncheck checkbox not working correctly选中并取消选中复选框无法正常工作
【发布时间】:2014-04-01 01:49:27
【问题描述】:
//if work direction = mexico and departments checked = Shop and CNC
//check off Mexico in Dept. Affected but don't check off Shop and CNC

    $('#work_direction').live('click' , function() {
        if ($('select[name^="workorder[work_direction]"]').val() == "mexico") {

            $('.shop, .cnc').live('click', function(){
                $classname = $(this).attr('class');
                if($('.' + $classname + ":checked").length > 0){
                    $('#mexico').attr('checked','checked');
                } else {
                    $('#' + $classname).removeAttr('checked');
                }
            });

        }else if ($('select[name^="workorder[work_direction]"]').val() == "domestic"){

        $('.shop, .cnc').live('click', function(){
            $classname = $(this).attr('class');
            if($('.' + $classname + ":checked").length > 0){
                $('#' + $classname).attr('checked','checked');
            } else {
                $('#' + $classname).removeAttr('checked');
            }
        });

        }else{

        $('.cad, .design, .shop, .cnc').live('click', function(){
            $classname = $(this).attr('class');
            if($('.' + $classname + ":checked").length > 0){
                $('#' + $classname).attr('checked','checked');
            } else {
                $('#' + $classname).removeAttr('checked');
            }
        });
    }
});

这就是我用来进行检查的 jQuery。下面是我的表单的设置方式。

工作方向(选择):

  • 国内
  • 海上
  • 墨西哥

受影响的部门(复选框)?

  • [] 加元
  • [] 设计
  • [] 店铺
  • [] 数控系统
  • [] 会计
  • [] 海上
  • [] 墨西哥

部门阵容(复选框)?

  • [] c - CAD
  • [] d - 设计
  • [] s - 商店
  • [] m - CNC

所以逻辑是,当工作方向是国内或离岸时,c、d、s、m 在底部被选中,应该被选中的顶部应该是 CAD、DESIGN、SHOP 和 CNC。但是,如果选择了墨西哥并勾选了 c、d、s 或 m,则最应该勾选的是 CAD、DESIGN、MEXICO,而不是 SHOP 和 CNC。

现在有时 CAD 和 DESIGN 不会受到影响,因此如果选择墨西哥,几乎总是 SHOP 或 CNC 会受到影响,因此如果用户在底部选择 s 或 m,则应勾选上面的墨西哥,但不勾选 SHOP 或 CNC .

我希望我的解释不会太混乱,但我不确定为什么我的 jQuery 不起作用。目前,即使选择了墨西哥并选择了 c、d、s 或 m,它也会在受影响的部门中检查 CAD、DESIGN、SHOP、CNC 以及 MEXICO。

【问题讨论】:

  • 用于实时点击的即时点击。
  • on()代替live(),用prop()代替attr()
  • @SridharR 好的,我进行了更改,但我不确定我的代码中的逻辑是否检出。如果我选择墨西哥作为方向,并勾选 s、m,然后我将方向切换为国内非复选框将勾选正确的部门或任何东西。

标签: javascript jquery


【解决方案1】:

试试

$('#work_direction').change(function() { ... });
var callback = function () { ... };
$('.shop, .cnc').unbind('click', callback);
$('.shop, .cnc').bind('click', callback);

最后,你可能会也可能不会在使用 attr() 时遇到问题,请改用 prop()。

编辑

假设你的回调是一样的:

var callback = function() {
    $classname = $(this).attr('class');
    if($('.' + $classname + ":checked").length > 0) {
        $('#mexico').attr('checked','checked');
    } else {
        $('#' + $classname).removeAttr('checked');
    }
};

您现在可以根据需要附加和分离:

$('.shop, .cnc').unbind('click', callback);
$('.shop, .cnc').bind('click', callback);

这确保它只被调用一次。我通常将它包裹在一个可以进行单元测试的辅助对象周围。

【讨论】:

  • 您能否详细说明您的代码以及我将如何使用它?
  • 基本上,我认为您遇到了事件冒泡的问题。如果你使用 live(),jQuery 会在现在和将来添加事件。下次添加事件时,它会附加到列表中。
  • 这似乎正是我遇到的问题。我仔细考虑了 JS 存储之前检查的内容而不是“重置”的想法,并得出结论这是问题所在,但不知道如何解决它。谢谢你的解释。
  • 如果您有时间可以编辑您的帖子,向我展示如何使用该代码吗?我对如何将它实施到我已经拥有的东西中有点困惑。
【解决方案2】:

您必须将所有这些行 $('#' + $classname).removeAttr('checked'); 更改为,并尝试使用 .prop()

 $('.' + $classname).prop('checked',false);

类符号是'.'不是像下面的'#'改变

//if work direction = mexico and departments checked = Shop and CNC
//check off Mexico in Dept. Affected but don't check off Shop and CNC

    $('#work_direction').live('click' , function() {
        if ($('select[name^="workorder[work_direction]"]').val() == "mexico") {

            $('.shop, .cnc').live('click', function(){
                $classname = $(this).attr('class');
                if($('.' + $classname + ":checked").length > 0){
                    $('#mexico').prop('checked',true);
                } else {
                    $('.' + $classname).prop('checked',false);
                }
            });

        }else if ($('select[name^="workorder[work_direction]"]').val() == "domestic"){

        $('.shop, .cnc').live('click', function(){
            $classname = $(this).attr('class');
            if($('.' + $classname + ":checked").length > 0){
                $('.' + $classname).prop('checked',true);
            } else {
                $('.' + $classname).prop('checked',false);
            }
        });

        }else{

        $('.cad, .design, .shop, .cnc').live('click', function(){
            $classname = $(this).attr('class');
            if($('.' + $classname + ":checked").length > 0){
                $('.' + $classname).prop('checked',true);
            } else {
                $('.' + $classname).prop('checked',false);
            }
        });
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2017-04-04
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多