2010-11-14 5 views
0

J'ai un var dans js qui contient une action de clic. Cette action est liée à quelques différents divs:Créer mon propre style d'accordéon avec jquery

<div class="clickable"><div class="hidden">inner content 1</div></div> 

<div class="clickable"><div class="hidden">inner content 2</div></div> 

<div class="clickable"><div class="hidden">inner content 3</div></div> 

Js ressemble à ceci:

$(document).ready(function(){ 

var clicker = function(){ 

    $('.hidden').slideUp(); 

    $(this).children('.hidden').slideDown(); 

    $(this).unbind('click',clicker); 
} 


$('.clickable').bind('click',clicker); 


}); 

Le code ci-dessus fonctionne essentiellement. Si je clique sur un div.clickable, il montre le contenu caché. Si je clique sur un autre div.clickable, il cache le contenu que je regardais juste et en révèle un autre. Le problème est cependant que, à cause de cette fonction unbind dans 'clicker' tout ce que je clique perd sa fonctionnalité de clicker. Je l'ai fait parce que le contenu caché a des choses cliquables, et tout ce que je clique maintenant dans le contenu caché déclenche à nouveau "clicker".

Quelle est l'approche la plus intelligente sans utiliser les plugins d'accordéon?

Comment puis-je vérifier si un div a été lié à une fonction, et sinon, le relier ou quelque chose de ce genre? Tout ce que je cherche est de relier le div.clickable à 'clicker' une fois qu'il a été fermé, c'est-à-dire qu'un autre div.clickable .hidden est regardé.

Répondre

1

Vous pouvez simplement exclure celui que vous cliquez sur dans le .slideUp(), comme ceci:

$(document).ready(function(){ 
    $('.clickable').click(function(){ 
    $('.hidden').not($(this).children()).slideUp(); 
    $(this).children('.hidden:hidden').slideDown(); 
    }); 
}); 

En utilisant .not() nous excluons l'élément courant dans les .hidden à masquer, et en montrant des enfants en le limitant aux seuls éléments :hidden, nous ne re-glisserons aucun élément déjà visible.

Une autre façon de réécrire un peu plus est clairement:

$(function(){ 
    $('.clickable').click(function(){ 
    $('.clickable').not(this).children('.hidden').slideUp(); 
    $(this).children('.hidden:hidden').slideDown(); 
    }); 
}); 

Ou, si tous les éléments sont .clickable frères et soeurs:

$(function(){ 
    $('.clickable').click(function(){ 
    $(this).children('.hidden:hidden').slideDown() 
    .end().siblings('.clickable').children('.hidden').slideUp(); 
    }); 
}); 
+0

Impressionnant. et avec encore moins de code! – willdanceforfun

+0

@KeenLearner - et moins contraignant :) J'ai ajouté quelques alternatives pour rendre un peu plus clair ce qui se passe, choisissez votre saveur :) –

+0

correction PAS de liaison! impressionnant. appris beaucoup de votre aide - acclamations. – willdanceforfun

0
$(document).ready(function(){ 

var clicker = function(){ 

    $('.clickable').bind('click',clicker); 

    $('.hidden').slideUp(); 

    $(this).children('.hidden').slideDown(); 

    $(this).unbind('click',clicker); 
} 


$('.clickable').bind('click',clicker); 


}); 
+0

Cela ne résout pas vraiment tous les problèmes, les enfants * seraient * encore réduire leur parent (si cela a fonctionné), mais vous êtes double liaison puis déconnexion à la fois, donc vraiment cela aurait pas d'effet net. –

Questions connexes