Cela peut être une question stupide. Je sais que je suis un peu vert. J'étais chargé de modifier la navigation de ce vieux système. Il y a deux barres de navigation. Le second n'a que des boutons de recherche. On m'a demandé de retirer la deuxième barre de navigation, et de la remplacer par une liste déroulante affichant les fonctions de recherche. Je suis limité sur ce que je peux changer en raison de l'âge de ce système. Il n'y a aucune restriction sur le JS que je peux écrire. Ils exécutent jQuery 1.11.1, sur un système Adobe ColdFusion (il y a deux mois, ils sont passés de 1.3.2)plusieurs événements simultanés javascript
Premièrement: lorsque la cible est cliquée, le mouseenter et l'événement click se déclenchent. Le mouseenter tire d'abord. Cela provoque un problème sur un bureau qui est visible pour le spectateur vif, mais sur mobile, cela crée un problème d'utilisabilité horrible. R: D'après ce que je comprends, les événements souris ne se produisent pas sur un appareil mobile, mais le font pour moi. Et B: puisque l'événement mouseenter s'exécute en premier, il active la fonction closeDropDown avant le traitement de l'événement click. Avec le closeDropDown en cours d'exécution, son .on('click', f(...eventstuff...))
entend le clic ouvert qui est destiné à déclencher la fonction openDropDown, ainsi la liste déroulante ne s'ouvre pas.
Voici les fonctions. Les console.log
sont pour vérifier ce qui fonctionne quand.
function openDropDown(){
$('div.dropdown').parent().on('click.open mouseenter', function(event){
$subject = $(this).find('.dropdown-menu')
// console.log(event.type, $subject, "first o");
if(!$subject.is(":visible")){
// console.log($subject, 'second o');
$subject.show()
}else {
if(event.type == 'click'){
// console.log('third o');
$subject.toggle()
}
}
closeDropDown($subject)
// console.log('open complete');
})
}
function closeDropDown($x){
// console.log('first c');
$(document).on("click.close",function(e){
// console.log("second c", e.type, "this type");
if(!$(e.target).closest(".dropdown-menu").parent().length){
// console.log("third c");
if($x.is(":visible")){
// console.log('forth c');
$x.hide()
}
}
$(document).off("click.close")
// console.log('complete close');
})
}
openDropDown()
onSearchClick()
J'ai lu quelques messages dans l'espoir d'une aide (comme this et that
l'ensemble, je sais que je dois condenser mon code. Je comprends quelques façons de résoudre ce (ajouter un if(... are we on a mobile device...)
ou d'un compteur/vérifier qui empêche la closeDropDown de fonctionner lorsque le menu déroulant est fermé)
Je veux vraiment comprendre les fondamentaux des auditeurs d'événement et pourquoi on court avant les autres choses.
Bien que les suggestions sur la façon de résoudre ce problème soient excellentes, je cherche à comprendre les principes fondamentaux de ce que je fais de mal. Tout pointeur fondamental est très utile.
De note: Je viens de lire ceci: .is(':visible') not working. Je vais réécrire le code sans le .is ('visible').
Autres éléments pouvant vous aider: Il s'agit de la console Chrome Dev Tools lorsque tous mes fichiers console.log sont actifs. Tout d'abord, cliquez après le chargement de la page .... La liste déroulante s'ouvre et se ferme rapidement.
Merci! Toute votre aide est appréciée!