11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour.

Je me présente rapidement: je m'appelle RNB, journaliste scientifique et, entre autre chose, l'un des animateurs du site Framasoft.

Résumé rapide de la situation qui m'amène à écrire mon premier message sur un site que je fréquente depuis quelques mois déjà:

Mon site perso possède un style switcher (celui de Paul Sowden). J'ai implémenté une liste de liens qui permettent de passer d'un style à l'autre. En voici une version simplifiée, replacé dans la structure de la page web:

<div id="header">
<p id="access">...</p>
[b]<p id="switcher"><a href="#" title="sans style">Sans style</a> | <a href="#" title="printemps">Printemps</a> | <a href="#" title="ete">Eté</a> | <a href="#" title="automne">Automne</a> | <a href="#" title="hiver">Hiver</a> | <a href="#" title="nuit">Nuit</a></p>[/b]
<h1>...</h1>
(...)
</div>


1. étant donné que le script style switcher ne fonctionne qu'avec javascript, je voulais éviter d'afficher cette liste de liens quand le javascript est désactivé. D'ou la solution qui a perduré pendant un moment: l'appel d'une fonction javascript "switcher()" dans le code HTML, fonction qui écrit la dite liste de liens (avec un document.write "classique"). Si le javascript est déscativé, la liste n'apparait donc pas.


<div id="header">
	<p id="access">...</p>
	[b]<script type="text/javascript">//<![CDATA[<!--
	switcher();
	//-->//]]></script>[/b]
	<h1>...</h1>
	(...)
</div>


2. Suivant les recommandations d'Olivier Patry et d'autres, qui préconisent de purger tant que faire ce peut le code (x)HTML de toute "intrusion" javascript non indispensable, j'ai pensé écrire cette liste de liens "directement" en passant par le DOM, sans avoir à placer le code ci-dessus dans les pages HTML. D'où la fonction suivante, appelée ensuite lors du chargement de la page:


function switcher() {
	[#green]// Tableau des styles[/#]
	var style = new Array(5);
	style[0] = "sans style";
	style[1] = "printemps";
	style[2] = "ete";
	style[3] = "automne";
	style[4] = "hiver";
	style[5] = "nuit";
	[#green]// Création des liens pour les styles[/#]
	var style_link = new Array(5);
	for (var k=0; k<6; k++) {
		style_link[k] = document.createElement("a");
		style_link[k].setAttribute("href", "#");
		style_link[k].setAttribute("title", style[k]);
		style_link[k].appendChild(document.createTextNode(style[k]));
		}
	[#green]// Créer l'élément p avec l'id 'switcher'[/#]
	var para = document.createElement("p");
	para.setAttribute("id","switcher");
	[#green]// Construction du paragraphe[/#]
	for (var j=0; j<6; j++) {
		para.appendChild(style_link[j]);
		if (j<5) { // pas de séparateur pour le dernier lien
			para.appendChild(document.createTextNode(" | "));
		}
	}
	[#green]// variable identifiant le conteneur header (parent)[/#]
	var header = document.getElementById('header'); 
	[#green]// identifier le titre h1 pour insérer le switcher[/#]
	var titre = document.getElementById('access').nextSibling;
	[#green]// Ecriture du switcher avant le titre dans le header[/#]
	header.insertBefore(para, titre);
	[#green]// écouter les évenements[/#]
	switcher_listen();
}


La question est simple, et j'aimerai avoir l'avis des professionnels de la profession: me suis-je compliqué la vie outre mesure? Existe-t-il une méthode plus simple pour faire la même chose? En ré-utilisant par exemple 'document.write', mais sans avoir à appeler la fonction dans le code HTML (je n'ai rien trouvé qui ressemble à ca)?

Petite précision: je n'y connais absolument rien en javascript. Ce script, c'est du pur empirisme intuitif (essai/erreur). Donc, soyez indulgent si vous trouvez que la solution est abracadabrantesque ou si je viens de réinventer le fil à couper le beurre à base d'une tronçonneuse ...

Merci...
Modifié par RNB (22 Apr 2005 - 10:00)
Bonjour,

Je déconseille l'utilisation de document.write() car il ne fonctionne pas si le document est traité comme du xml (je dis ça car je vois une section CDATA dans votre code).

Voilà un exemple de script "switcher" où les gestionnaires d'évènement et le code html sont ajoutés en utilisant le javascript et le DOM:
http://dev.webnaute.net/Applications/Switcher/

edit: ah, le dernier morceau de code que vous donnez me semble déjà bien.
Modifié par Bobe (22 Apr 2005 - 13:43)
Bobe a écrit :
edit: ah, le dernier morceau de code que vous donnez me semble déjà bien.


Bonsoir Bobe. Merci.

C'est en effet sur ce morceau de code que je souhaiterais avoir quelques avis avisés: puisque je souhaite supprimer l'appel de fonction javascript dans le code html, je dois écrire le paragraphe qui porte les liens du switcher par le dom. je pourrais le placer directement en tant que html, mais comme il s'agit d'une 'fantaisie', un petit plus, je ne souhaite qu'il vienne encombrer le code de la page inutilement (si le javascript n'est pas activé, ben pas de liens pour utiliser le switcher).

Pour le 'style switcher' en lui-même (écriture du cookie, changement du style par défaut), j'utilise le code de Paul Sowden. Stu nicholls en a fait un qui est pa mal aussi.

Merci pour le lien. Je vais y jeter un oeil.
Une solution très simple, en espérant qu'elle te convienne :

html


<head>
<script type="text/javascript" src="voir_switcher.js"></script>
</head>
<body id="body">

etc...



et voir_switcher.js


function mettre_switcher()
{
var contenu_body=document.getElementById('body').innerHTML

document.getElementById('body').innerHTML=contenu_body+'<p id="switcher"><a href="#" title="sans style">Sans style</a> | <a href="#" title="printemps">Printemps</a> | <a href="#" title="ete">Eté</a> | <a href="#" title="automne">Automne</a> | <a href="#" title="hiver">Hiver</a> | <a href="#" title="nuit">Nuit</a></p>';
}
window.onload=mettre_switcher


voilà ++
clb56 a écrit :
Une solution très simple, en espérant qu'elle te convienne :

function mettre_switcher() {
var contenu_body=document.getElementById('body').innerHTML

document.getElementById('body').innerHTML=contenu_body+'<p id="switcher"><a href="#" title="sans style">Sans style</a> | <a href="#" title="printemps">Printemps</a> | <a href="#" title="ete">Eté</a> | <a href="#" title="automne">Automne</a> | <a href="#" title="hiver">Hiver</a> | <a href="#" title="nuit">Nuit</a></p>';
}
window.onload=mettre_switcher



Bonsoir clb56.

Merci pour l'exemple avec innerHTML: c'est exactement ça.

J'avais hésité à utiliser cette propriété parce qu'elle ne fait pas partie des specs Dom2 du W3C (mais tous les navigateurs semblent la supporter).

J'ai aussi lu une étude qui montre que innerHTML travaille plus vite qu'une solution en "DOM pur".

Alors j'hésite entre mon slalom à travers le dom et la solution innerHTML.

Merci encore pour l'exemple.

Si quelqu'un d'autre à une solution pur DOM plus clean que la mienne, je suis preneur.