11521 sujets

JavaScript, DOM et API Web HTML5

Pages :
Bonjour,

Petite question a 1000 euros Smiley smile

Dans le code suivant, je voudrait passer comme valeur d'argument de ma fonction l'objet "li" pour récupérer ses attributs

<li><a href="javascript:maFonction(argument);">Lien</a></li>


Je pensait partir sur un "this.parentNode..." ou un truc du genre... mais c'est un systeme que je ne comprend bien.

D'une manière générale, avez-vous un petit tuto sur la "navigation" entre les élément html avec le JS


Merci par avance.
Modérateur
Salut,

(bis) N'oublie pas les liens en fin de tuto, il y a tout ce que tu cherches dedans. Smiley ravi
Re,

Ben j'ai pas trouvé exactement ce que je voulais, j'ai contourné le pb en jouant avec les "id" sur les li mais je mes ces liens au chaud, ya pas mal de trucs très interressants qui me serviront sûrement.

Merci a vous ^^

Bonne soirée
Bonjour jiDai,
Ton problème n'est effectivement pas résolu.
J'arrive à un résultat en éxécutant le code directement dans l'évènement onclick (lien0) , car this, dans ce cas représente le lien associé.
mais je n'ai comme toi pas compris comment associer this à une fonction (lien2) .
Et voilà le code test à corriger:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title></title>
<style type="text/css" />
</style>
<script type="text/javascript">
function maFonction(e)
{
alert(e.parentNode.id)};
return false // pour ne pas éxécuter le lien	
}
</script>
</head>
<body>
	<ul>
		<li id="li0"><a href="#" onclick="alert(this.parentNode.id);return false">Lien0</a></li>
		<li id="li2"><a href="#" onclick="maFonction(this)">Lien2</a></li>
	</ul>
</body>
</html>

Modifié par chmel (01 Nov 2006 - 17:30)
Oui, avec le onclick ca marche....
mais je ne voulais pas l'utiliser et je ne sais plus pourquoi... Smiley sweatdrop

(Vaut mieux utiliser un onclick qu'un javascript: dans un href ? Y a t-il une préconnisation?)

Ca n'empêche que dans ce dernier cas, le this pointe vers la location du lien et j'aimerais bien savoir comment a partir de ce this pointer vers son élément a Smiley smile

Si quelqu'un à une idée... Smiley smile
Modérateur
Bonsoir,

@chmel :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	<head>
		<title>Exemple</title>
		<script type="text/javascript">//<![CDATA[
			function maFonction(e)
			{
				alert(e.parentNode.id);
			};
		//]]></script>
	</head>
	<body>
		<ul>
			<li id="li0"><a href="#" onclick="alert(this.parentNode.id);return false">Lien0</a></li>
			<li id="li2"><a href="#" onclick="maFonction(this); return false;">Lien2</a></li>
		</ul>
	</body>
</html>


@JiDai :
a écrit :
(Vaut mieux utiliser un onclick qu'un javascript: dans un href ? Y a t-il une préconnisation?)
Oui, il vaut mieux ne se servir du onclick que sur les éléments cliquables d'origine (liens, boutons,...).
koala64 a écrit :
Oui, il vaut mieux ne se servir du onclick que sur les éléments cliquables d'origine (liens, boutons,...).


Lapalisse n'aurait pas fait mieux Smiley cligne
onclick est aussi valable dans un lien. Dans certains cas le lien normal sert à ceux qui n'ont pas javascript et onclick (de préférence non intrusif ) pour les 90% restants.
Je ne réponds pas vraiment à ta question, mais si tu veux utiliser ta fonction sur plusieurs liens, voilà une solution:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>test</title>
<script type="text/javascript">
window.onload = function()
{
liens=document.getElementsByTagName('A')
for(a=0;a<liens.length;a++)
	{
	liens[a].onclick=function()
		{
		alert(this.parentNode.id);return false
		}
	}
}
</script>
</head>
<body>
	<ul>
		<li id="li0"><a href="#">Lien0</a></li>
		<li id="li1"><a href="#">Lien1</a></li>
		<li id="li2"><a href="#">Lien2</a></li>
	</ul>
</body>
</html>

Modifié par chmel (01 Nov 2006 - 20:08)
Modérateur
... ou relis la phrase que tu as encadré et ce que tu en dis aussi... Smiley ohwell

koala64 a écrit :
Oui, il vaut mieux ne se servir du onclick que sur les éléments cliquables d'origine (liens, boutons,...).

chmel a écrit :
onclick est aussi valable dans un lien.
Lapalisse dis-tu ? Smiley smile

Ce serait sympa de ta part d'arrêter le petit jeu que tu mènes depuis quelque temps déjà... Smiley cligne
Désolé pour avoir froissé, je ne comprends pas ton allusion. Mon unique but est d'aider objectivement. Smiley cligne
Modifié par chmel (04 Nov 2006 - 00:23)
Ce n'est pas facile de comprendre les questions mal formulées des débutants.
En l'occurence Jdai demandait si il valait mieux employer :
href="un lien" onclick="mafonction();return false" 
ou
href="javascript:mafonction()"

Je dirai que ça dépends du contexte. Le lien doit signifier quelque chose pour ceux qui n'ont pas javascript ou un autre média que la souris.
chmel a écrit :
Ce n'est pas facile de comprendre les questions mal formulées des débutants.
En l'occurence Jdai demandait si il valait mieux employer :
href="un lien" onclick="mafonction();return false" 
ou
href="javascript:mafonction()"

Je dirai que ça dépends du contexte. Le lien doit signifier quelque chose pour ceux qui n'ont pas javascript ou un autre média que la souris.


Je me trompe peut être mais onclick correspond plus à l'activation du lien qu'au geste "cliquer la souris" (par exemple onclick=Enter au clavier).

Sinon quelque soit le contenu original renseignant l'attribut href d'un lien il y a tout intérêt, je trouve, à le modifier par window.onload plutôt que rajouter un return false dans une fonction onclick.
C'est d'ailleurs toute la limite de l'intérêt (d'un point de vue très théorique soit) de la méthode présentée sur les pop up intelligentes dans openweb (le dispositif est efficace mais peu utile).

Evidemment tout ceci ne vaut que tant qu'il n'y a rien à récupérer (d'un point de vue javascript) dans le renseignement original du href.
Modifié par clb56 (04 Nov 2006 - 00:40)
Modérateur
Salut,

onclick est un gestionnaire d'événement alors que click représente l'événement.

Lorsqu'on se sert d'un gestionnaire d'événement, on lance une action alors que l'événement ne lance rien, ce n'est qu'une propriété indiquant le clic de la souris ou la pression sur la touche Entrée, comme l'a précisé clb56. Ceci n'est valable que pour les éléments cliquables. Si par exemple, on parle du click sur un paragraphe, élément non cliquable d'origine, le click ne représente que le clic de la souris.

href="javascript:mafonction()"
est à éviter. Il suppose que javascript est activé et n'offre pas d'alternative. On peut s'en servir lorsqu'on crée un lien via JS par exemple et qu'on lui affecte un attribut href (puisque la création du lien est déjà optionnelle) mais il est préférable de ne pas le mettre dans la partie XHTML afin de ne pas gêner ceux qui ne disposent pas de JS. Cette instruction ne devrait apparaître qu'au sein du code JS.

href="un lien" onclick="maFonction(); return false;"
est déjà préférable puisque, dans le cas où JS n'est pas actif, le lien reste fonctionnel. Maintenant, un onclick est un attribut qui provient du JS, interprétable en (X)HTML quelquesoit la balise, mais qui sémantiquement parlant, n'apporte rien, au même titre qu'un id ou une class. Dans la mesure du possible, il vaut mieux s'en passer en écrivant simplement :
<a href="un lien">texte du lien</a>

tout comme en CSS, où il vaut mieux commencer par accéder directement à la balise a plutôt que de rajouter systématiquement un id ou une class dans la partie (X)HTML.

CSS et JS sont des couches optionnelles. Il serait donc normal qu'elles n'influent pas sur la structure. On le fait plutôt dans un soucis de simplicité. Pour ne pas encombrer le code, il est alors judicieux de se servir des mêmes attributs pour accéder à l'élément que ce soit avec CSS ou JS. C'est possible avec id et class mais pas avec onclick.

C'est donc là qu'intervient le window.onload, qui charge la surcouche JS au lancement de la page. Plutôt que d'écrire :
<a href="un lien" onclick="maFonction(); return false;">texte du lien</a>

... on laisse le lien tranquille, on crée un fichier JS à part et on accède au lien via la méthode getElementsByTagName qui renvoie un tableau de l'ensemble des liens du document :
fnInitScript()
{
   var oA = document.getElementsByTagName('a')[0];
   oA.onclick = maFonction; // on définit l'action
}
maFonction()
{
   ... // instructions diverses
   return false; // On empêche la transmission de l'url au navigateur
}
window.onload = fnInitScript;
Bien entendu, si le lien n'est pas parmi les premiers de la page, on ne va pas s'amuser à compter combien il y en a pour savoir comment renseigner l'ordre dans le tableau.
C'est donc là qu'on ajoute un id au lien et qu'on remplace la méthode getElementsByTagName par getElementById, qui identifie un élément unique :
<a href="un lien" id="func">texte du lien</a>

fnInitScript()
{
   var oA = document.getElementById('func');
   oA.onclick = maFonction; // on définit l'action
}
maFonction()
{
   ... // instructions diverses
   return false; // On empêche la transmission de l'url au navigateur
}
window.onload = fnInitScript;
Le moindre mal, ici, est qu'on peut se resservir de l'id via CSS.

Si on évite le onclick par un onload, ça manque de souplesse. On ne peut alors lancer une action qu'au chargement de la page, ce qui n'est pas forcémment ce qu'on recherche. Du coup, pour lancer une action sur l'événement click, on charge le script via le onload et c'est au sein même du script qu'on définit l'action via le gestionnaire d'événement onclick en prenant soin de ne pas transmettre l'url au navigateur ( return false; )

Pour en revenir au this...
JiDai a écrit :
Ca n'empêche que dans ce dernier cas, le this pointe vers la location du lien et j'aimerais bien savoir comment a partir de ce this pointer vers son élément a Smiley smile
this pointe l'objet a et non sa "localisation". Dans le cas d'un lien, cet objet possède des propriétés dont l'url de l'élément, obtenue par this.href.


@chmel : Je te réponds par MP afin de ne pas pertuber le fil de la discussion... Rien de bien méchant. Smiley cligne
Modifié par koala64 (04 Nov 2006 - 08:15)
salut,

koala64 a écrit :

Si on évite le onclick par un onload, ça manque de souplesse. On ne peut alors lancer une action qu'au chargement de la page, ce qui n'est pas forcémment ce qu'on recherche. Du coup, pour lancer une action sur l'événement click, on charge le script via le onload et c'est au sein même du script qu'on définit l'action via le gestionnaire d'événement onclick en prenant soin de ne pas transmettre l'url au navigateur ( return false; )


Ba je ne vois pas ce qui empêche de faire

html

<a href="page.html"  id="func">Lien</a>


et javascript

function modif_lien()
{
function ma_fonction() {
blablabla
}
document.getElementById('func').href="javascript:ma_fonction();";
}
window.onload=modif_lien;


Sauf encore une fois s'il y a quelque chose à récupérer dans le href d'origine.
Modifié par clb56 (04 Nov 2006 - 18:05)
Modérateur
Salut,

Certes... Je n'avais pas voulu développer plus pour ne pas trop embrouiller mais puisque tu le demandes... Smiley lol

Le problème, en fait, est que tu monopolises le load affecté à window pour ta fonction modif_lien.

Si tu avais un script en amont, qui lui aussi était lancé par window.onload, ça ne marche plus car le onload ne peut être appliqué deux fois de suite pour le même objet. C'est pour ça que le W3C préconise de se servir de la méthode addEventListener, qui, comme tu le sais peut-être, n'est pas compatible avec tous les navigateurs (IE, etc...) mais qui a l'avantage de ne pas s'approprier le load sur l'objet window. On n'a pas de limite quant à l'affectation de fonctions...

J'en parle justement en fin du tuto des bonnes pratiques où j'indique quels sont les équivalents pour IE & co.. (A noter d'ailleurs que le problème est le même quelquesoit le gestionnaire d'événement dont tu te sers.) La difficulté provient surtout des différences de fonctionnement de chaque navigateur pour la gestion des événements ; tout le code qui en découle génère des fonctions, parfois, complexes...

clb56 a écrit :
Sauf encore une fois s'il y a quelque chose à récupérer dans le href d'origine.
C'est à dire ? Quel est le problème ? J'ai du mal à suivre ton idée... Smiley langue
Modifié par koala64 (04 Nov 2006 - 13:45)
koala64 a écrit :

Le problème, en fait, est que tu monopolises le load affecté à window pour ta fonction modif_lien.

Cette affaire est connue et vaut pour n'importe quelle fonction lancée au onload
Mais depuis que je connais le super script de jep :
evenements-multiples-chargement-page

ben je n'ai plus de problème avec ça Smiley smile

koala64 a écrit :

C'est à dire ? Quel est le problème ? J'ai du mal à suivre ton idée... Smiley langue

Ba c'est juste une chose que je viens de remarquer à l'occasion d'un petit truc que je suis en train de faire Smiley biggrin
http://www.clb56.fr/test_php_js/playlist_dewplayer/

En fait je me suis rendu compte qu'il était intéressant de récupérer dans une variable une partie de la chaine de caractère composant le href du lien cliqué. Alors évidemment hors de question de modifier ce href Smiley smile
Modérateur
Ah ! euh bon... Là, ça touche un point que je ne maîtrise pas trop... Smiley ravi Je peux donc dire des bêtises... Smiley langue

La fonction de Jep se sert de la méthode eval(). Celle-ci est généralement à éviter car elle est connu pour favoriser le cross-site-scripting, en particulier, lorsqu'on laisse la possibilité à l'utilisateur d'intervenir sur des données entrantes... Dans ton petit truc, tu passes tes titres au Dewplayer via l'url... Un utilisateur malveillant, peut donc, s'il le souhaite, entrer un code malicieux via la barre d'adresse qui, par exemple, génère de nouvelles variables en plus de renseigner le titre, un script (pas forcémment JS) par exemple... Via ce script, cet utilisateur peut annihiler le fonctionnement du tien ou s'en servir et lancer ce qu'il souhaite, une nouvelle chanson, une redirection, une demande de mot de passe, enfin... vraiment tout ce qu'il souhaite ! Smiley confus Avec eval, tu demandes au navigateur d'éxécuter le code rentré par l'utilisateur... Je te laisse imaginer la suite... Smiley lol

Propos à confirmer car je ne suis pas expert en sécurité... Smiley murf
Modifié par koala64 (04 Nov 2006 - 15:32)
koala64
Propos à confirmer car je ne suis pas expert en sécurité... [murf a écrit :




ben moi non plus...

Mais je n'ai jamais rien lu qui emette des réserve sur le script de Jep.

Dans mon cas, je ne pense pas que cela puisse concerner javascript puisque celui ci ne part que du href codé dans le document qui envoit les titres et non du résultat dans la barre d'adresse qui les reçoit.

Par contre pour le script php je ne sais pas... Mais il me semble que ce que j'ai fait est très banal finalement.
Modifié par clb56 (04 Nov 2006 - 18:03)
...

bonsoir à tous !!

Concernant le 'problème ' de onload ( appel unique ) j'avais lu une "méthode"
contournant cette restriction et de mettre en lieu et place du traditionnel

<body onload="foo();">


l'utilisation d'une fonction anonyme (anonymous function) apellant les autres :


window.onload = Function() {
foo();
truc();
chouette();
 }



j'espère que cela peut aider un temps soit peu !
++
Pages :