11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous !

Je travaille actuellement sur un projet pour lequel j'ai été amené à utiliser du Javascript, ou plus précisément du jQuery. Etant très peu familier avec ce langage, je me permet de solliciter votre aide, car j'ai peut-être fait une erreur toute bête.

Voici donc le code jQuery sur lequel je travail :

$(document).ready(function(){
	
	$('#links p a.aff').click(function() {
		var ref = $('div.aff', this);
		$("li.on").tp_close();
		ref.tp_open();
		return false;
	});
	
	$('#links p a.fis').click(function() {
		var ref = $('div.fis', this);;
		$("li.on").tp_close();
		ref.tp_open();
		return false;
	});

});

$.fn.tp_open = function() {

	return this.each(function(){

		$(this).removeClass("off");
		$(this).addClass("on");

		$('div.more', this).show(function(){
			
			$(this).fadeIn(function() {
				// 
			});

		});

	});

}

$.fn.tp_close = function() {

	return this.each(function(){

		var s = $(this);

		$('div.more', s).fadeOut(function() {
			$('div.more', s).hide();
			s.removeClass("on");
			s.addClass("off");
		});

	});

}


Voici maintenant la partie du code HTML auquel il se rapporte :

<div id="links" class="story"><p><a href="#" class="aff">Lorem ipsum</a> &bull; <a href="#" class="fis">Dolor sit amet</a></p></div>

</div></div>

<div class="colgroup colgroup2">

<div id="actGallery" class="story storyActivites">

<div class="aff"><li class="on"><div class="more">

<h2>Lorem ipsum</h2>

<p>Quisque a nibh sed dui auctor aliquet sed eu dolor. Maecenas porttitor libero ut metus imperdiet sed accumsan nisl posuere.</p>

</div></li></div>

<div class="fis"><li class="off"><div class="more">

<h2>Dolor sit amet</h2>

<p>In tincidunt sem et mi facilisis ac mattis magna varius. Vestibulum ultricies vestibulum mauris, nec venenatis ipsum varius aliquet. Aliquam nisi massa, posuere at scelerisque rhoncus, eget est :</p>


</div></li></div>

</div>

</div>


Et pour terminer, les quelques lignes de CSS associées :

#actGallery div.more { overflow: hidden; visibility: hidden; position: relative; }
#actGallery li.on div.more { visibility: visible; }
#actGallery li.off div.more { width: 0; height: 0; }


Vous l'aurez sans doute compris, je cherche à afficher/masquer du contenu stocké dans une div, à l'aide de liens situés dans une autre div. Je pourrai apporter des précisions ou fournir les fichiers source si besoin.

Merci d'avance si vous avez une idée !
Modifié par keden (22 Jun 2011 - 04:41)
Salut,

Je pense que tu t'es compliqué la vie avec ton bout de JS

Essaie avec ceci:

	$(document).ready(function()
	{
		$('div.more').hide();
		$('a.aff').click(function()
		{
			$('div.more').show('slow');
		});
		$('a.fis').click(function()
		{
			$('div.more').hide('slow');
		})
	}); 


je ne touche pas a tes bloc de class ".on" et ".off". J'ai l'impression que c'était pour détecter si le bloc de class ".more" était affiché ou non.

et du coup si ce bout de js te convient, tu peux retirer les "visibility: hidden" dans ton CSS
Modifié par mamax (22 Jun 2011 - 11:24)
Salut mamax !

Merci de me proposer ton aide. Effectivement ton code est bien plus simple que le miens. Je l'ai testé, mais il ne fait pas exactement ce que je cherche à faire.

En fait, je vais essayer d'être clair au possible. Tout se passe ici : http://www.lerat-avocat.com/activites.html J'aimerais que lorsque l'on clique sur "Droit des affaires" le contenu associé apparaisse en fondu, et lorsque l'on clique sur "Droit fiscal" le contenu actuel quel qu'il soit disparaît en fondu, pour laisser place au contenu relatif au nouveau lien ("Droit fiscal" en l'occurrence).

D'où l'importance selon moi de conserver l'idée des classes "on" et "off" qui sont gérées via le script JS, car je vais ajouté d'autres parties avec leur lien associé. Pour moi, la difficulté réside dans le fait que les liens ne sont pas dans la même div que leur contenu, sinon ce serait plus simple. Il faut que tel lien fasse apparaître telle div, tout en masquant la précédente, quelle qu'elle soit.

Je sais que ça reste compliqué (pour moi en tout cas) et c'est pourquoi je bloque... J'avais choisi de ne pas utiliser de flash, jQuery a l'air abordable mais je ne suis pas assez compétent, ou bien je n'ai pas la bonne logique.

Merci en tout cas pour ton aide, et si d'autres idées vous viennent je suis preneur !
Modifié par keden (22 Jun 2011 - 13:26)
Salut, en fait y'a pas grand chose à modifier pour que mon bout de JS fasse ce que tu veux et de plus l'imbrication des div n'est pas non plus un problème. Par contre, j'ai quelques petites question pour mieux comprendre le fonctionnement que tu désire:

- Au chargement de la page, quel contenu doit être affiché? le droit des affaires, le droit fiscal ou rien?

- Si le visiteur clique sur "droit fiscal", son contenu associé s'affiche, mais s'il clique ensuite sur "droit des affaires", que doit-il se passer?
Salut mamax,

Au chargement de la page, j'aimerais qu'un contenu s'affiche, peu importe lequel prenons "Droit des affaires" par exemple. Si le visiteur clique sur "Droit fiscal", le contenu "Droit des affaires" s'efface pour laisser place au contenu "Droit fiscal". Et inversement si je re-clique ensuite sur "Droit des affaires".

Imaginons que par la suite je rajoute "Droit alpha" et "Droit beta", ces items doivent fonctionner de la même manière, en plus des autres. Lorsque l'on clique sur un lien le contenu affiché (quel qu'il soit) s'efface et laisse place au contenu demandé.

J'espère avoir été assez clair pour toi. En tout cas merci encore de ton aide, car je suis vraiment dans la galère :s
1. Tu caches le bloc more que tu ne veux pas voir au chargement de la page.
2. Au clic sur le lien tu teste si le bloc est affiché, si c'est le cas tu ne fais rien
3. Si il n'est pas affiché tu masques l'autre bloc puis tu affiches le bon.

$(document).ready(function() 
{ 
 $('.fis .more').hide(); 

 $('a.aff').click(function() 
 { 
 	var more = $('.aff .more');
 	
 	if (more.is(':hidden')) {
    $('.fis .more').fadeOut('slow', function(){
     more.fadeIn('slow');
    });
  }
  return false;
 }); 

 $('a.fis').click(function() 
 { 
 	var more = $('.fis .more');
 	
  if (more.is(':hidden')) {
 	  $('.aff .more').fadeOut('slow', function(){
     more.fadeIn('slow');
    });
  }
  return false;
 }) 

});


Tu peux factoriser ce code pour diviser sa taille par 2, ça sera ton exercice. Smiley cligne
Modifié par jb_gfx (22 Jun 2011 - 14:15)
Bonjour,

Au cas où tu ne voudrais pas utiliser la librairie jQuery, voici une adresse où se trouve un script js répondant à ton objectif Smiley cligne .

Ceci dit sans vouloir offenser jb_gfx, bien sûr!

Cordialement
Merci pour vos réponses !

J'ai utilisé ton script jb_gfx et il marche comme je voulais, donc c'est parfait. Cela dit, comment procéder si je veux rajouter des items ? Si par la suite je veux un contenu pour "Droit alpha" et "Droit beta", je peux mettre en place des nouvelles div et allonger le script ?

Concrètement, j'ai essayé ce code, et ça ne fonctionne pas :

$(document).ready(function()  
{  
 $('.fis .more', '.alpha .more', '.beta .more').hide();
 
 $('a.aff').click(function() {  
     var more = $('.aff .more'); 
      
     if (more.is(':hidden')) { 
    $('.fis .more', '.alpha .more', '.beta .more').fadeOut('fast', function(){ 
     more.fadeIn('fast'); 
    }); 
  } 
  return false; 
 });  
 
 $('a.fis').click(function() {  
     var more = $('.fis .more'); 
      
  if (more.is(':hidden')) { 
       $('.aff .more', '.alpha .more', '.beta .more').fadeOut('fast', function(){ 
     more.fadeIn('fast'); 
    }); 
  } 
  return false; 
 });

 $('a.alpha').click(function() {  
     var more = $('.alpha .more'); 
      
  if (more.is(':hidden')) { 
       $('.aff .more', '.fis .more', '.beta .more').fadeOut('fast', function(){ 
     more.fadeIn('fast'); 
    }); 
  } 
  return false; 
 });

 $('a.beta').click(function() {  
     var more = $('.beta .more'); 
      
  if (more.is(':hidden')) { 
       $('.aff .more', '.fis .more', '.alpha .more').fadeOut('fast', function(){ 
     more.fadeIn('fast'); 
    }); 
  } 
  return false; 
 });
 
}); 


Voilà, ce code pourrait certainement fonctionner mais je pense que la syntaxe est mauvaise. Je ne peux pas séparer mes éléments par des virgules ?

Merci de votre aide encore une fois Smiley langue
salut

Oui c'est juste un pb de syntaxe.
La bonne syntaxe pour un sélecteur multiple est:

$('.aff .more,.alpha .more,.beta .more')


=> tous les élements séparé par une virgule et le tout entouré par de simples quotes
Salut, et merci mamax !

C'est super, j'en apprends chaque jour un peu plus, et je sens que je vais vite me plonger dans le jQuery, ça m'a l'air vraiment complet. J'ai finalement réussi à obtenir techniquement ce que je cherchais, il reste cependant un bug avec mon script.

Lorsque l'on clique sur un des liens, l'ancien contenu s'efface en même temps que le nouveau apparaît, et pendant une fraction de seconde les deux contenus sont affichés en même temps sur la page. Je pense que ce soucis vient du fait que la fonction "fadeIn" est à l'intérieur de la focntion "fadeOut", et par conséquent les deux scripts s'exécutent en même temps.

J'ai essayer de faire deux fonction séparées, mais sans grand succès. Je vous laisse le code que j'ai mis à jour suite au conseil de mamax, si vous avez une idée :

$(document).ready(function()   
{   
 $('.fis .more,.alpha .more,.beta .more').hide(); 
  
 $('a.aff').click(function() {   
     var more = $('.aff .more');  
       
     if (more.is(':hidden')) {  
    $('.fis .more,.alpha .more,.beta .more').fadeOut('fast', function(){  
     more.fadeIn('fast');  
    });  
  }  
  return false;  
 });   
  
 $('a.fis').click(function() {   
     var more = $('.fis .more');  
       
  if (more.is(':hidden')) {  
       $('.aff .more,.alpha .more,.beta .more').fadeOut('fast', function(){  
     more.fadeIn('fast');  
    });  
  }  
  return false;  
 }); 
 
 $('a.alpha').click(function() {   
     var more = $('.alpha .more');  
       
  if (more.is(':hidden')) {  
       $('.aff .more,.fis .more,.beta .more').fadeOut('fast', function(){  
     more.fadeIn('fast');  
    });  
  }  
  return false;  
 }); 
 
 $('a.beta').click(function() {   
     var more = $('.beta .more');  
       
  if (more.is(':hidden')) {  
       $('.aff .more,.fis .more,.alpha .more').fadeOut('fast', function(){  
     more.fadeIn('fast');  
    });  
  }  
  return false;  
 }); 
  
}); 


Si vous voulez voir le résultat en images, ça se passe ici : http://www.lerat-avocat.com/toview/activites.html

Merci de votre aide Smiley langue
Modifié par keden (24 Jun 2011 - 22:28)
Salut à tous,

Je me permet de faire un petit up, j'aimerais vraiment résoudre ce problème s'il vous plaît :s

Merci de votre aide !
Le fadeIn doit bien se faire dans le callback du fadeOut pour que l'apparition se déclenche après la disparation.

Ton problème c'est que tu quand tu fais : $('.fis .more,.alpha .more,.beta .more').fadeOut... tu déclenches 3 fois la fonction fadeOut (un fois pour chaque élément de ton sélecteur, même ceux qui sont masqués). Et dans ce cas le callback s’emmêle les pinceaux.

Ce qu'il faut que tu fasses c'est n'appliquer le fadeOut qu'au seul div possédant la classe .more et qui est visible.

Ce qui donne (c'est une façon de faire, il y en a d'autres) :


if (more.is(':hidden')) {
 $('div.more:visible').fadeOut('fast', function(){
 more.fadeIn('fast');
});


Il ne faut pas avoir peur de lire la documentation de jQuery : http://docs.jquery.com/Main_Page

Aussi je t'avais dit d'essayer de factoriser le code pour t'entrainer. Si tu regardes bien tu as quasiment toujours le même code qui se répète. Tu peux simplement le réduire en le factorisant, une façon de faire serait :


$(document).ready(function() {

	$('.fis .more,.alpha .more,.beta .more').hide(); 

  $('#links a').each(function() {

		$(this).bind('click',function() {

	  	var theClass = $(this).attr('class');
			var more = $('.' + theClass + ' .more');

	    if (more.is(':hidden')) {
		    $('div.more:visible').fadeOut('fast', function(){
		     more.fadeIn('fast');
		    });
			}
			return false;
		});
  });

});

Modifié par jb_gfx (26 Jun 2011 - 17:26)
jb_gfx a écrit :
Ton problème c'est que tu quand tu fais : $('.fis .more,.alpha .more,.beta .more').fadeOut... tu déclenches 3 fois la fonction fadeOut


Merci jb_gfx!
Cela crevait les yeux pourtant, mais ... il fallait le voir!

Ton code marche à la perfection!
Modifié par lddsoft (26 Jun 2011 - 18:13)