11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,
quelqu'un pourrait-il m'expliquer ce code ?
Il est fonctionnel mais je voudrais l'adapter à ma galerie et je ne comprends pas son fonctionnement.
Quel équivalent avec des var par exemple ?
Quelques indices de votre part pourraient me faire avancer. Smiley murf
Merci d'avance !!

Le code javascript:

function displayPics(e)

{

el=window.Event?e.target:event.srcElement;

if(!el.tagName)el=el.parentNode // pour NS6+

if(el.parentNode.parentNode.className=="galerie")

	{

	with(el.parentNode.parentNode)

		{

		for(c=0;c<childNodes.length;c++)

			{

			if(childNodes[c].tagName=="P")

				childNodes[c].firstChild.data=el.parentNode.title

			if(childNodes[c].tagName=="IMG"){

				with(childNodes[c]){

					src=el.parentNode.href;

					alt=el.parentNode.title;

					}

				}

			}

		}

	return false

	}

}	

document.onclick=displayPics


il fonctionne avec ce html:


<div class="galerie">
    
    <a href="images/photo1.jpg" title="Titre de la photo 1"><img src="images/minis/m_photo1.jpg" alt="Le titre de la photo 1" /></a>

	  <a href="images/photo2.jpg" title="Titre de la photo 2"><img src="images/minis/m_photo2.jpg" alt="Le titre de la photo 2" /></a>
      
      <a href="images/photo3.png" title="Titre de la photo 3"><img src="images/minis/m_photo3.png" alt="Le titre de la photo 3" /></a>

    <img src="images/photo1.jpg" alt="Photo 1 en taille normale" name="IMG" id="IMG" />
      

</div>
var ou pas var ? ce n'est qu'une question de visibilité. Si tu n'a pas de var mavariable c'est que c'est variable est globale, si un var précède celle ci c'est qu'elle est disponible uniquement dans cette méthode/fonction.

Ton script a l'air assez vieux, cf le commentaire "// pour NS6+", Netscape n'est plus très courant... ça date des années 90 Smiley cligne
Merci pour tes précisions.
Le script est peut-être vieux mais il est court et il marche vraiment bien. Pour l'instant ça me suffit...
J'ai un problème avec les childs et les parents ! J'aimerais savoir quelles sont les règles, si on peut mettre une classname==avec un child à la place d'un tagname. Et si ça changeait la hierarchie avec un parent.classname== de départ.
Merci d'avancepour vos idées...
@sylvbouy : si tu expliquais précisément ce que tu cherches à faire ça serait plus simple pour t'aider. Peut être même pour réécrire un script plus propre que celui la (le code est un peu tordu et pas très optimisé).

KalNex a écrit :

Ton script a l'air assez vieux, cf le commentaire &quot;// pour NS6+&quot;, Netscape n'est plus très courant... ça date des années 90 Smiley cligne


Pas vraiment non, Netscape 6 c'est les années 2000...
Modifié par jb_gfx (22 Feb 2011 - 21:44)
Merci pour les réponses, j'explique plus précisément;

J'aimerais comprendre (si c'est faisable) comment on peut avec un code javascript faire communiquer deux div class différentes.
Dans ce cas précis les images miniatures chargées dans la première div class 'galerie' par exemple, modifieraient au click l'image agrandie de la seconde div class !!

Le html sous cette forme?

<div class="galerie"> 
     
    <a href="images/photo1.jpg" title="Titre de la photo 1"><img src="images/minis/m_photo1.jpg" alt="Le titre de la photo 1" /></a> 
 
      <a href="images/photo2.jpg" title="Titre de la photo 2"><img src="images/minis/m_photo2.jpg" alt="Le titre de la photo 2" /></a> 
       
      <a href="images/photo3.png" title="Titre de la photo 3"><img src="images/minis/m_photo3.png" alt="Le titre de la photo 3" /></a> 
 
</div> 

<div class="img">    

<img src="images/photo1.jpg" alt="Photo 1 en taille normale" name="IMG" id="IMG" /> 
       

</div> 



J'arrive à comprendre le script et à le mettre en place pour deux id différentes mais je pige pas pour les class !
Une petite idée ! ou un tuyau pour me sortir de mon ignorance...
Merci a vous !
Modifié par sylvbouy (23 Feb 2011 - 01:57)
a écrit :
@sylvbouy : communiquer avec des class c'est possible mais c'est un peu lourd, je ne vois pas ce qui t'empêche de faire des id a la place. Je trouverais même ça mieux, a moins qu'il y ait plusieurs galerie et plusieurs img dans la même page... est ce le cas ?


C'est le cas, j'ai plusieurs galeries et plusieurs images dans la même page !
Merci beaucoup pour le lien KalNex. Je regarde tout de suite !!
Je me méfie des GetElementsByClass, il paraît que ça fonctionne de manière assez aléatoire en fonction des navigateurs.

KalNex ! Quand tu dis que c'est un peu lourd ! A quoi faut-il s'attendre ?
Effectivement si tu n'as qu'une galerie dans la page autant utiliser des id, c'est beaucoup plus simple à gérer en js natif (voir GetElementById()).
sylvbouy a écrit :
Je me méfie des GetElementsByClass, il paraît que ça fonctionne de manière assez aléatoire en fonction des navigateurs.

Celui qui est dans le lien que je t'ai passé devrait bien fonctionner, de plus il n'utilise que des fonctions natives javascript pour récupérer la/les class.
(j'ai testé ça a l'air pas mal)

sylvbouy a écrit :
KalNex ! Quand tu dis que c'est un peu lourd ! A quoi faut-il s'attendre ?

C'est juste que le getElementsByClass est quand même un peu plus compliqué que le natif getElementById... Quand je dis lourd, c'est au niveau de la lourdeur du code, mais si tu as plusieurs galerie c'est une solution.

Normalement avec seulement des getElementById, getElementsByTagName (natif Smiley cligne ) et getElementsByClass tu devrais pouvoir t'en sortir.
(j'ai fais un bout de script pour tester si ça te dis, sachant que j'ai fais ça vite fais et que je n'ai pas tester sous plusieurs navigateur)
Merci pour ton aide !
Je commence à décortiquer et à tenter quelques scripts.
Mais j'avoue que le GetElementsByClass c'est pas très clair pour moi !

a écrit :
kalNex à écrit:
(j'ai fais un bout de script pour tester si ça te dis, sachant que j'ai fais ça vite fais et que je n'ai pas tester sous plusieurs navigateur)


Si c'est pas trop abusé de te demander ton script je voudrais bien y jeter un coup d'oeil !
Merci pour tes infos qui me sont d'une aide précieuse !
Voici le code que j'ai fais, par contre j'ai pas la prétention d'avoir écrit le code parfait ^^'
C'est ouvert à toutes modifications et à tous commentaires Smiley cligne

Voici le HTML :

<div class="galerie">
    <a href="images/photo1.jpg" title="Titre de la photo 1"><img src="images/minis/m_photo1.jpg" alt="Miniature de la photo 1" /></a>
    <a href="images/photo2.jpg" title="Titre de la photo 2"><img src="images/minis/m_photo2.jpg" alt="Miniature de la photo 2" /></a>
    <a href="images/photo3.png" title="Titre de la photo 3"><img src="images/minis/m_photo3.png" alt="Miniature de la photo 3" /></a>
    
    <div class="imageContainer">
        <img src="images/photo1.jpg" alt="Photo 1 en taille normale" title="Titre de la photo 1" name="IMG" id="IMG" />
    </div>
</div>

<div class="galerie">
    <a href="images/photo3.png" title="Titre de la photo 3"><img src="images/minis/m_photo3.png" alt="Miniature de la photo 3" /></a>
    <a href="images/photo2.jpg" title="Titre de la photo 2"><img src="images/minis/m_photo2.jpg" alt="Miniature de la photo 2" /></a>
    <a href="images/photo1.jpg" title="Titre de la photo 1"><img src="images/minis/m_photo1.jpg" alt="Miniature de la photo 1" /></a>
    <a href="images/photo3.png" title="Titre de la photo 3"><img src="images/minis/m_photo3.png" alt="Miniature de la photo 3" /></a>
    
    <div class="imageContainer">
        <img src="images/photo3.png" alt="Photo 3 en taille normale" title="Titre de la photo 3" name="IMG" id="IMG" />
    </div>
</div>


J'ai mis l'image a affiché dans la div "galerie" pour pouvoir la récupérer plus facilement.

et voici le javascript :
function getElementsByClass(node, searchClass, tag) {
    var classElements = new Array();
    var els = node.getElementsByTagName(tag); // use "*" for all elements
    var elsLen = els.length;
    var pattern = new RegExp("\\b"+searchClass+"\\b");
    for (ii = 0, j = 0; ii < elsLen; ii++) {
        if ( pattern.test(els[ii].className) ) {
            classElements[j] = els[ii];
            j++;
        }
    }
    return classElements;
}

window.onload = function() {
    // Recuperation des plusieurs div class='galerie'
    var galeries = getElementsByClass(document, 'galerie', 'div');
    if (galeries) {
        // Pour toutes les galeries
        for (var galerieIndex = 0; galerieIndex < galeries.length; galerieIndex++) {
            // Recuperation des balises 'a' dans la div 'galerie'
            var imageLinkArray = galeries[galerieIndex].getElementsByTagName('a');
            for (var linkIndex = 0; linkIndex < imageLinkArray.length; linkIndex++) {
                // Pour chaque balises ajouter l'evenement onclick qui executera la fonction displayImage
                imageLinkArray[linkIndex].onclick = displayImage;
            }
        }
    }
}

// Fonction pour afficher les images
function displayImage(event) {
    // this est notre balise 'a' ou l'on vient de cliquer
    var imageHref = this.getAttribute('href'); // Recuperation du href
    var imageTitle = this.getAttribute('title'); // Recuperation du title
    // Recuperation de l'image container
    var imageContainer = getElementsByClass(this.parentNode, 'imageContainer', 'div')[0]; // [0] car il n'y en a qu'un seul...
    // Recuperation de la balise 'img' dans l'image container
    var image = imageContainer.getElementsByTagName('img')[0]; // [0] car il n'y en a qu'un seul...
    image.setAttribute('src', imageHref); // On met la href en source de l'image
    image.setAttribute('alt', imageTitle); // On met le title en titre alternatif de l'image
    image.setAttribute('title', imageTitle); // On met le title en tooltip de l'image
    return false; // Stop l'evenement du clique, permet de ne pas afficher l'image cliqué...
}


Là encore j'ai rien inventé et ça fonctionne, testé sous IE7 et Firefox 3.
Merci beaucoup!

Voici le script que j'ai tenté de mettre en place de mon côté
Pour l'instant ça marche pas vraiment !


function displayPics() 
{ 

var photos = getElementsByClass(document,"galerie");

var liens = photos.getElementsByTagName("a") ;

var big_photos = getElementsByClass(document,"IMG");

for (I=0;I<nodeClass.length; I++) {
	
        // Au clique sur ces liens  
        liens[i].onmouseover = function() { 
            big_photos.src = this.href; // On change l'attribut src de l'image en le remplaçant par la valeur du lien 
            return false; // Et pour finir on inhibe l'action réelle du lien 
        }; 
    } 
} 
window.onload = displayPics;


[/i]
Modifié par sylvbouy (23 Feb 2011 - 16:58)
Si tu veux garder le même fonctionnement que sur le script de début, commence déjà à récupérer toutes les galeries correctement Smiley cligne
var photos = getElementsByClass(document,"galerie");

-> ça ne peut pas fonctionner...

Le context est ok, le nom de la classe aussi mais par contre il te manque le 3ième paramètre : tu peux sois mettre "*" (ce qui correspond a chercher dans tout ton code html) ou alors mettre "div" (ce qui veut dire que le getElementsByClass va chercher uniquement dans les balises "div", une manière d'optimiser le code).
Ensuite le retour de cette fonction est un tableau qui contient tous les éléments qui ont une class "galerie", donc tu dois utiliser la variable photos dans une boucle.

Quelque chose du genre :
var photos = getElementsByClass(document, "galerie", "div");
for (var galerieIndex = 0; galerieIndex < photos.length; galerieIndex++) {
    var liens = photos[galerieIndex].getElementsByTagName("a");
}


Et encore une fois le retour de getElementsByTagName est lui aussi un tableau (même s'il ne trouve qu'un élément!).
Merci pour le script
Mais je n'arrive pas à le faire fonctionner même en le reprenant tel quel !
L'image ne se charge pas dans le container mais dans une nouvelle fenêtre.
Etrange vu que ça marche chez toi KalNex !

Merci pour les explications en ce qui concerne les récupération des class galerie !
Je crois que je vais approfondir dans ce sens.

a écrit :

kalNex à écrit;
Et encore une fois le retour de getElementsByTagName est lui aussi un tableau (même s'il ne trouve qu'un élément!).


En gros ça veut dire qu'il faut faire un script dans ce genre


function displayPics() 
{ 

var photos = getElementsByClass(document, "galerie", "div"); 
for (var galerieIndex = 0; galerieIndex < photos.length; galerieIndex++) { 
    var liens = photos[galerieIndex].getElementsByTagName("a"); 
}

var big_photos = getElementsByClass(document,"imageContainer","div");
	
        // Au clique sur ces liens  
        liens[i].onmouseover = function() { 
            big_photos.src = this.href; // On change l'attribut src de l'image en le remplaçant par la valeur du lien 
            return false; // Et pour finir on inhibe l'action réelle du lien 
        }; 
    } 
} 
window.onload = displayPics; 


[/i]
Non car ta variable "liens" n'est visible que dans ta boucle for.

Et en plus comme "liens" est un tableau tu dois faire une nouvelle boucle for (donc a l'intérieur de la première) pour parcourir tout tes liens.