Bootstrap bouton Accordéon bascule "data-parent" ne fonctionne pas
j'essaie de créer un accordéon en utilisant Bootstrap 3 en utilisant le bouton repliable avec l'attribut data, sans le markup accordéon. Il a juste l'air plus propre pour moi.
cependant je ne peux pas faire l'attribut data-parent travailler. Je veux qu'en ouvrant une question, tous les autres ferment. Je lis le docs ( ) http://getbootstrap.com/javascript/#collapse-usage ) mais ne peut toujours pas le faire fonctionner.
j'utilise le code suivant:
<div class="accordion" id="myAccordion">
<button type="button" class="btn btn-danger" data-toggle="collapse" data-target="#collapsible-1" data-parent="#myAccordion">Question 1?</button>
<div id="collapsible-1" class="collapse">
<p>Etiam posuere quam ac quam. Maecenas aliquet accumsan leo. Nullam dapibus fermentum ipsum. Etiam quis quam. Integer lacinia. Nulla est.</p>
</div>
<button type="button" class="btn btn-danger" data-toggle="collapse" data-target="#collapsible-2" data-parent="#myAccordion">Question 2?</button>
<div id="collapsible-2" class="collapse">
<p>Etiam posuere quam ac quam. Maecenas aliquet accumsan leo. Nullam dapibus fermentum ipsum. Etiam quis quam. Integer lacinia. Nulla est.</p>
</div>
<button type="button" class="btn btn-danger" data-toggle="collapse" data-target="#collapsible-3" data-parent="#myAccordion">Question 3?</button>
<div id="collapsible-3" class="collapse">
<p>Etiam posuere quam ac quam. Maecenas aliquet accumsan leo. Nullam dapibus fermentum ipsum. Etiam quis quam. Integer lacinia. Nulla est.</p>
</div>
</div>
voici le JSFiddle: http://jsfiddle.net/twinsen/AEew4 /
je serais très heureux si quelqu'un me montre où je fais une erreur:
7 réponses
Bootstrap 4
utiliser l'attribut data-parent=""
sur l'élément collapsus (au lieu de l'élément déclencheur)
<div id="accordion">
<div class="card">
<div class="card-header">
<h5>
<button class="btn btn-link" data-toggle="collapse" data-target="#collapseOne">
Collapsible #1 trigger
</button>
</h5>
</div>
<div id="collapseOne" class="collapse show" data-parent="#accordion">
<div class="card-body">
Collapsible #1 element
</div>
</div>
</div>
... (more cards/collapsibles inside #accordion parent)
</div>
Bootstrap 3
voir ce numéro sur GitHub: https://github.com/twbs/bootstrap/issues/10966
il y a un "bug" qui rend l'accordéon dépendant de la classe .panel
lorsqu'on utilise l'attribut data-parent
. Pour contourner cela, vous pouvez envelopper chaque groupe d'accordéon dans un div' panel'..
<div class="accordion" id="myAccordion">
<div class="panel">
<button type="button" class="btn btn-danger" data-toggle="collapse" data-target="#collapsible-1" data-parent="#myAccordion">Question 1?</button>
<div id="collapsible-1" class="collapse">
..
</div>
</div>
<div class="panel">
<button type="button" class="btn btn-danger" data-toggle="collapse" data-target="#collapsible-2" data-parent="#myAccordion">Question 2?</button>
<div id="collapsible-2" class="collapse">
..
</div>
</div>
<div class="panel">
<button type="button" class="btn btn-danger" data-toggle="collapse" data-target="#collapsible-3" data-parent="#myAccordion">Question 3?</button>
<div id="collapsible-3" class="collapse">
...
</div>
</div>
</div>
Modifier
, Comme mentionné dans les commentaires, chaque section n'a pas à être un .panel
. Cependant...
-
.panel
l'élément utilisé commedata-parent=
- chaque accordéon (
data-toggle=
) doit être un enfant direct du.panel
( ). http://www.bootply.com/AbiRW7BdD6# )
Note, non seulement il y a une dépendance .en outre, elle dépend de la structure du DOM.
assurez-vous que vos éléments sont structurés comme ceci:
<div id="parent-id">
<div class="panel">
<a data-toggle="collapse" data-target="#opt1" data-parent="#parent-id">Control</a>
<div id="opt1" class="collapse">
...
c'est essentiellement ce que @Blazemonger a dit, Mais je pense que la hiérarchie de l'élément cible compte aussi. Je n'ai pas fini d'essayer toutes les possibilités, mais ça devrait marcher si vous suivez cette hiérarchie.
POUR INFO, j'avais plus de couches entre le contrôle div & content div Et ça n'a pas marché.
essayez ceci. Solution Simple sans dépendances.
$('[data-toggle="collapse"]').click(function() {
$('.collapse.in').collapse('hide')
});
comme disait Blazemonger, # parent,.panneau et .l'effondrement doit être une descendance directe. Cependant, si vous ne pouvez pas changer votre html, vous pouvez contourner en utilisant des événements bootstrap et des méthodes avec le code suivant:
$('#your-parent .collapse').on('show.bs.collapse', function (e) {
var actives = $('#your-parent').find('.in, .collapsing');
actives.each( function (index, element) {
$(element).collapse('hide');
})
})
si trouvé cette modification à Krzysztof réponse aidé mon numéro
$('#' + parentId + ' .collapse').on('show.bs.collapse', function (e) {
var all = $('#' + parentId).find('.collapse');
var actives = $('#' + parentId).find('.in, .collapsing');
all.each(function (index, element) {
$(element).collapse('hide');
})
actives.each(function (index, element) {
$(element).collapse('show');
})
})
si vous avez des panneaux imbriqués, vous pouvez aussi avoir besoin de spécifier lesquels en ajoutant un autre nom de classe pour les distinguer et ajouter ceci au sélecteur a dans le JavaScript ci-dessus
voici un patch universel (espérons-le) que j'ai développé pour corriger ce problème pour BootStrap V3. Aucune exigence particulière autre que le branchement dans le script.
$(':not(.panel) > [data-toggle="collapse"][data-parent]').click(function() {
var parent = $(this).data('parent');
var items = $('[data-toggle="collapse"][data-parent="' + parent + '"]').not(this);
items.each(function() {
var target = $(this).data('target') || '#' + $(this).prop('href').split('#')[1];
$(target).filter('.in').collapse('hide');
});
});
EDIT: ci-dessous est une réponse simplifiée qui répond toujours à mes besoins, et j'utilise maintenant un gestionnaire de clic délégué:
$(document.body).on('click', ':not(.panel) > [data-toggle="collapse"][data-parent]', function() {
var parent = $(this).data('parent');
var target = $(this).data('target') || $(this).prop('hash');
$(parent).find('.collapse.in').not(target).collapse('hide');
});
j'ai eu le même problème avec l'accordéon. Mais quand j'essaie de mettre le bloc script dans le bloc en-tête, ça marche pour mon cas!!
<head>
...
<link rel="stylesheet" href="../assets/css/bootstrap.css" />
<script src="../assets/js/jquery-1.9.1.min.js" ></script>
<script src="../assets/js/bootstrap.js" ></script>
</head>