Mon menu utilise Bootstrap 3 et je ne peux pas empêcher la fermeture du menu déroulant au clic. Comment puis-je le faire?
// Add open class if active
$('.sidebar-nav').find('li.dropdown.active').addClass('open');
// Open submenu if active
$('.sidebar-nav').find('li.dropdown.open ul').css("display","block");
// Change active menu
$(".sidebar-nav > li").click(function(){
$(".sidebar-nav > li").removeClass("active");
$(this).addClass("active");
});
// Add open animation
$('.dropdown').on('show.bs.dropdown', function(e){
$(this).find('.dropdown-menu').first().stop(true, true).slideDown();
});
// Add close animation
$('.dropdown').on('hide.bs.dropdown', function(e){
$(this).find('.dropdown-menu').first().stop(true, true).slideUp();
});
Vous devez empêcher l’événement de remonter dans l’arborescence DOM:
$('.dropdown-menu').click(function(e) {
e.stopPropagation();
});
event.stopPropagation
empêche l’événement d’atteindre le nœud où il est finalement géré par le menu de masquage Bootstrap.
Je pense que cela devrait être une solution plus appropriée, car arrêter la propagation sur l'événement click pourrait parfois causer des problèmes plus tard dans le développement. Vous pouvez en lire plus ici: http://css-tricks.com/dangers-stopping-event-propagation/ Au lieu de cela, cette solution arrête la propagation sur le Bootstrap hide (masquer .bs.dropdown), ce qui l'empêche de continuer avec l'événement hidden (hidden.bs.dropdown).
Le code suivant a été pris et édité par moi-même pour le faire fonctionner dans toutes les listes déroulantes Bootstrap, comme il a été pris à partir d'ici: Empêcher la fermeture d'une liste déroulante bootstrap lors d'un clic Personnellement, je préfère cette façon aussi dans les événements déroulants Bootstrap, qui peuvent être trouvés ici: http://getbootstrap.com/javascript/#dropdowns-events
$(function() {
$('.dropdown').on({
"click": function(event) {
if ($(event.target).closest('.dropdown-toggle').length) {
$(this).data('closable', true);
} else {
$(this).data('closable', false);
}
},
"hide.bs.dropdown": function(event) {
hide = $(this).data('closable');
$(this).data('closable', true);
return hide;
}
});
});
Non fermé dans le menu latéral
$(function() {
var closeble = false;
$('body').on('click', function (e) {
if (!$(event.target).is("a.dropdown-toggle")) {
closeble = false;
}
});
$('.dropdown').on({
"click": function(event) {
if ($(event.target).closest('.dropdown-toggle').length) {
closeble = true;
} else {
closeble = false;
}
},
"hide.bs.dropdown": function() {
return closeble;
}
});
});
Vous pouvez désactiver la fonctionnalité de liste déroulante temporairement. Ceci est une solution de contournement.
Exemple avec un champ de saisie dans le "menu" déroulant:
//for dropdown field not closing when clicking on inputfield
$(document).on('focus', 'input', function(e) {
// this attribute can be anything except "dropdown", you can leave it blank
$('#yourDropdownID').attr('data-toggle','off');
});
//for dropdown field back to normal when not on inputfield
$(document).on('focusout', 'input', function(e) {
$('#yourDropdownID').attr('data-toggle','dropdown');
});
Cela peut être utilisé sur tout ce qui est cliquable et vous pouvez définir individuellement les éléments sur lesquels vous avez cliqué peuvent fermer ou non le menu déroulant.