2 votes

Décochez la case parent si un enfant n'est pas coché.

Je développe une application qui requiert la valeur de plusieurs cases à cocher. J'ai des listes imbriquées contenant des cases à cocher. La fonctionnalité actuelle est la suivante :

  1. Lorsqu'un parent est vérifié, tous les enfants sont vérifiés sous lui.
  2. Lorsqu'un enfant est coché, le parent n'est pas sélectionné.

J'ai besoin d'ajouter cette fonctionnalité :

  1. Lorsqu'un enfant est décoché après que le parent ait été coché, le parent se décoche, mais laisse les enfants cochés.

    $('input[name="level-1"],input[name="level-2"]').bind('click', function () { $('input[type=checkbox]', $(this).parent('li')).attr('checked', ($(this).is(':checked'))); });

Mon code se trouve ici : http://jsfiddle.net/dbcottam/Py4UN/

2voto

Arun P Johny Points 151748

Une solution possible

Ajouter une classe someclass au plus haut niveau ul élément alors

$('.someclass :checkbox').bind('click', function () {
    var $chk = $(this), $li = $chk.closest('li'), $ul, $parent ;
    if($li.has('ul')){
        $li.find(':checkbox').not(this).prop('checked', this.checked)
    }

    do{
        $ul = $li.parent();
        $parent = $ul.siblings(':checkbox');
        if($chk.is(':checked')){
            $parent.prop('checked', $ul.has(':checkbox:not(:checked)').length == 0)
        } else {
            $parent.prop('checked', false)
        }
        $chk = $parent;
        $li = $chk.closest('li');
    } while($ul.is(':not(.someclass)'));
});

Démonstration : Violon

0voto

Vega Points 44724

J'ai essayé une fonction générique pour gérer les niveaux multiples. Voir le code ci-dessous,

$('input[name^="level"]').click(function () {
    //v-- Takes care of check/uncheck all child checkbox
    $(this).parent().find('input[name^=level]').prop('checked', this.checked);

    if (!this.checked) {
        var level = this.name.substring(this.name.length - 1);    
        //using the naming convention `level-n` to uncheck parent
        for (var i = level - 1; i > 0; i--) {
            $('input[name="level-' + i + '"]').prop('checked', false);
        }
    }
});

DEMO : http://jsfiddle.net/46hTc/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X