11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je cherche à garder en constante un tableau. Je m'expolique. Lorsque je load ma page je fais.

deb=document.getElementById('tablechaine').getElementsByTagName("span");

mon var deb = new Array(); est mis en variable globale.

Apres je crée dans une fonction, un new array. Qui fait:

tab=document.getElementById('tablechaine').getElementsByTagName("span");

En clair c'est une copie de deb.

Mais là je fais des modifs sur le backgound image. Puis si je clique sur un bouton, je souhaite retrouver mon tableau d'origine qui est stocké dans deb.

Malheureusement il me l'affiche avec les modifs.

Derniere chose. Je ne change jamais deb!

A part dans le onload.

Et je ne charge pas d'autres fenetres. Tout se passe dans la meme.

Une idée?

Merci


<body id="body" scroll="no" onLoad="init()">





var deb = new Array();

    function pageLoadFunctions()
    {
	    init();
        setBGColor("#666666");
        checkSVP();
        setCounter();
        setArray();
        startFocus();
    }
	
function init()
{
deb=document.getElementById('tablechaine').getElementsByTagName("span");
}



Modifié par dalton5 (25 Apr 2007 - 23:14)
Salut,

pas assez de code pour vraiment dire.

a écrit :
Derniere chose. Je ne change jamais deb!


Mais je vois que en plus du onload tu as réutilisé la fonction init() dans la fonction qui suit.

donc normal tu ne conserve en memoire que l'avant dernier etat si tu as fais plusieurs changement non?
bonjour

ce que tu mets dans ta variable deb par la méthode TagName est déjà un tableau !!

tu n'as pas besoin de recréer un tableau array

var ded = document.getElementByTagName('...');


tagName retourne un objet NodeList ( voir les methodes relatives)

Il est souvent conseillé de n'utiliser les variables globales qu'exceptionnelement
et de passer plutôt les valeurs en arguments de fonctions

Il existe également la méthode getElementsByName
qui utilise l'attribut .... name ( Smiley lol ) qui n'est pas obligatoirement unique comme 'id'
Modifié par kzone (22 Apr 2007 - 10:52)
Les noeuds DOM, comme tous les objets, sont passés par référence et non par valeur. Essaie de faire une copie explicite, au moyen de la fonction cloneNode.
bien alors j'ai testé avec une image. Au départ j'ai une image 1 pour mon premier span.

Puis je le hide. Et j'affiche une deuxieme image (m6). Puis je souhaite revenir à la premiere.

Et là je veux affficher ma varible globale.

Le probleme c est qu elle a changé avec la nouvelle image.

Je comprends pas.

Je n'ai pas bien compris le clonenode.

Je vous ai mis une partie de mon code js

//Script js


var deb;
	
function init()
{
deb=document.getElementById('tablechaine').getElementsByTagName("span");
}
	
	function searchChaine(reche)
{


var tab = new Array();
var tab2 = new Array();
var i=0;	
	tab2=document.getElementById('tablechaine').getElementsByTagName("span")
	
	if(reche.length>0)
	{	
		for(i =0;i<tab2.length;i++)
		{
			if(tab2[i].title.substring(0,reche.length)==reche)
			{
				tab.push(tab2[i]);
			}
		}
	
	var phrase = "Votre recherche pour " + reche +" a retourné " + tab.length + " occurences ";
	document.getElementById('debut').innerHTML= phrase;
	hideTable(tab);
	}
	

	// Sinon je souhaite réafficher l'état de ma page initiale.

	else 
	{
	for(k=0;k<tab2.length;k++)
	{
	tab2[k].style.display='none';
	}
	
		for(j=0;j<deb.length;j++)
		{
		deb[j].style.display = 'block';
		}
	
	document.getElementById('debut').innerHTML= "Tapez la chaine que vous souhaitez ou cliquez dessus pour changer de chaine";
	}
	
	
	

	 
}

   
	
	function hideTable(tab)
	{
	var table = new Array();
	//alert(tab.length);
	table=document.getElementById('tablechaine').getElementsByTagName("td");
	
	for(i=0;i<table.length;i++)
	{
	table[i].style.display='none';
 	}
	

	for(j=0;j<tab.length;j++)
	{
	tab[j].style.display = 'block';
	tab[j].style.backgroundImage='url("Images/Chaines/m6.jpg")';
	}

	
	
}
	
	
</script>
[/i][/i][/i]
Modifié par dalton5 (22 Apr 2007 - 18:13)
Je plussoie QuentinC :

a écrit :
Les noeuds DOM, comme tous les objets, sont passés par référence et non par valeur. Essaie de faire une copie explicite, au moyen de la fonction cloneNode.


Que tu modifie deb Smiley truc ou tab Smiley truc ils modifient le même élément dans la page. En fait c'est exactement le même élément.

Si tu veux absolument avoir deux tableaux d'éléments DOM différents il te faut faire une copie du tableau en clonant chaque noeud un par un.

Par exemple avec :


deb=document.getElementById('tablechaine').getElementsByTagName("span");
var copie = [];
for (var k=0, length=deb.length;k!=length;k++) {
copie[k] = tab[k].cloneNode(true);
}


Attention, tu aura donc une copie de deb dans copie mais ces éléments là ne sont actuellement pas présent dans la page (.parentNode = null)