带有所有按钮的Jquery Button插件可以切换复选框

时间:2014-09-02 10:58:47

标签: javascript jquery html5

我正在使用jquery按钮,需要切换关联的checkebox,但我的代码挂起浏览器。 我需要 1)点击全部选择全部 2)点击全选(全部选中)取消选中所有复选框 3)如果所有选中的点击任何子复选框都应该取消选中(全部复选框),并且单击的复选框应该保留。

这是fiddle

我面临的问题是,当我执行此过程时,复选框会挂起,使浏览器挂起。 例如:在小提琴中单击全部,然后单击其间的任何复选框。所以在此之后再次点击全部检查,它会挂起

非常感谢任何帮助。

    <script>
jQuery(document).ready(function(){
// If checkd all and we click on any sub options make ALL option UNCHECKED

jQuery( ".format" ).buttonset();
    //check ALl checkbox onClick
    $("body").on("click", ".chktaxoall,.chkcmfall", function (e, source) {
        var all = $(this).is(":checked");
        var set = $(this).data("set");

        if (source != "code") {
            $("input[type=checkbox][data-set='" + set + "']:not(this)").each(function () {
                if ($(this).is(":checked") != all) 
                    $(this).trigger("click", "code");
            });
        }
    });

    $("body").on("click", ".wrap_acf input:checkbox", function (e, source) {
        var set = $(this).data("set");
        var allChecked = $(".chkcmfall[data-set='" + set + "']").is(":checked");

        if (source != "code" && allChecked) {
            $(".wrap_acf input[type=checkbox][data-set='" + set + "']:not(this)").trigger("click", "code");
            $(".chkcmfall[data-set='" + set + "']").trigger("click", "code");
        }
        else if (source != "code")
        {
            if ($(".wrap_acf input[type=checkbox][data-set='" + set + "']:checked").length == $(".wrap_acf input[type=checkbox][data-set='" + set + "']").length)
                $(".chkcmfall[data-set='" + set + "']").trigger("click", "code");
        }
    })
    })

</script>

4 个答案:

答案 0 :(得分:2)

根据您对其他人的回应,我认为这或多或少是您想要的。 http://jsfiddle.net/drmyersii/27xkkxbw/2/

主要的变化是:

$("body").on("click", ".css-checkbox:not(.chkcmfall)", function (e, source) {
    var set = $(this).data("set");
    var all = $(".chkcmfall[data-set='" + set + "']").is(":checked");
    var currentChecked = $(this).is(":checked");

    if(!currentChecked && all)
    {
        $('.css-checkbox[data-set="' + set + '"]').prop('checked', false);
        $(this).prop('checked', true);
        jQuery( ".format" ).buttonset();
    }
});

如果这是你想要的,我也可以为你清理小提琴。

答案 1 :(得分:1)

我和你的小提琴一起玩弄了解你的问题: 您触发点击事件并传递&#34;代码&#34;作为参数;然后检查参数&#34; code&#34;如果他们没有发送参数&#34;代码&#34;并点击你的元素。 - 所以你试图阻止重复点击。 但是,如果添加一些console.log语句,您将很快发现参数&#34; source&#34;永远不会定义 - 它始终未定义 - 所以您的复选框一遍又一遍地被点击。

如果您按照Bardo的建议切换到使用2个活动,那么您可以真正区分点击来自哪里,并且您不会遇到延迟。

我分叉你的小提琴并做了一些改变。我认为这可以做你想做的事情并且效果很好:http://jsfiddle.net/bmartinelle/brzexyf9/

 $("input[type=checkbox][data-set='" + set + "']").each(function () {
      $(this).trigger("cclick", "code");//trigger a custom click event! you can't pass a parameter to the default click event
 });


 $("body").on("cclick", ".wrap_acf input:checkbox", function (e, source) {
       var set = $(this).data("set");
       var allChecked = $(".chkcmfall[data-set='" + set + "']").is(":checked");

       if(allChecked &! $(this).is(":checked"))
       {
             $(this).click();
       }else if( (!allChecked) && $(this).is(":checked"))
       {
           $(this).click();
        }

  });
编辑:还支持取消选中&#34; all&#34;如果未选中某个元素,则按钮:

$("body").on("click", ".css-checkbox:not(.chkcmfall)", function (e, source) {
         var set = $(this).data("set");
         var all = $(".chkcmfall[data-set='" + set + "']").is(":checked");
         var currentChecked = $(this).is(":checked");

           if(!currentChecked && all)
           {
               //we need to uncheck all:

                $(".chkcmfall[data-set='" + set + "']").prop("checked", false);
                $( ".format" ).buttonset();
           }
 });

答案 2 :(得分:1)

你的逻辑没有什么特别的错误。您的缓慢来自您使用设置复选框的方法。你可以在每个上面调用click(),当然,每次都会再次触发事件,并多次重新计算所有内容。相反,我推荐这个:

$("body").on("click",".chkcmfall", function() {
    var set = $(this).data("set");
    var allButtonIsChecked = $(".chkcmfall[data-set='" + set + "']").prop('checked');
    var checkBoxSet = $(".wrap_acf input[type=checkbox][data-set='" + set + "']");
    checkBoxSet.prop('checked',allButtonIsChecked);
    checkBoxSet.each(function () {
        var myLabel = $("label[for='" + $(this).prop('id') + "']");
        myLabel.removeClass('ui-state-active');
        myLabel.removeAttr('aria-pressed');
        if ($(this).prop('checked')){
            myLabel.addClass('ui-state-active');
            myLabel.attr('aria-pressed',"true");
        }
    });
});

$("body").on("click",".wrap_acf input[type=checkbox][data-set]", function () {
    var set = $(this).data("set");
    var allButton = $(".chkcmfall[data-set='" + set + "']");
    if (allButton.prop('checked')){
        allButton.trigger("click");
        $(this).prop('checked',"true");
        var myLabel = $("label[for='" + $(this).prop('id') + "']");
        myLabel.addClass('ui-state-active');
        myLabel.attr('aria-pressed',"true");            
    }

});

答案 3 :(得分:-1)

好的,让我们看看我是否理解你需要的东西。

您想要一个按钮,在点击检查/取消选中页面上的所有复选框时,您希望在单击复选框时,如果选中该复选框,则会保持选中状态,而其他所有复选框都未选中。这是对的吗?

好的,在这种情况下你需要两个事件。一个用于按钮单击,另一个用于复选框元素单击。

第一个应该简单:

$("#myButton").on("click", function() {
    //If just one or none checkboxes are enabled then button click should enable all
    //otherwise button click should disable all
    var enableAll = $('input[type="checkbox"]:checked').length <= 1;
    $('input[type="checkbox"]').attr("checked", enableAll);
});

然后,单击一个复选框即可执行以下操作: 1)取消选中所有复选框 2)选中复选框

$('input[type="checkbox"]').on("click", function() {
    $('input[type="checkbox"]').attr("checked", false);
    $(this).attr("checked", true);
});

可能你需要解决一些代码,因为我正在运行它。基本的想法是,如果我正确理解你的需要,可能你的代码应该比现在的代码简单得多......试试这些想法。

我希望它有所帮助。