在Jquery动画期间禁用/启用复选框

时间:2013-12-18 16:32:44

标签: jquery forms checkbox

在搜索表单中,我允许用户使用复选框选择和取消选择多个位置。为了改进搜索查询,一些位置按子位置划分。

在此JSFIDDLE LINK EXAMPLE上,位置英国由不同的子位置组成。

PROCESS:

当用户点击英国位置(cf链接)时,已经开发了一个Jquery事件来隐藏/显示其子位置。

注意:已经开发了两个其他事件来同步(选中/取消选中)主要位置及其子位置。

问题:

当我们在“Uk”位置快速点击多次时,Uk复选框与其子位置div容器之间的同步无法正常工作。 例如:可以检查英国位置而不显示其子位置。

有没有办法禁止用户在动画期间点击复选框?

HTML

</ul><ul id="locations"><li id="title"><b>Locations</b></li><div class="list-container">    
                            <li>
                    <label class="location-checkbox ">
                        <input value="15"  name="locations[]" type="checkbox" > SE Asia - 15                        <span></span>
                    </label>
                </li>

                            <li>
                    <label class="location-checkbox ">
                        <input value="8"  name="locations[]" type="checkbox" > South America - 8                        <span></span>
                    </label>
                </li>

                                <li class="london-parent-country">
                        <label class="location-checkbox">
                            <input id="checkboxuk" value="9"  name="locations[]" type="checkbox"> UK - 9                            <span></span>
                        </label>
                    </li>
                    <div id="uk-child">
                                                <li>
                                <label class="location-checkbox child-location">
                                    <input class="uk" value="17"  name="locations[]" type="checkbox" style="margin-left:50px;"> England - 17                                    <span></span>
                                </label>
                            </li>
                                                        <li>
                                <label class="location-checkbox child-location">
                                    <input class="uk" value="20"  name="locations[]" type="checkbox" style="margin-left:50px;"> Northern Ireland - 20                                   <span></span>
                                </label>
                            </li>
                                                        <li>
                                <label class="location-checkbox child-location">
                                    <input class="uk" value="18"  name="locations[]" type="checkbox" style="margin-left:50px;"> Scotland - 18                                   <span></span>
                                </label>
                            </li>
                                                        <li>
                                <label class="location-checkbox child-location">
                                    <input class="uk" value="19"  name="locations[]" type="checkbox" style="margin-left:50px;"> Wales - 19                                  <span></span>
                                </label>
                            </li>
                                                </div>  

                            <li>
                    <label class="location-checkbox ">
                        <input value="10"  name="locations[]" type="checkbox" > Western Europe - 10                     <span></span>
                    </label>
                </li>

            <br/>
</div></ul><!-- list-container -->

JQUERY

$('li.london-parent-country label').live('click', function (event) {

                var ttt= $('#checkboxuk').prop( "checked" )
                console.log("every-click: "+ttt);

                if($('.london-parent-country').hasClass("animated")){  /* Wait the animation to be completed */ }
                else {

                    //  Disable checkboxes during animation - not working
                    //  $('input[value=9]').prop("disabled", true);

                    //  <input type="checkbox" disabled="disabled" checked="checked">

                    //  Add or remove the open class to know if we need to hide/show the div
                    $('#uk-child').toggleClass("open");             
                    var current_class = $('#uk-child').attr('class');
                    if (current_class=="open"){
                        // We show sub-locations

                        // Add this class to cancelled this function onclick  
                        $('.london-parent-country').addClass("animated");

                        $("#uk-child").stop().show(1000, "easeOutQuart", function() {

                            // Remove class when the animation is done.
                            $('li.london-parent-country').removeClass("animated");

                            $('input[value=9]').prop("disabled", false);

                        });
                    }
                    else {
                         // We hide sub-locations

                        $('.london-parent-country').addClass("animated");
                        $("#uk-child").stop().hide(1000, "easeOutQuart", function() {
                            // Remove the animated class + enable checkboxes
                            $('li.london-parent-country').removeClass("animated");
                            $('input[value=9]').prop("disabled", false);
                        });
                    }       
                }       
            });

2 个答案:

答案 0 :(得分:1)

希望这会指向正确的方向。这是我使用变量动画制作的一个解决方案。检查代码的其余部分的小提琴,看看如何使用动画..

if(animating)
    return false;

我还使用了$('#checkboxuk').prop('checked', true);$('#checkboxuk').prop('checked', false);来确保一旦过渡到finsihed,该框就会显示正确的图像。

http://jsfiddle.net/4Dq9A/11/

答案 1 :(得分:0)

JQUERY工作职能:

// UK
// CHECK/UNCHECKED ALL CHILD CHECKBOXES FROM THE PARENT AND DISABLE CLICK DURING ANIMATION
var animating = false;
jQuery('li.london-parent-country label').live('click', function (event) {
    // Cancelled this event if animation isn't finished
    if(animating) 
        return false;

    animating = true;
        jQuery('#uk-child').toggleClass("open");    
        var current_class = jQuery('#uk-child').attr('class');
        if (current_class=="open"){
            // Check the parent cat drop boxes
            jQuery('#checkboxuk').prop('checked', true);  
            // Check all uk child cat           
            jQuery('.uk').prop('checked', true).change();

            // Display the uk sub cats container        
            jQuery("#uk-child").stop().show(1000, "easeOutQuart", function() {
                jQuery('#checkboxuk').prop("disabled", false);
                animating = false;
            });
        }
        else {
             // We hide sub-locations
            // Un-check the parent cat drop boxes
            jQuery('#checkboxuk').prop('checked', false);
            // Un-check all uk child cat                                
            jQuery('.uk').prop('checked', false).change();
            jQuery("#uk-child").stop().hide(1000, "easeOutQuart", function() {
                // Remove the animated class + enable checkboxes
                jQuery('#checkboxuk').prop("disabled", false);
                animating = false;
            });
        }       
});     

// UK CHILD CAT 
// Check and uncheck the parent cat uk if all child are unchecked or checked
jQuery('.uk').click(function() {
    // we count the number of uk's children
    var uk_child_number = jQuery('.uk').length;
    //  console.log(uk_child_number);
    var count_uk = 0;           
    jQuery(".uk:checked").each(function(){count_uk++;});

    // we check the country
    if(uk_child_number==count_uk){
        jQuery('input[value=9]').prop('checked', true).change();
    }else{
        jQuery('input[value=9]').prop('checked', false).change();
    }
});