11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour, bonjour tout le monde...

Je me sens vraiment très stupide car je bute depuis un certain temps sur un problème javascript. L'idée est de changer le background du bouton. Voici le code :

 -- JS --
var value = '';
window.onload = change_back;
function change_back(id) {
  if(value=="more"){
    value="less";
    document.getElementById('advanced_button').style.background='red';
  }else{
    value="more"; 
    document.getElementById('advanced_button').style.background='blue'; 
  }
}

 -- HTML --
<a id="advanced_button" onclick="javascript:change_back('advanced_button');">


Par défaut, le fond doit être bleu.
Au clic, il passe au bleu, puis lorsqu'on reclique dessus il devient rouge... Smiley murf

Vous voyez l'idée ?
Merci merci pour vos solutions Smiley ravi
Modifié par Cygnus (24 Oct 2006 - 23:50)
Modérateur
Salut,

Je te la fais un peu puriste mais bon... Smiley ravi

Vu que le bouton n'est actif que si JS est activé, il faut l'ajouter via JS, ce qui permet de ne pas avoir un bouton inactif pour certains utilisateurs. En fait, tu peux faire ainsi :

<!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>
		<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
		<title>Exemple</title>
		<style type="text/css">/*<![CDATA[*/

[#green].etat1
{
	background-color: blue;
}
.etat2
{
	background-color: red;
}[/#]

		/*]]>*/</style>
		<script type="text/javascript">//<![CDATA[

[#blue]var oO =
{

	// Test de passage d'un argument
	_Test: 
		function()
		{
			var iI = arguments.length - 1;
			for(iI; iI >= 0; iI--) if(!arguments[iI]) return false;
			return true;
		},

	// Ajout d'une action sur un événement
	_Connect:
		function(elm, evType, fn, useCapture)
		{
			if(elm.addEventListener) elm.addEventListener(evType, fn, useCapture);
			else if(elm.attachEvent) elm.attachEvent('on' + evType, fn);
			else elm['on' + evType] = fn;
		},

	// Annulation du click sur un élément
	_CancelClick:
		function(e)
		{
			if(window.event && window.event.cancelBubble && window.event.returnValue)
			{
				window.event.cancelBubble = true;
				window.event.returnValue = false;
			}
			if(e && e.stopPropagation && e.preventDefault)
			{
				e.stopPropagation();
				e.preventDefault();
			}
		},

	// Changement de couleur
	_Color:
		function(elem, css1, css2)
		{
			var sClassCss = elem.className;
			sClassCss = (sClassCss == css1) ? css2 : css1;
		},

	// Création, intégration et action du bouton
	_Play:
		function()
		{
			var oBody = document.getElementsByTagName('body')[0];
			oBody.className = 'etat1';

			var oBtn = document.createElement('a');		
			oBtn.setAttribute('href', '#');
			var oTxtBtn = document.createTextNode('beau bouton');
			oO._Connect(oBtn, 'click', function(e) { oO._Color(oBody, 'etat1', 'etat2'); oO._CancelClick(e); }, false);
			oBtn.onclick = function() { return false; }; // Annulation du click pour Safari

			oBtn.appendChild(oTxtBtn);
			oBody.appendChild(oBtn);
		}

}
oO._Test(document.getElementsByTagName, document.createElement, document.createTextNode) ?
	oO._Connect(window, 'load', oO._Play, false) :
	false;[/#]

		//]]></script>
	</head>	
	<body>
	</body>
</html>
Ca semble un peu compliqué mais en gros...

La méthode oO._Test sert à tester les méthodes dont on se sert dans le script, ce qui permet de n'afficher le bouton que si le script fonctionne...

La méthode oO._Connect permet d'affecter une action sur un événement, ici load ou click.

Lorsqu'on fait un click, on empêche la propagation du click via la méthode oO._CancelClick. Vu que Safari bugue et transmet quand même le click, on ajoute une fonction qui empêche la propagation du click. -> function() { return false; }

La méthode oO._Color prend comme un argument un élément et deux classes CSS. Je définis les styles dans des classes afin de faciliter la gestion... (Si pour modifier ta mise en page, tu dois regarder dans le CSS et dans le JS, ça se corse Smiley cligne )

Enfin, la méthode oO._Play crée le bouton, affecte une classe au body et change la classe du body lorsqu'on clique sur le bouton... Smiley smile
Modifié par koala64 (24 Oct 2006 - 22:36)
Salut et merci pour ta réponse,

Je vais jeter un oeil...
Car ça m'a l'air d'être une usine à gaz ! Smiley murf

En partant du principe que le JS est activé (je sais c'est mal Smiley confused ), n'y at-til pas moyen de pondre quelque chose de plus compréhensible par ma modeste personne ? Smiley lol

Il me semblait qu'on pouvait y arriver avec une variable qui définissait suivant sa valeur 0 ou 1 l'option à choisir et donc l'arrière plan à appliquer... Smiley ohwell
Modifié par Cygnus (24 Oct 2006 - 22:42)
Modérateur
Je préfèrerais t'expliquer les points obscurs plutôt que de te montrer comment mal le faire... Smiley smile

C'est certes un peu hard au premier abord mais la plupart des méthodes utilisées peuvent resservir d'une autre manière, ce qui n'est pas le cas autrement. Je te dirais simplement que si tu t'amuses à multiplier les scripts de ce genre, c'est en le faisant mal que tu vas te retrouver avec une réelle usine à gaz... Smiley cligne

As-tu lu ce tuto au fait ? Ca t'aiderait à mieux comprendre... Smiley murf
Modifié par koala64 (24 Oct 2006 - 22:52)
Merci Smiley lol

<pub>
Je préciserai aux amateurs (ou à ceux qui en ont besoin) que le nouveau tuto JavaSCript est très bien fait... Smiley ravi
</pub>
Modifié par Cygnus (24 Oct 2006 - 23:50)
Bonsoir, j'avais une autre solution plus simple, est-ce qu'elle marche sur Safari :

<!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>
		<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
		<title>Exemple</title>
		<style type="text/css">/*<![CDATA[*/

.etat1
{
	background-color: blue;color:#fff;
}
.etat2
{
	background-color: red;color:#fff;
}

		/*]]>*/</style>
		<script type="text/javascript">//<![CDATA[
document.onclick=function(e)
{
el=e?e.target:event.srcElement;
if(el.id=='advanced_button'){
if(el.className=="etat1")el.className="etat2"
else el.className="etat1"
	}
}
		//]]></script>
	</head>	
	<body>
<a href="#" id='advanced_button' class="etat1">Lien avec changement de couleur de fond seulement si javascript est activé.</a>
	</body>
</html>

Modifié par chmel (25 Oct 2006 - 00:10)
Modérateur
Sans pouvoir tester, je te dis oui parce document.onclick est passe-partout donc si ça bug, c'est ailleurs ! Smiley cligne
d'accord, il n'y as pas de raison, la question est supperflue. Je voulais juste montrer qu'on pouvait aussi faire simple en restant accessible et sans message d'erreur.
Modifié par chmel (25 Oct 2006 - 00:28)