J'ai un menu déroulant Twitter Bootstrap. Comme tous les utilisateurs de Twitter Bootstrap le savent, le menu déroulant se ferme au clic (même en cliquant à l'intérieur).
Pour éviter cela, je peux facilement attacher un gestionnaire d'événements de clic dans le menu déroulant et simplement ajouter le célèbre event.stopPropagation()
.
<ul class="nav navbar-nav">
<li class="dropdown mega-dropdown">
<a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-list-alt"></i> Menu item 1
<span class="fa fa-chevron-down pull-right"></span>
</a>
<ul class="dropdown-menu mega-dropdown-menu">
<li>
<div id="carousel" class="carousel slide" data-ride="carousel">
<ol class="carousel-indicators">
<li data-slide-to="0" data-target="#carousel"></li>
<li class="active" data-slide-to="1" data-target="#carousel"></li>
</ol>
<div class="carousel-inner">
<div class="item">
<img alt="" class="img-rounded" src="img1.jpg">
</div>
<div class="item active">
<img alt="" class="img-rounded" src="img2.jpg">
</div>
</div>
<a data-slide="prev" role="button" href="#carousel"
class="left carousel-control">
<span class="glyphicon glyphicon-chevron-left"></span>
</a>
<a data-slide="next" role="button" href="#carousel"
class="right carousel-control">
<span class="glyphicon glyphicon-chevron-right"></span>
</a>
</div>
</li>
</ul>
</li>
</ul>
Cela semble facile et un comportement très courant, cependant, et puisque carousel-controls
(ainsi que carousel indicators
) les gestionnaires d'événements sont délégués à l' document
objet, l' click
événement sur ces éléments ( contrôles prev / next , ...) sera "ignoré".
$('ul.dropdown-menu.mega-dropdown-menu').on('click', function(event){
// The event won't be propagated up to the document NODE and
// therefore delegated events won't be fired
event.stopPropagation();
});
S'appuyer sur Twitter Bootstrap dropdown hide
/ hidden
events n'est pas une solution pour les raisons suivantes:
- L'objet événement fourni pour les deux gestionnaires d'événements ne fait pas référence à l'élément cliqué
- Je n'ai aucun contrôle sur le contenu du menu déroulant, il
flag
n'est donc pas possible d' ajouter une classe ou un attribut
Ce violon est le comportement normal et ce violon est event.stopPropagation()
ajouté.
Mettre à jour
Merci à Roman pour sa réponse . J'ai également trouvé une réponse que vous pouvez trouver ci-dessous .
event propagation
arrêt du.Réponses:
La suppression de l'attribut de données
data-toggle="dropdown"
et l'implémentation de l'ouverture / fermeture de la liste déroulante peuvent être une solution.Commencez par cliquer sur le lien pour ouvrir / fermer la liste déroulante comme ceci:
puis en écoutant les clics en dehors de la liste déroulante pour la fermer comme ceci:
Voici la démo: http://jsfiddle.net/RomaLefrancois/hh81rhcm/2/
la source
// PREVENT INSIDE CLICK DROPDOWN
$('.dropdown-menu').on("click.bs.dropdown", function (e) { e.stopPropagation(); e.preventDefault(); });
e.stopPropagation()
est la meilleure solution.Cela devrait aussi aider
la source
'.dropdown-menu :not(.dropdown-item)'
pour que cliquer sur undropdown-item
ferme la fenêtre contextuelle, mais pas sur undropdown-header
.Bootstrap fournit la fonction suivante:
Par conséquent, la mise en œuvre de cette fonction devrait être en mesure de désactiver la fermeture de la liste déroulante.
la source
target
propriété de l'événement est également lali.dropdown
, larelatedTarget
est laa.dropdown-toggle
. Vous ne pouvez donc pas faire référence à l'élément cliqué dans lehide
gestionnaire d'événements.target.hasClass(".keepopen")
devrait êtretarget.hasClass("keepopen")
. Sinon, le code ne fonctionnera pas.La meilleure réponse absolue est de mettre une balise de formulaire après le menu déroulant de la classe
donc votre code est
la source
<li>
élément ne doit pas être à l'intérieur d'un<form>
élément.J'ai également trouvé une solution.
En supposant que les
Twitter Bootstrap Components
gestionnaires d'événements associés sont délégués à l'document
objet, je boucle les gestionnaires attachés et vérifie si l'élément cliqué actuel (ou l'un de ses parents) est concerné par un événement délégué.J'espère que cela aide toute personne à la recherche d'une solution similaire.
Merci à tous pour votre aide.
la source
Cela pourrait aider:
la source
Cela peut fonctionner pour toutes les conditions.
la source
jQuery:
HTML:
Démo :
Générique: https://jsfiddle.net/kerryjohnson/omefq68b/1/
Votre démo avec cette solution: http://jsfiddle.net/kerryjohnson/80oLdtbf/101/
la source
J'ai essayé cette chose simple et cela a fonctionné comme un charme.
J'ai changé le menu déroulant élément de
<div>
la<form>
et cela a bien fonctionné.la source
J'ai récemment rencontré un problème similaire et j'ai essayé différentes façons de le résoudre en supprimant l'attribut de données
data-toggle="dropdown"
et en écoutantclick
avecevent.stopPropagation()
l' appel.La deuxième façon semble plus préférable. Les développeurs Bootstrap utilisent également cette méthode. Dans le fichier source, j'ai trouvé l'initialisation des éléments déroulants:
Donc, cette ligne:
suggère que vous puissiez mettre un
form
élément à l'intérieur du conteneur avec la classe.dropdown
pour éviter de fermer le menu déroulant.la source
Bootstrap a résolu ce problème lui-même en prenant en charge les
<form>
balises dans les listes déroulantes. Leur solution est assez compréhensible et vous pouvez la lire ici: https://github.com/twbs/bootstrap/blob/v4-dev/js/src/dropdown.jsCela revient à empêcher la propagation au niveau de l'élément de document et à le faire uniquement pour les événements de type
'click.bs.dropdown.data-api'
correspondant au sélecteur'.dropdown .your-custom-class-for-keep-open-on-click-elements'
.Ou en code
la source
form
approche des exemples ne fonctionne pas pour vous - j'utilisais la classedropleft
, mais elle a également besoindropdown
pour que le sélecteur de formulaire corresponde.J'ai modifié la réponse de @ Vartan pour la faire fonctionner avec Bootstrap 4.3. Sa solution ne fonctionne plus avec la dernière version car la
target
propriété retourne toujours la racine de la liste déroulantediv
peu importe où le clic a été placé.Voici le code:
la source
$('.dropdown-keep-open').on('hide.bs.dropdown', ev => !(ev.clickEvent && $(ev.target).has(ev.clickEvent.target).length))
return !target.closest('.dropdown-keep-open').length)
. Cela dit, c'est une excellente solution! Trouvé cela nécessaire pour résoudre ce problème.la source
je l'ai mis à jour pour être le plus intelligent et le plus fonctionnel possible. il se ferme maintenant lorsque vous survolez le nav, en restant ouvert pendant que vous y êtes. simplement parfait.
la source
show
, la liste déroulante ne se ferme pas lorsque vous cliquez à l'extérieur, et nous devons cliquer sur le bouton déroulant avant ... +1 quand mêmebody
événement click ^^$('body').on('click', function (e) {
Comme par exemple, Bootstrap 4 Alpha a cet événement de menu. Pourquoi ne pas utiliser?
la source
e.preventDefault();
bloque les liens, vous pouvez l'ignorerVous pouvez arrêter de cliquer sur la liste déroulante de la propagation, puis réimplémenter manuellement les contrôles du carrousel à l'aide des méthodes javascript du carrousel .
Voici le jsfiddle .
la source
Avec Angular2 Bootstrap, vous pouvez utiliser nonInput pour la plupart des scénarios:
https://valor-software.com/ng2-bootstrap/#/dropdowns
la source
Je sais que cette question était spécifiquement pour jQuery, mais pour toute personne utilisant AngularJS qui a ce problème, vous pouvez créer une directive qui gère ceci:
Ensuite, ajoutez simplement l'attribut
dropdown-prevent-close
à votre élément qui déclenche la fermeture du menu, et cela devrait l'empêcher. Pour moi, c'était unselect
élément qui fermait automatiquement le menu:la source
<div class="dropdown-menu" ng-click="$event.stopPropagation()">
fonctionne pour moi en 1.2.x[Bootstrap 4 Alpha 6] [Rails] Pour le développeur de rails,
e.stopPropagation()
conduira à un comportement indésirable pourlink_to
avec différentdata-method
deget
car il retournera par défaut toute votre demande commeget
.Pour remédier à ce problème, je propose cette solution, universelle
Afficher l'extrait de code
la source
Au lieu d'écrire du code javascript ou jquery (réinventer la roue). Le scénario ci-dessus peut être géré par l'option de fermeture automatique de l'amorçage. Vous pouvez fournir l'une des valeurs à fermer automatiquement :
toujours - (par défaut) ferme automatiquement la liste déroulante lorsque l'un de ses éléments est cliqué.
outsideClick - ferme automatiquement la liste déroulante uniquement lorsque l'utilisateur clique sur un élément en dehors de la liste déroulante.
désactivé - désactive la fermeture automatique
Jetez un œil au plunkr suivant:
http://plnkr.co/edit/gnU8M2fqlE0GscUQtCWa?p=preview
Ensemble
J'espère que cela t'aides :)
la source
ui-bootstrap
, ce qui n'est probablement pas le cas pour de nombreuses personnes qui consultent cette question.uib-dropdown auto-close="outsideClick"
. Le menu fermé au clic à l'intérieur est juste un peu inconfortable mais le menu ne se ferme pas au clic à l'extérieur est assez bouleversant.Je sais qu'il existe déjà une réponse précédente suggérant d'utiliser un formulaire, mais le balisage fourni n'est pas correct / idéal. Voici la solution la plus simple, aucun javascript n'est nécessaire et cela ne rompt pas votre liste déroulante. Fonctionne avec Bootstrap 4.
<form class="dropdown-item"> <!-- Your elements go here --> </form>
la source
Cela m'a aidé,
Votre élément de menu déroulant doit être comme ceci, (prenez note des classes
dropdown-menu
etkeepopen
.Le code ci-dessus empêche d'enchérir sur l'ensemble
<body>
, à la place de l'élément specfic avec la classedropdown-menu
.J'espère que cela aide quelqu'un.
Merci.
la source
La solution de travail la plus simple pour moi est:
keep-open
classe aux éléments qui ne devraient pas entraîner de fermeture de la liste déroulantela source
Je n'ai trouvé aucune des solutions qui fonctionnait comme j'aimerais utiliser la navigation par défaut bootstrap. Voici ma solution à ce problème:
la source
Dans le
.dropdown
contenu, mettez la.keep-open
classe sur n'importe quelle étiquette comme ceci:Les cas précédents évitaient les événements liés aux objets conteneurs, maintenant le conteneur hérite de la classe keep-open et check avant d'être fermé.
la source
Je l'ai fait avec ça:
la source
la source
Pour fermer la liste déroulante uniquement si un événement de clic a été déclenché en dehors de la liste déroulante de bootstrap, voici ce qui a fonctionné pour moi:
Fichier JS:
Fichier HTML:
la source
Vous pouvez rencontrer des problèmes si vous utilisez la méthode return false ou stopPropagation () car vos événements seront interrompus. Essayez ce code, il fonctionne très bien:
En HTML:
Si vous souhaitez fermer le menu déroulant:
la source
Dans Bootstrap 4, vous pouvez également faire ceci:
où
#dd-link
est l'élément d'ancrage ou le bouton qui a ladata-toggle="drowndown"
propriété.la source