11540 sujets

JavaScript, DOM et API Web HTML5

Bonjour,
Je suis débutant en jquery et javascript.
Voici mon code:

<ul id="slide_nav">
       <li >
          <a href="#"></a>
       </li>
       <li >
          <a href="#"></a>
       </li>
</ul>

Au lieu de mettre des mouseover et mouseout sur chaque a, j'ai essayer d’utiliser la balise bind au niveau du parent ul.
Seulement ça ne marche pas.

$('#ul').bind('hover', function(e){ /* code*/},function(e){});

Du coup si je mets hover sans le bind ça marche mais l’appelle ce fait sur le ul et pas sur ses enfants.
Est que quelqu'un aurait une explication ?

Merci beaucoup Smiley smile
Modifié par renard13 (23 Nov 2012 - 11:50)
salut...

je pense que c'est ceci que tu cherches

$("ul li").hover(function(){/*codedela focntion*/});
Merci beaucoup pour ta réponse.
Justement je ne souhaite pas mettre le hover sur tous les éléments li.
J'ai lu sur internet que l'on pouvais cibler l’élément parent et qu'il fonctionner comme un dispatcher. Cela permet d'optimiser un peu le code.
www.lejournaldublog.com/jquery-les-bonnes-pratiques/

Au paragraphe : Exploiter la délégation d'événement

Le problème est que quand je fais cela, seul le <ul> prend le hover et pas ses enfants.
Et je ne comprends pas pourquoi.
Bonjour,

Ce que tu recherche, c'est la méthode `.delegate()` http://api.jquery.com/delegate/
Ou la méthode `.on()` http://api.jquery.com/on/ (en passant les paramètres pour déléguer un évènement)

Dans ton cas donc, ton code donnerait ceci:


$('#ul').on('mouseover', 'li', function(){});
$('#ul').on('mouseout', 'li', function(){});


Tu devras déclarer deux évènements car `.on()` (et delegate) n'acceptent qu'une seule fonction (et donc, la signature de `.hover()` ne fonctionnera pas).
Bonjour,
Vaxilart merci pour ta réponse.
J'ai essayé plusieurs code mais mon problème persiste. Je pense que ça vient du e.target
du coup j'ai abandonné cette manière de faire et j'ai directement mis sur l’élément.
Voici mon html:

<div id="page_folio">
  <div id="cont_slider" >
    <div id="slider" class="conteneur">
      <ul id="slide_img">
        <li>
	 <img src="Images/image1.jpg" alt="Image du site" class="img_flexible" />
	</li><li>
	 <img src="Images/image2.jpg" alt="Image du site" class="img_flexible" />
	</li><li>
	 <img src="Images/image3.jpg" alt="Image du site" class="img_flexible" />
	</li><li>
	 <img src="Images/image4.jpg" alt="Image du site" class="img_flexible" />
	</li>
      </ul>
      <ul id="slide_nav">
        <li class="premier" onmouseover="aide(this,1);" onmouseout="aide_sup(this,1);">
	  <a href="#site1" title="site 1" id="img1" class="survol">
	    <span class="titre">Titre 1</span>
	    <span class="texte">Mon premier site </span>
	    <span class="info"><span>Afficher le site</span></span>
	  </a>
	</li><li class="milieu" onmouseover="aide(this,2);" onmouseout="aide_sup(this,2);">
	  <a href="#site2" title="site 2"  id="img2">
	    <span class="titre">Titre2</span>
	    <span class="texte">Mon deuxiéme site</span>
	    <span class="info"><span>Afficher le site</span></span>
          </a>
	</li><li class="milieu" onmouseover="aide(this,3);" onmouseout="aide_sup(this,3);">
	  <a href="#site3" title="site 3"  id="img3">
	    <span class="titre">Titre3</span>
	    <span class="texte">Mon troisiéme site</span>
	    <span class="info"><span>Afficher le site</span></span>
	    </a>
	 </li><li onmouseover="aide(this,3);" onmouseout="aide_sup(this,3);">
	  <a href="#site4" title="site 4" id="img4"  onmouseover="aide(this,4);" onmouseout="aide_sup(this,4);">
	    <span class="titre">Titre4</span>
	    <span class="texte">Mon quatriéme site</span>
	    <span class="info"><span>Afficher le site</span></span>
	  </a>
	</li>
      </ul>	
    </div>
  </div>
</div>

En mettant directement onmouseover et onmouseout ça marche, même si il lance les deux événements à chaque fois. Que je rentre ou que je sorte il m'affiche les alert('texte') des deux fonction appeler.
Tous les span dans le a ansi que le a ont été placer en display: block.
La "Afficher site" n'apparait que quand la souris passe sur le li.

Le css:

#cont_slider{
	background-color: #fefefe;
}
#slide_img{
	width: 5000px;
}
#slide_img li{
	display: inline-block;
	vertical-align: top;
}
#slider{
	height: 500px;
	overflow:hidden;
	position: relative;
	background-color: #fefefe;
}
#slide_nav{
	position: absolute;
	left: 0;
	bottom: 0px;
}
#slide_nav li{
	display: inline-block;
	width: 25%;
}
#slide_nav li .survol{
	background-color: #DE473D;
	background-image: none;
	background: linear-gradient(135deg, #D93A32 52%, #E5584A 100%) repeat scroll 0 0 transparent;
}
#slide_nav li a{
	display: block;
	text-decoration: none;
	color: #F4F4F4;
	background-image: url("../Images/fond_folio.png");
	background: linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0px, rgba(0, 0, 0, 0.8) 40%, rgba(50, 50, 50, 0.8) 100%) repeat scroll 0 0 transparent;
	padding: 10px 0 0 8%;
	text-align: left;
}
#slider ul li a span{
	display: block;
}
#slide_nav li a .titre{
	font-size: 1.4em;
	padding: 0 0 4px 0;
}
#slide_nav li a .texte{
	font-size: 1em;
	padding: 0 0 15px 0;
}
#slide_nav li a .info{
	border-top: solid 1px #262626;
	height: 30px;
	position: relative;
}
#slide_nav li a .info span{
	position: absolute;
	top: 0;
	left: 0;
	padding: 7px 0 0 12%;
	background-image: url("../Images/oeil_slider.png");
	background-repeat: no-repeat;
	background-position: 0 center;
	height: 20px;
	display: none;
}


Voici le code jquery:
  
/* Slider valeurs */
var nombre_diapo = $('#slide_img li img').length;
var deplacement_slide = '1100';
var temps = 6000;
var i = 0;
var a = 0;
var Timer_slide = false;
/* Slider Port folio */
function slide(){
	if(i==0){
		$('#img1').find('.info').css('border-top', 'solid 1px #E3594E').find('span').show();;
		i++;
		a=1;
	}
	else if((i < nombre_diapo && a>0) || (i==1 && a==0)){
		i++;
		a++;
		setTimeout(function(){
		$('#img'+(i-1)).removeClass('survol').find('.info').css('border-top', 'solid 1px #262626').find('span').hide();
		$('#img'+i).addClass('survol').find('.info').css('border-top', 'solid 1px #E3594E').find('span').show();
		},180);
		$('#slide_img').animate({
			marginLeft: '-='+deplacement_slide+'px'
		},600);
	}
	else{
		i--;
		setTimeout(function(){
		$('#img'+(i+1)).removeClass('survol').find('.info').css('border-top', 'solid 1px #262626').find('span').hide();
		$('#img'+i).addClass('survol').find('.info').css('border-top', 'solid 1px #E3594E').find('span').show();
		},180);
		$('#slide_img').animate({
			marginLeft: '+='+deplacement_slide+'px'
		},600);
		a=0;
	}
}
function boucle(){
	slide();
	Timer_slide = setTimeout(boucle,temps);
}

Je lance la fonction boucle quand on est sur la page folio.
Ce que je voudrais c'est que quand on passe sur les li de #slide_nav, le slider s’arrête. Le li prend la class .survol et affiche le bon visuel. Quand la souris sort du ul le slider reprend.
Voici mon code pour le moment:

function aide(id, numero){
	clearTimeout(Timer_slide);
	var ie = (numero-1)*deplacement_slide;
	alert(ie);
	if(numero != i){
		$('#img'+i).removeClass('survol').find('.info').css('border-top', 'solid 1px #262626').find('span').hide();
		$(id).addClass('survol').find('.info').css('border-top', 'solid 1px #E3594E').find('span').show();
		$('#slide_img').animate({
			marginLeft: '-'+ie+'px'
		},600);
	}
}
function aide_sup(id, numero){
	Timer_slide = setTimeout(boucle,temps);
	var ie = (i-1)*1100;
	if(numero != i){
		$('#img'+i).addClass('survol').find('.info').css('border-top', 'solid 1px #E3594E').find('span').show();
		$(id).removeClass('survol').find('.info').css('border-top', 'solid 1px #262626').find('span').hide();
		$('#slide_img').animate({
			marginLeft: '+'+ie+'px'
		},600);
	}
}


Je voudrais savoir si quelqu'un peut m'orienter sur une piste au niveau du slider: pouvoir arreter le slider, afficher le visuel correspondant au li survoler par la souris et faire redémarrer le slider.
Et aussi savoir si ce n'est pas trop n'importe quoi au niveau du code.

Merci à tous Smiley smile
Modifié par renard13 (17 Nov 2012 - 21:06)
Je ne répondrais pas à ta question initiale (pas le temps de décortiquer, désolé Smiley smile ), maqis déjà un conseil : évites l'ajout de css dynamiquement via jQuery.

Tu devrais plutôt ajouter/supprimer des classes qui font le même boulot.

Exemple :

// Au lieu de :
$('#img'+i).addClass('survol').find('.info').css('border-top', 'solid 1px #E3594E').find('span').show();
// Essayes plutôt ça :
$('#img'+i)
.addClass('survol')
.find('.info')
.addClass('paleRed')
.find('span')
.show();

Et ta classe css :

.paleRed {
	border-top', 'solid 1px #E3594E
}



Ah et tu as un double point-virgule à la fin d'une de tes lignes, ça peut provoquer des erreurs js :

function slide(){
	if(i==0){
		$('#img1').find('.info').css('border-top', 'solid 1px #E3594E').find('span').show();;



Encore une autre recommandation, quand tu appelles plusieurs fois le même objet, inscris le dans une variable. Ça le met en cache pour le moteur js, et c'est plus performant (et plus lisible pour toi).

var currentImage = $("#img"+1);
currentImage
.addClass('ta_classe')
.show();


Bon y'a encore sûrement plein de trucs à dire sur ton code, mais là j'ai pas le temps. Mais le plus important surtout, c'est d'éviter (comme tu as fait) de mettre du js dans les balises html, pour débugger / maintenir / faire évoluer ton code, y'a rien de pire Smiley sweatdrop
Merci ZeB_panam,
Je ne savais si il valait mieux modifier le style ou jouer sur le ajouter/supprimer une class.
Je me suis enflammé, avec Jquery c'est facile de faire n'importe quoi.
Du coup, je suis repartis de zéro. Je suis en train de faire du javascript. Une fois que j'aurais fini, je me pencherais sur Jquery.
je viens de découvrir, des sélecteurs que je ne connaissais pas, le dom, l'héritage, la manipulation du dom...
J'ai voulu aller trop vite.
Je reposterais mon code qui devrait être largement meilleur.
Smiley biggrin

++++