11496 sujets

JavaScript, DOM et API Web HTML5

Bonjour bonjour

Je souhaite créer un galerie en javascript affichant une description et une grande image lorsqu'on click sur une miniature.

upload/36902-exemplesit.jpg

On voit 3élements.
- A gauche le block affichant la grande image et son titre
-A droite un block description
-En bas un tableau de miniature(on voit pas tout car ya une scrollbar)

Pour le moment grâce à des tuto j'ai réussis à afficher les miniatures et les grande photos.

div id="affichage">
<div class="photophp">			
	<?php if($type=="trucmuche"){?>
		<dl id="photo">
		<dt> trucmuche1</dt>
		<dd><img id="bigphoto" src="photo/trucmuche1.jpg"/></dd></dl><?php } ?>
	<?php if($type=="truc"){?>
		<dl id="photo">
		<dt> truc1</dt>
		<dd><img id="bigphoto" src="photo/truc1.jpg"/></dd></dl><?php } ?>
	<?php if($type=="machin"){?>
		<dl id="photo">
		<dt> machin1</dt>
		<dd><img id="bigphoto" src="photo/machin1.jpg"/></dd></dl><?php } ?>
</div>
<div id="description">
	<?php if($type=="trucmuche"){?> 
		<p align="center" id="title">trucmuche1</p>
		<p id="desc">Le trucmuche corp un possede une couleur vert</p><?php }?>
	<?php if($type=="machin"){?>
		<p align="center" id="title">machin1</p>
		<p id="desc">Le machin possede une couleur rose</p><?php }?>
	<?php if($type=="truc"){?>
		<p align="center" id="title">truc1</p>
		<p id="desc">Le truc possede une couleur bleu</p><?php }?>
</div>
	</div></div> 
<table id="mini">
				<tr><?php if($type=="trucmuche"){?>
					<td><li><a href="photo/trucmuche1.jpg" title="trucmuche1"><img src="photo/mini_1.jpg" value="trucmuche1" /></a></li></td>
					....
					<?php }	if($type=="truc"){ ?>
					<td><li><a href="photo/porte1.jpg" title="porte1"><img src="photo/miniporte1.jpg" value="truc1" /></a></li></td>
                                        <?php }	if($type=="machin"){ ?>
					<td><li><a href="photo/machin1.jpg" title="machin1"><img src="photo/minmachin1.jpg" value="machin1" /></a></li></td>
					<?php } ?></tr>
</table>


Donc comme on peut le remarquer il y a plusieurs minigalerie chacune correspondant a un type.
Chaque type s'affiche comme la photo ci-dessus.
Donc un type est composé de plusieurs modèles représenté par les photos.
Chacune de ces photos aura une description qui lui est propre.

Voici donc le javascript tiré de vos tuto pour l'apparition de ces images.

function displayPics()
{
	var photos = document.getElementById('mini') ;	// On récupère l'élément  mini
	var liens = photos.getElementsByTagName('a') ;	// On récupère tous les liens contenu dans mini (tag nous fais recup une tab)
	var bigphoto = document.getElementById('bigphoto') ;	// On recupere l'elem bigphoto(image)
	var titre_photo = document.getElementById('photo').getElementsByTagName('dt')[0] ;	// titre de la photo de bigphoto
	var nbi = liens.length;
	for(var i = 0 ; i < nbi ; i++)// Une boucle des liens contenu dans mini
	{		
		liens[i].onclick = function()// Au clique sur ces liens
		{
			bigphoto.src = this.href ; // On change l'attribut src de l'image en le remplaçant par la valeur du lien
			bigphoto.alt = this.title ; // On change son titre
			titre_photo.firstChild.nodeValue = this.title ; // On change le texte de titre de la photo
		return false ; // Et pour finir on inhibe l'action réelle du lien
		}
	}
}
window.onload = displayPics ;// Il ne reste plus qu'à appeler notre fonction au chargement 


Mon probleme viens donc des descriptions.
J'affiche correctement les grande images en cliquant sur les miniatures cependant j'ai du mal avec ces fameuses descriptions.

Apres moulte recherche je continue de couler.
Avant de m'embarquer dans la realisation de fonction pour structurer un tableau avec mes description j'aimerai savoir comment recuperer le numero de l'element sur lequel on click, ou son titre.
Car dans la boucle for j'arrive a récupérer avec alert(nbi); mon nombre d'objet qui commence lui a 1. avec alert(i); je vois bien mes i s'incrémenter.

Mais si je place ces alert apres le liens.onclick = function()
la j'ai des undefine car mes objet ne sont pas initialiser. (sauf pour le alert(nbi); evidement)

Sauriez vous me renseigner ?

Je précise que je commence le javascript. A force de lire les tuto je comprend ce que le code me dit cependant je ne suis pas encore en mesure de savoir l'utiliser correctement et du coup niveau création de fonction ajout d'éléments dans les script c'est durdur.
[/i]
Hello hello all!

Je cherche et je coule toujours mon script plante dès que j'essais de le modifier et surtout jen n'arrive pas a recupérer le i du liens.onclick = function() quelqu'un saurait comment faire ???
Bonjour,

Bon, ya plein de faute Smiley cligne

Les id des elements doivent etre unique. Donc pas 2 pareil.

Pour ton javascript, tu peux simplement recuperer l'id UNIQUE de ta miniature via : this.id

Ensuite, tu aurais interet à afficher le texte toujours dans le même element. Ce serais plus simple.

Par exemple, tu cree un textarea :
<textarea id="mesDescription"></textarea>

Puis tu y affiche ton texte en y accedant via :
document.getElementById("mesDescriptions").value = descriptionsDesPhotos[this.id]

Tu peux aussi te renseigner du coté de innerHTML si tu le souhaite.

Voila quelques pistes.
Alors pour les ID repétitive il me semble que tu fais allusion à :
dans un premier temps id="photo" ou id ="desc"
En fait j'arrive sur cette page grace à une form ou je récupère le type d'élément (truc, machin ou trucmuche)

Et chaque type d'element a une petite galerie_mini qui permet de consulter les description et afficher l'image en grand.

C'est ça pour les id nn unique dont tu me parlais ?
Car en tout cas j'affiche correctement mes grandes images que cela soit pour truc ou machin il fait bien ce que je lui demande a savoir afficher la mini_galerie propre au type (truc machin ou trucmcuhe) php demandé.


alors justement les tableau me prenant bien la tete j'arrive pas a faire le constructeur jsuis toute perdue -_- je use du innerHTML.

Alors alors, mon texte s'affiche (doit s'afficher plus exactement) dans le paragraphe aillant pour id="desc" ce paragraphe au meme titre que mes images s'affiche en fonction du type.

Dit moi si quelque chose va pas apres ces petites explication stp ^^

Donc du coup cherchant a changer cette description qui me rend ouf depuis 4 jours j'ai fini par utiliser le innerHTML.
Du coup j'ai ça :


function displayPics()
{
	var photos = document.getElementById('mini') ;	// On récupère l'élément  mini
	var liens = photos.getElementsByTagName('a') ;	// On récupère tous les liens contenu dans mini (tag nous fais recup une tab)
	var bigphoto = document.getElementById('bigphoto') ;	// On recupere l'elem bigphoto(image)
	var titre_photo = document.getElementById('photo').getElementsByTagName('dt')[0] ;	// titre de la photo de bigphoto
	var nbi = liens.length;
	var titre_desc = document.getElementById('description').getElementsByTagName('p')[0].innerHTML;
	var desc= document.getElementById('description').getElementsByTagName('p')[1].innerHTML;
	alert(desc);
	alert(titre_desc);
	for(var i = 0 ; i < nbi ; i++)// Une boucle des liens contenu dans mini
	{		
		liens[i].onclick = function()// Au clique sur ces liens
		{	
			bigphoto.src = this.href ; // On change l'attribut src de l'image en le remplaçant par la valeur du lien
			bigphoto.alt = this.title ; // On change son titre
			titre_photo.firstChild.nodeValue = this.title ; // On change le texte de titre de la photo
			alert(bigphoto.alt);			
			if(bigphoto.alt == 'truc2')
			{ 
			alert (desc);
			desc= "blabalbal";
			alert (desc);
			}
			return false;
		}
	}
}


J'y ai donc rajouté ceci avant la boucle for:
var titre_desc = document.getElementById('description').getElementsByTagName('p')[0].innerHTML;
var desc= document.getElementById('description').getElementsByTagName('p')[1].innerHTML;
alert(desc);
alert(titre_desc);

Ce qui m'affiche ds la msg box mes msg de base :
-alert(desc)=>Nos truc possède différents modèles.
-alert(titre_desc) => truc

Jusque la je ne fais que recuperer le texte deja inscrit.

Ensuite apres mon liens.onclick=function()
J'arrive a recupérer le titre de la photo courante (sur laquelle je viens de cliquer) et j'arrive a rentrer dans ma boucle if du coup.
if(bigphoto.alt == 'truc2')
{
alert (desc);
desc= "blabalbal";
alert (desc);}

le premier alert me renvoie ma premiere phrase (celle deja inscrite en html)
Nos truc possède différents modèles.
le deuxieme alerte me dit que desc a bien pris la valeur blablabla.
Mais apres j'arrive pas a changer
Nos truc possède différents modèles par blablabla.

Soit mon script plante soit il m'affiche pas ce que je lui demande.
Mais SI mon script ne plante pas en tout cas les photos ça reste tjr OK.

Vraiment merci pour ta rep en tout cas je pensais que les gens ne repondait qu'a leur connaissance. Et n'etant pas assez forte pour repondre au autres bah jme débat avec mes propres questions....
[/i]
En fait c'est trop le b***l tn truc. C'est pour ca que personne ne s'y colle à mon avis Smiley smile

1/ Dans une page HTML, les id des elements DOIVENT ETRE UNIQUE. C'est tellement conseillé, que s'en est obligatoire.

2/ C'est incomprehensible ton histoire de truc et de muche. Prend 1 exemple à nous presenter et synthetise pour que ce soit comprehensible pour nous Smiley cligne

3/ pour faire un tableau js avec php :
?>
<script type="text/javascript">
   var monTableau = [<?php echo implode(', ', $monTableau); ?>];
</script>
<?php


4/ Pour affecter une valeur du tableau à l'element dont l'id="desc" :

var eltDesc = document.getElementById("desc");
eltDesc.innerHTML = monTableau[idDesc];



Je pense que tu devrais t'inspirer de cela...

Bon courage
OK je vais essayer d'être plus clair:

Je travail dans une seule page nommée serrurerie.php
Cette page contient 3 catégories porte/portail/cloture
Si je clic sur une de ces catégories alors j'affiche le tableau de miniature de la catégorie sélectionnée.
Pour savoir si on a choisit une catégorie j'utilise une variable php cette variable est renvoyé par un formulaire.
Si $type existe c'est qu'une catégorie a été choisit et dans ce cas j'affiche <?php include 'affichage.php'; ?> (la ou est situé mon pb on va y venir )


<?php 
session_start();
$type=$_POST['type'];
include 'menu.php';?>
<!--/ Si on a choisit une catégorie /-->
if(isset($_POST['type']))
{ ?>
<div id="conteneur2">	
		<p align="center"> Nos <?php echo $type; ?></p>
		<div class="affichagetype" align="center">
			<?php include 'affichage.php'; ?>			
		</div>							
<?php }
else { ?>
<div id="conteneur2">
<!--/ Contenu de BASE/-->
<p align="center"> Venez decouvrir nos porte, portail,  cloture </p>
<form action="http://localhost/wamp/www/sdmi/serrurerie.php" method="post">
	<table class="serru"align="center">
		<tr align="center"><td>Porte</td><td>Portail</td><td>Escalier</td></tr>
		<tr align="center">
			<td><input type="image"  src="photo/serrurerie/miniporte.jpg" value="porte" name="type" /></td>
			<td><input type="image"  src="photo/serrurerie/miniportail.jpg" value="portail" name="type" /></td>
			<td><input type="image"  src="photo/serrurerie/minicloture.jpg" value="cloture" name="type"/></td>
		</tr>
	</table>
</form>
</div>
<?php } ?>


Comme tu peux le voir ici j'ai déjà 2 div avec la même id.
Mais ces deux div sont en fait les même car j'en affiche une SI j'ai la variable $type sinon j'affiche l'autre mais au final je n'ai pas d'interférence entre les deux.

Donc admettons maintenant que nous avons choisit la catégorie porte.
Dans ce cas je suis dans cette partie de code et $type aura la valeur : porte


if(isset($_POST['type']))
{ ?>
<div id="conteneur2">	
		<p align="center"> Nos <?php echo $type; ?></p>
		<div class="affichagetype" align="center">
			<?php include 'affichage.php'; ?>			
		</div>							
<?php } ?>


Nous allons donc afficher <?php include 'affichage.php'; ?> qui est ma galerie de miniature pour les portes.


<div class="photophp">			
	<?php if($type=="portail"){?>
		<dl id="photo">
		<dt> portail1</dt>
		<dd><img id="bigphoto" src="photo/serrurerie/portail1.jpg"/></dd></dl><?php } ?>
	<?php if($type=="porte"){?>
		<dl id="photo">
		<dt> porte1</dt>
		<dd>nbliens<img id="bigphoto" src="photo/porte1.jpg"/></dd></dl><?php } ?>
	<?php if($type=="cloture"){?>
		<dl id="photo">
		<dt> Cloture1</dt>
		<dd><img id="bigphoto" src="photo/porte1.jpg"/></dd></dl><?php } ?>
</div>
<div id="description">
	<?php if($type=="portail"){?> 
		<p align="center" id="title">Portail</p>
		<p>description portail1</p>
	<?php }?>
<?php if($type=="porte"){?> 
		<p align="center" id="title">Porte</p>
		<p>description porte1</p>
	<?php }?>
<?php if($type=="cloture"){?> 
		<p align="center" id="title">Cloture</p>
		<p>description cloture1</p>
	<?php }?>
</div></div>
<table id="mini">
	<tr>
<?php if($type=="portail"){?>
	<td><li><a href="photo/serrurerie/portail1.jpg" title="portail1"><img src="photo/serrurerieminiportail1.jpg" value="portail1" /></a></li></td>
	<td><li><a href="photo/serrurerie/portail2.jpg" title="portail2"><img src="photo/serrurerieminiportail2.jpg" value="portail2" /></a></li></td>
	<td><li><a href="photo/serrurerie/portail3.jpg" title="portail3"><img src="photo/serrurerieminiportail3.jpg" value="portail3" /></a></li></td>
	<td><li><a href="photo/serrurerie/portail4.jpg" title="portail4"><img src="photo/serrurerieminiportail4.jpg" value="portail4" /></a></li></td>

<?php } if($type=="porte"){ ?>
	<td><li><a href="photo/serrurerie/porte1.jpg" title="porte1"><img src="photo/serrurerie/miniporte1.jpg" value="porte1" /></a></li></td>
	<td><li><a href="photo/serrurerie/porte2.jpg" title="porte2"><img src="photo/serrurerie/miniporte2.jpg" value="porte2" /></a></li></td>
	<td><li><a href="photo/serrurerie/porte3.jpg" title="porte3"><img src="photo/serrurerie/miniporte3.jpg" value="porte3" /></a></li></td>
	</tr><?php } ?>
</table>


j'ai pas rajouter le <?php } if($type=="cloture"){ ?> pour éviter le flood hein mais c le mm principe.
Et la aussi il y a ces fameux id identiques!
Mais selon moi cela n'influe pas car notre code ne lit pas ce qui ne le concerne pas.
J'ai récupéré la valeur $type=porte alors il ne se déplacera et ne tiendra compte QUE
ici


<div class="photophp">			
	<?php if($type=="porte"){?>
		<dl id="photo">
		<dt> porte1</dt>
		<dd>nbliens<img id="bigphoto" src="photo/porte1.jpg"/></dd></dl><?php } ?>
</div>
<div id="description">
	<?php if($type=="porte"){?> 
		<p align="center" id="title">Porte</p>
		<p>description porte1</p>
	<?php }?>
</div></div>
<table id="mini">
	<tr>
<?php  if($type=="porte"){ ?>
	<td><li><a href="photo/serrurerie/porte1.jpg" title="porte1"><img src="photo/serrurerie/miniporte1.jpg" value="porte1" /></a></li></td>
	<td><li><a href="photo/serrurerie/porte2.jpg" title="porte2"><img src="photo/serrurerie/miniporte2.jpg" value="porte2" /></a></li></td>
	<td><li><a href="photo/serrurerie/porte3.jpg" title="porte3"><img src="photo/serrurerie/miniporte3.jpg" value="porte3" /></a></li></td>
	</tr><?php } ?>
</table>


Voila pour l'histoire des div je ne pense pas me tromper car la seule chose qui ne marche pas c'est la description le changement de photo au click des miniatures s'effectue correctement et afficher la galerie de miniature correspondant a la catégorie choisit s'effectue aussi correctement.
Donc la théorie que e t'avance pour les div est selon moi exacte après tout un code c'est comme un fleuve il ne va que la ou on le dirige.

Bon deja jpense avoir expliqué cela un peu mieu jvais rajouter qqs screen histoire d'étailler.
upload/36902-tableau1.png
upload/36902-galporte.jpg


Bon voila un début mon code javascript concerne la partie affichage.php jvais deja attendre ta réponse pour voir si j'ai été un peu plus clair. Et jvais regarder ce que tu m'a noté pour le javascript.
a écrit :

3/ pour faire un tableau js avec php :

<script type="text/javascript">

var monTableau = [<?php echo implode(', ', $monTableau); ?>];

</script>



En fait je veux pas faire un tableau javascript avec php (enfin jpense pas ^^)
Le php j'y touche pas normalement car une fois que j'ai cliqué sur la photo c'est le javascript qui travail pas le php.
Mon php se contente de m'orienter dans mes catégories.
Ce que je veux (je pense vouloir) c'est créer un tableau en javacript contenant toutes mes descriptions et en fonction du titre de la photo (que j'arrive à récupérer oui oui ^^)
marquer la description allant avec.
Modifié par Selune (21 Mar 2011 - 11:45)