2010-07-09 14 views
0

J'ai ce besoin d'afficher et de masquer une div si une case est cochée pour plusieurs cases à cocher.Même fonction jQuery pour plusieurs éléments de formulaire. Comment consolider

L'ID de chaque div qui doit être affiché sera le même que le nom des cases à cocher. Existe-t-il un moyen facile d'accomplir ceci sans écrire une fonction pour gérer chaque case à cocher?

$('input[name=checkbox_1]').click(function() { 
     if ($('input[name=checkbox_1]').is(':checked')) { 
      $('#checkbox_1').show('slow'); 
     } 

     else { 
      $('#checkbox_1').hide('slow'); 
     } 
    }); 
    $('input[name=checkbox_2]').click(function() { 
        if ($('input[name=checkbox_2]').is(':checked')) { 
      $('#checkbox_2').show('slow'); 
     } 

     else { 
      $('#checkbox_2').hide('slow'); 
     } 
    }); 

    }); 

Répondre

0

Il semble que vous ayez un certain type de convention de nommage. Vous pouvez simplement accéder à l'objet de contexte actuel, obtenir le nom et travailler votre convention. Vous voudrez peut-être donner à votre case à cocher les champs une classe css spéciale à faire pour faciliter la sélection:

$('input.someCssClass').click(function() { 

    var selector = '#' + $(this).attr('name'); 

    if ($(this).is(':checked')) 
     $(selector).show('slow'); 
    else 
     $(selector).hide('slow'); 
}); 
+0

Cela a fonctionné très bien! Ce site m'étonne toujours. – Taylor

2

Vous pouvez obtenir l'ID du nom, comme celui-ci:

$('input[name^=checkbox_]').click(function() { 
    $('#' + this.name)[this.checked ? 'show' : 'hide']('slow'); 
}); 

Il utilise le attribute-starts-with selector pour obtenir les entrées, puis utilise leur .name property pour obtenir l'élément approprié par ID. Si elle est cochée, exécute .show('slow'), sinon .hide('slow') sur l'élément avec cet ID.

1
$('input[name^=checkbox]').click(function() { 
    if(this.checked){ 
     $('#' + this.name).show('slow'); 
    } else{ 
     $('#' + this.name).hide('slow'); 
    } 

} 

Edit: En utilisant les 'commence par' sélecteur serait mieux que de vérifier la indexOf, comme d'autres ont dit

+1

Il est rarement si jamais un besoin de '$ (this) .est (« : checked »)' l'intérieur d'un gestionnaire de case à cocher , 'this.checked' est beaucoup plus simple/rapide tout autour :) –

+0

Bon appel. Je vais changer cela dans la solution - merci! – amfeng

+1

@afeng - C'est 'this.checked' :),' $ (this) .checked' sera toujours faux, ce n'est pas une propriété sur un objet jQuery, mais plutôt une propriété d'élément DOM. –

0

Vous pouvez utiliser toggle() au lieu de if ... else ici pour réduire encore le code:

('input[name^=checkbox_]').click(function(){ 
    $('#' + this.name).toggle('slow') 
}); 

Toggle peut également exécuter différentes fonctions sur des clics alternatifs au lieu de simplement masquer/afficher des éléments:

('input[name^=checkbox_]').toggle(function(){ 
    $('#' + this.name).hide('slow') 
}, function(){ 
    $('#' + this.name).show('slow') 
    }); 
+0

Je vais dire par expérience '.toggle()' (le gestionnaire) n'est pas le moyen d'aller 99% du temps ... et si la case est cochée au départ? Et si c'est inversé? Alors que '.toggle()' (le raccourci hide/show) "raccourcit" les choses, ce n'est pas le même effet, faire 'hide' ou' show' assure explicitement que l'état de l'élément est le même que l'état de la case . Si un utilisateur clique par exemple sur la case à cocher avant que le DOM ne soit prêt, cela ne s'est pas exécuté et l'état est inversé par rapport à ce qu'il devrait être. Ou, encore une fois, que se passe-t-il si la case à cocher est déjà cochée et que votre désynchronisation est initialement détectée? –

+0

Ensuite, ce n'est pas la solution pour lui;) –