2010-05-03 2 views
0

J'ai besoin de déclencher une fonction de clic assignée à une case à cocher, mais sans changer son état vérifié (ce que fait click).jquery: Comment déclencher click() sans modifier l'état de l'élément?

Scénario: J'ai un formulaire avec plusieurs cases à cocher qui, lorsqu'elles sont sélectionnées, révèlent une zone de texte. Cela fonctionne très bien, mais je dois également appeler la fonction click() sur $ (document) .ready()

Mon code est ci-dessous, notez que j'ai un accès très limité à la modification du code html généré. J'ai un objet (admin_panels) qui va stocker chaque case à cocher et le texarea qu'il devrait mettre en place.

var admin_panels = {"checkbox-id" : "textarea-id"}; 

$(document).ready(function(){ 
for (var elem in admin_panels) { 
    $("#" + elem).click(admin_slide); 
    // $("#" + elem).click(); 
} 
}) 
function admin_slide() { 
    if ($(this).is(":checked")) { 
     $("#" + admin_panels[this.id] + "-wrapper").slideDown(); 
    }else{ 
     $("#" + admin_panels[this.id] + "-wrapper").slideUp(); 
    } 
} 

Merci

Répondre

4

Si vous voulez appeler la fonction admin_slide pour un élément, vous pouvez le faire:

admin_slide.call(domElement); 

La valeur de this dans la fonction admin_slide seront mis à domElement. Dans ce cas, domElement peut être $('#'+elem)[0] ou document.getElementById(elem).

Modifier:

Une autre façon de le faire, en utilisant des méthodes jQuery exclusivement, est: $(selector).each(admin_slide). Donc, votre code pourrait être:

for (var elem in admin_panels) { 
    $("#" + elem).click(admin_slide) 
       .each(admin_slide); 
} 
+0

merci, admin_slide.call (domElement) fonctionne parfaitement. –

-1

Ainsi, vous assignez la fonction de clic dans le document.ready? Pourquoi ne pas simplement appeler directement admin_slide en plus d'assigner le gestionnaire d'événements?

+0

Cela vaut mieux en tant que commentaire, et parce que 'admin_slide' repose sur' this' étant mis à l'élément approprié, ce qui n'appelle pas la fonction directement. – R0MANARMY

0

Pour empêcher le changement des états des cases à cocher, incluez event.preventDefault dans le code de votre gestionnaire d'événements. Qu'avec la réponse de interjay ressemblera à ceci:

$("#" + elem).click(function(event) { 
    event.preventDefault(); 
    admin_slide.call(this);  
}); 

La seule mauvaise chose au sujet de cette approche est que l'état de la case à cocher est modifiée lorsque est appelée admin_slide(), mais se change en arrière après. Vous pouvez contourner cela assez facilement en changeant ce qui se passe dans votre fonction admin_slide.

function admin_slide() { 
    if ($(this).is(":checked")) { 
     $("#" + admin_panels[this.id] + "-wrapper").slideUp(); 
    }else{ 
     $("#" + admin_panels[this.id] + "-wrapper").slideDown(); 
    } 
} 
+0

Cela n'empêcherait-il pas l'état de changer à chaque fois? – R0MANARMY

Questions connexes