11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Le problème décrit ici est visible sur cette page :
http://turbinus.free.fr/css-lab/pb-undefined.html

Une fonction javascript recoit en paramètre le Id d'un élément de la page ou bien this (objet courant).

Le but est de pouvoir départager les 2 cas, cela fonctionne sans problème sous Firefox avec le code suivant :

function newSrc(a) 
{
	if (a.href == undefined) a = this;

Qui veut dire en gros, si la function a été appelée sans paramètre, elle doit utiliser l'objet qui l'a appelé (this).

Ce test fait planter IE qui affiche une erreur "href a une valeur NULL ou n'est pas un objet".

J'ai deux questions :
1 - Comment faire marcher ce code à la fois sous IE et sous FF?
2 - Existe-t-il une autre méthode pour tester l'absence de paramètre ?

Le code de page :

<body>
<h1>Javascript : Test undefined sous IE</h1>
<p id="menu"><a href="img1.jpg">Test1 appel avec this</a></p>
<p><a href="javascript:changeImgSrc();">Test2 appel avec Id</a></p>
<div id="photo"><img src="img2.jpg" /></div>
<a href="javascript: window.location.reload()">Reset</a>
</body>


Le code javascript :

var img_photo;
var a_link;

function newSrc(a) 
{
	alert("fonction newSrc");
	if (a.href == undefined) a = this;

	img_photo.src = a.href;
	return false;
}	

function changeImgSrc()
{
	newSrc(a_link);
}

function changeSrc()
{
	var menu = document.getElementById('menu') ;
	var a_list = menu.getElementsByTagName('a') ;
	a_link = a_list[0];
	var div_photo = document.getElementById('photo') ;
	img_photo = div_photo.getElementsByTagName('img')[0] ;
	a_link.onclick = newSrc ;
}

// activation au chargement de la page
window.onload = changeSrc ;

Modifié par pat665 (06 Nov 2005 - 17:35)
Lu,

c'est surtout l'utilisation du this qui n'est pas utilisé correctement. this dans ton cas ferait référence à l'objet dont une des méthodes serait newSrc. Or ce n'est q'une fonction et donc this ne fait référence à rien.
Bonjour,
selon toi, qu'est-ce que 'this' est censé représenter ? Parce qu'il a raison, ici il ne représente rien.

Sinon, pour vérifier l'existance ou non d'une variable, on peut se contenter de :

if (variable { 
// variable existe
}


Mais attention : en vérifiant de la sorte, il se peut que la variable existe tout de même, mais ait la valeur null, false, 0, ou une chaîne vide.

Comme il n'existe pas qu'une façon, en voici une autre, qui marche à tous les coups, celle-là :


if (typeof(variable)=="undefined") {
// elle existe
}


Tu peux également utiliser cette technique pour savoir si un paramètre a été fourni ou non en appelant la fonction.
Salut,

a écrit :
selon toi, qu'est-ce que 'this' est censé représenter ? Parce qu'il a raison, ici il ne représente rien.


C'est sympa de répondre, mais à coté c'est fatiguant d'affirmer des trucs non testés. Si "this" ne représentait rien, pourquoi ça marcherait sous Firefox? J'ai pris la peine de faire une page de test simple, pourquoi ne pas l'utiliser avant de répondre. D'ailleurs "this" marche aussi sous IE. Il suffit de remplacer

if (a.href == undefined) a = this;

par
a = this;


pour le vérifier.

J'ai testé (c'est une bonne habitude avant de parler)

if (typeof(variable)=="undefined") 


Ca marche sous IE mais pas sous FF.

Donc retour à la case départ, puisqu'il me faut un code reconnu par les deux.
Piste à suivre:

<a href="javascript:changeImgSrc(this);">


Essayes de donner envie aux gens de répondre au lieu de monter sur tes grands chevaux.
Modifié par Thanh (06 Nov 2005 - 17:31)
Hello,

J'ai trouvé une solution qui marche à la fois sous IE et sous Firefox. Je ne passe plus de paramètre à la fonction qui devient :

function newSrc() 
{
	img_photo.src = this.href;
	return false;
}	


On voit que j'utilise maintenant this. Le code de la fonction changeImgSrc appelle directement la fonction onclick qui avait été redéfinie au chargement de la page.

function changeImgSrc()
{
	a_link.onclick();
}


La page HTML n'a pas changée.

La nouvelle page intégrant ces changements est ici :

http://turbinus.free.fr/css-lab/t1-undefined.html

Dans mon cas réel, je dispose d'un tableau de liens, j'espère que je pourrais adapter cette technique.
Inutile de s'énerver.
As-tu essayé les deux méthodes pour tester l'existance d'une variable ?

IL y en a plein d'autres :
if (variable == undefined)

Si c'est des variables globales seulement :
if (window['variable'])