Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/03/2011, 17h13   #1
Invité de passage
 
Philippe Louboutin
Inscription : janvier 2010
Messages : 6
Détails du profil
Informations personnelles :
Nom : Philippe Louboutin

Informations forums :
Inscription : janvier 2010
Messages : 6
Points : 1
Points : 1
Par défaut Clic sur balise "li" à plusieurs niveaux

Bonjour tout le monde,

J'ai un soucis de détection de clic, ou plutôt de détection de l'élément cliqué.
Voilà le soucis :
  • j'ai une liste à deux niveaux représentant un menu
  • chaque balise "li" est associée à un lien : un clic sur une balise "li" doit donc charger ce lien
  • pour ces liens, je ne veux pas utiliser la balise "a" (de part l'architecture du menu en particulier, rendant impossible cette utilisation pour le niveau 1)

Voici le code HTML :
Code :
1
2
3
4
5
6
7
8
9
10
 
<ul class="topnav">
    <li>Niveau 1 - Titre 1</li>
    <li>Niveau 1 - Titre 2</li>
        <ul class="subnav">
            <li>Niveau 2 - Titre 2.1</li>
            <li>Niveau 2 - Titre 2.2</li>
        </ul>
    <li>Niveau 1 - Titre 3</li>
</ul>
Afin de prendre en compte les fameux liens, j'ai rajouter un attribut "lien_href" pour chaque "li" :
Code :
1
2
 
<li lien_href=[mon_lien_ici]>[...]</li>
Puis ensuite, en javascript, j'applique le lien lorsqu'un clic est détecté sur un "li" :
Code :
1
2
3
4
5
6
 
$("li").click(
    function(){
        window.location.href = $(this).attr("lien_href");
    }
);
Ce code fonctionne parfaitement lorsque je clique sur un "li" de Niveau 1.
Le soucis vient du fait que lorsque je clique sur un "li" de niveau 2, le lien pris en compte est celui du "li" parent... En fait à ce que je comprend deux clics sont détectés : un premier sur le "li" effectivement cliqué (celui de niveau 2), et un second sur le "li" parent (non cliqué, mais comme on clique sur un de ses fils...?).
J'ai bien tenté d'utiliser la méthode "stopPropagation" ou encore "cancelBubble" mais rien n'y fait, c'est toujours le lien de niveau 1 qui est pris en compte...
En fait dans ma fonction javascript il faudrait que je puisse savoir si l'élément $(this) est bien l'élément cliqué, mais comment ? En comparant avec la position du pointeur ? Pas très propre à mon goût et fastidieux...

Voilà j'espère avoir été assez clair pour que quelqu'un puisse m'orienter vers une solution efficace.
Dans l'attente, merci d'avance !

Philippe
filou2931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 17h41   #2
Invité de passage
 
Philippe Louboutin
Inscription : janvier 2010
Messages : 6
Détails du profil
Informations personnelles :
Nom : Philippe Louboutin

Informations forums :
Inscription : janvier 2010
Messages : 6
Points : 1
Points : 1
Ok trouvé, il s'agissait bien d'utiliser stopPropagation... Mais je l'utilisais mal.
Pour ceux qui serait dans la même problématique que moi, voici comment faire :

Code :
1
2
3
4
5
6
7
 
$("li").click(
    function(event){
        event.stopPropagation();
        window.location.href = $(this).attr("lien_href");
    }
);
filou2931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 00h59   #3
Membre expérimenté
 
Duke Jikel
Inscription : mai 2010
Messages : 340
Détails du profil
Informations personnelles :
Nom : Duke Jikel

Informations forums :
Inscription : mai 2010
Messages : 340
Points : 548
Points : 548
Je ne comprends pour pourquoi tu passes par un systeme d'attibut super sale :

Code :
1
2
 
<li attr_href="http://majoliepage">dfldkfdlk</li>
Et ensuite tu t'embêtes avec un JS
alors que tu peux simplement mettre un lien dans le LI
dukej est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 02h29   #4
Membre Expert
 
Avatar de Eric2a
 
Homme Eric Garidacci
Inscription : septembre 2005
Messages : 1 057
Détails du profil
Informations personnelles :
Nom : Homme Eric Garidacci
Âge : 41

Informations forums :
Inscription : septembre 2005
Messages : 1 057
Points : 1 564
Points : 1 564
Salut,

Et la balise <ul> ne peut contenir que des éléments de liste <li>.

Code html :
1
2
3
4
5
6
7
8
9
10
<ul class="topnav">
	<li>Niveau 1 - Titre 1</li>
	<li>Niveau 1 - Titre 2	<!-- Ne pas fermer ici -->
		<ul class="subnav">
			<li>Niveau 2 - Titre 2.1</li>
			<li>Niveau 2 - Titre 2.2</li>
		</ul>
	</li>			<!-- Mais ici -->
	<li>Niveau 1 - Titre 3</li>
</ul>
__________________

N'oubliez pas le vote des messages utiles ainsi que le Tag [Résolu].

Mon Site Web : Corse - Actualité, Météo, Vidéos, Logiciels, ...
Eric2a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 08h29   #5
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 805
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 805
Points : 35 807
Points : 35 807
Citation:
Envoyé par Eric2a
Et la balise <ul> ne peut contenir que des éléments de liste <li>.
Et c'est pour ça que le clic sur un li de niveau 2, l'événement est détecté par deux li car le navigateur essaye de corriger les erreurs du développeur
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 09h13   #6
Invité de passage
 
Philippe Louboutin
Inscription : janvier 2010
Messages : 6
Détails du profil
Informations personnelles :
Nom : Philippe Louboutin

Informations forums :
Inscription : janvier 2010
Messages : 6
Points : 1
Points : 1
Citation:
Envoyé par dukej Voir le message
Je ne comprends pour pourquoi tu passes par un systeme d'attibut super sale :

Code :
1
2
 
<li attr_href="http://majoliepage">dfldkfdlk</li>
Et ensuite tu t'embêtes avec un JS
alors que tu peux simplement mettre un lien dans le LI
Et comment mettre un lien dans un "li" sans utiliser la balise "a" ? Je rappelle que c'était un de mes soucis... Définir un attribut "lien_href" dans le "li" est la seule solution simple que j'ai trouvée et qui fonctionne.

Citation:
Envoyé par Eric2a Voir le message
Et la balise <ul> ne peut contenir que des éléments de liste <li>.
Autant pour moi, j'avais mal recopié mon code, le soucis ne venait donc pas de là...

Citation:
Envoyé par Bovino Voir le message
Et c'est pour ça que le clic sur un li de niveau 2, l'événement est détecté par deux li car le navigateur essaye de corriger les erreurs du développeur
Rien à voir, l'évènement était détecté par deux "li" car la propagation était effective, il suffisait de rajouter un stopPropagation sur l'event concerné et le tour est joué, en deux lignes le lien est assuré.
filou2931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 09h21   #7
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 805
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 805
Points : 35 807
Points : 35 807
Citation:
Envoyé par filou2931
Rien à voir, l'évènement était détecté par deux "li" car la propagation était effective, il suffisait de rajouter un stopPropagation sur l'event concerné et le tour est joué, en deux lignes le lien est assuré.


La propagation fait que l'événement était détecté par le li de niveau 2 ET par le li de niveau 1, donc
Citation:
l'événement est détecté par deux li car le navigateur essaye de corriger les erreurs du développeur
est bien la cause de ton souci...
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 09h33   #8
Invité de passage
 
Philippe Louboutin
Inscription : janvier 2010
Messages : 6
Détails du profil
Informations personnelles :
Nom : Philippe Louboutin

Informations forums :
Inscription : janvier 2010
Messages : 6
Points : 1
Points : 1
Citation:
l'événement est détecté par deux li car le navigateur essaye de corriger les erreurs du développeur
Pour être clair : ok le soucis étant qu'en cliquant sur un "li" de niveau 2 il y avait 2 clics de détectés : celui de niveau 2 et celui de niveau 1 dans lequel il est inclus...
Par contre, comme je l'ai dit dans mon message précédent, il n'y avait pas d'erreur dans mon code, je l'avais juste mal recopié sur ce forum...

Le fait que 2 clics soient détectés ne venait donc pas d'une "erreur de développeur" mais de la non utilisation de stopPropagation sur l'event click.

Bonne fin de journée
filou2931 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h34.


 
 
 
 
Partenaires

Hébergement Web