11548 sujets

JavaScript, DOM et API Web HTML5

Salut,

Je suis un débutant en Ajax et j'ai pris un bout de code sur Ajax à 200% car il correspond à un besoin que j'ai rencontré : faire apparaitre du texte au clic sur un autre.

Mon problème est que la citation est toujours visible alors qu'elle ne devrait l'être qu'au clic sur le texte "Citation du jour".

Je travaille avec FF 1.5.0.7

Merci d'avance

Voici tout d'abord le javascript toggle-visible.js :

function toggle_visible (elName) {
    var el = document.getElementById(elName);
    var isVisible = (el.style.visibility == "hidden") ? true : false;
    
    el.style.visibility = isVisible ? "visible" : "hidden";
    el.style.display = isVisible ? "inline" : "none";
}


Et voici la page HTML qui l'utilise :


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <meta name="generator" content="PSPad editor,  www.pspad.com">
 
  <script type="text/javascript" src="toggle-visible.js"></script>
  <title>Test affichage avec Ajax</title>
  </head>
  <body>
        <table border=0 width="35%" cellpadding="3">
            <tr>
                <td bgcolor="404080" onclick="toggle_visible('divCitation');">
                    <font color="#fff">
                        Citation du jour
                    </font>
                </td>
            </tr>
            <tr>
                <td bgcolor="#E0E0E0">
                    <div id="divCitation">
                        <em>"Ils ont échoué parce qu'ils n'avaient pas commencé par le rêve."</em>
                        -- William Shakespeare
                    </div>
                </td>
            </tr>
        </table>
  </body>
</html>
Salut,

Juste une petite chose, histoire de faire le chieur : ceci n'est pas de l'Ajax. Ce serait, pour quelqu'un de pas très poli ( Smiley lol ) du DHTML. Ajax consiste en la communication avec le serveur sans rafraichissement de la page.

Quant à ta fonction, elle fonctionne bien (même si elle pourrait être simplifiée). Peut-être que tu souhaitais que la citation soit masquée au chargement et n'apparaisse qu'au clic ?
golog a écrit :
Salut,

Juste une petite chose, histoire de faire le chieur : ceci n'est pas de l'Ajax. Ce serait, pour quelqu'un de pas très poli ( Smiley lol ) du DHTML. Ajax consiste en la communication avec le serveur sans rafraichissement de la page.

Comme je l'ai dit je débute dans ce domaine et comme c'est dans un livre sur Ajax, j'ai un amalgame à tort.

golog a écrit :
Quant à ta fonction, elle fonctionne bien (même si elle pourrait être simplifiée). Peut-être que tu souhaitais que la citation soit masquée au chargement et n'apparaisse qu'au clic ?

Oui, mais plus exactement que si elle est cachée, un clic la fasse apparaître et qu'un nouveau clic la fasse disparaître.
Modérateur
Bonjour pyxosledisciple,

a écrit :
Oui, mais plus exactement que si elle est cachée, un clic la fasse apparaître et qu'un nouveau clic la fasse disparaître.
Ah oué, rien de plus simple pour quelqu'un qui se met à l'Ajax (sous-entendu qui maîtrise XHTML, CSS, JS, qui a des connaissances sur XML ou JSON, PHP,... et qui sait rendre ses codes accessibles). Ca doit être juste un petit oubli alors... Smiley smile Voilà de quoi se rafraîchir la mémoire :

index.php

<?php
header("Content-type: text/html; charset=iso-8859-1");
?><!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" media="screen, projection">
			@charset "iso-8859-1";
			@import "style.css.php";
		</style>
		<script type="text/javascript" src="script.js.php"></script>
		<script type="text/javascript"><!--
			document.write('<'+'style type="text/css"><!--');
			document.write('div { display: none; }');
			document.write('--><'+'/style>');
		//--></script>
	</head>	
	<body>
		<h3>Citation du jour</h3>
		<div>
			<q>Ils ont échoué parce qu'ils n'avaient pas commencé par le rêve.</q>
			<p>William Shakespeare</p>
		</div>
	</body>
</html>


style.css.php
<?php
header("Content-type: text/css; charset=iso-8859-1");
?>
a
{
	font-weight: bold;
	color: #000;
	font-size: 1.3em;
}
a:hover, a:focus, .Over, .Focus
{
	color: #D0D;
}
.Affiche
{
	display: block;
}
.Cache
{
	display: none;
}


script.js.php
<?php
header("Content-type: text/javascript; charset=iso-8859-1");
?>
var oUtil =
{
	'handle': 'h3',
	'elem': 'div',
	'CSS1': 'Affiche',
	'CSS2': 'Cache',
	'CSS3': 'Over',
	'CSS4': 'Focus',
	'attr': 'class',

	_Test: function()
	{
		if(!document.getElementsByTagName ||
			!document.createElement ||
			!document.createTextNode) return false;

		return oUtil._Scenario(oUtil['handle'], oUtil['elem']);
	},

	_Scenario: function(handle, elem)
	{
		var oHandle = document.getElementsByTagName(handle)[0];
		var oLink = oUtil._CreaLink('#', oHandle.lastChild.nodeValue);
		var oElem = document.getElementsByTagName(elem)[0];

		oElem.className = oUtil['CSS2'];
		document.getElementsByTagName('body')[0].replaceChild(oLink, oHandle);

		oUtil._Connect(oLink, 'over', function() { oLink.className = oUtil['CSS3']; }, false);
		oUtil._Connect(oLink, 'focus', function() { oLink.className = oUtil['CSS4']; }, false);
		oUtil._Connect(oLink, 'out', function() { oLink.removeAttribute(oUtil['attr']); }, false);
		oUtil._Connect(oLink, 'blur', function() { oLink.removeAttribute(oUtil['attr']); }, false);
		oUtil._Connect(oLink, 'click', function(e) { oUtil._Style(oElem); oUtil._CancelClick(e); }, false);
	},

	_CreaLink: function(href, txt)
	{
		var oTmpLink = document.createElement('a');
		var oTmpTxtLink = document.createTextNode(txt);
		oTmpLink.setAttribute('href', href);
		oTmpLink.appendChild(oTmpTxtLink);
		return oTmpLink;
	},

	_Style: function(elem)
	{
		elem.className = elem.className == oUtil['CSS2'] ? oUtil['CSS1'] : oUtil['CSS2'];
		if(elem.className == oUtil['CSS2']) elem.blur();
	},

	_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;
	},

	_CancelClick: function(e)
	{
		if(window.event)
		{
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		if(e && e.stopPropagation && e.preventDefault)
		{
			e.stopPropagation();
			e.preventDefault();
		}
	}
};
oUtil._Connect(window, 'load', oUtil._Test, false);


Bien entendu, ces codes ne te posent aucun problème et tu en comprends les moindres rouages, n'est-ce pas ? Smiley ravi

Plus sérieusement, dans l'Ajax, il y a une bonne partie Javascript... Connais-tu ce langage ? Ca ne se limite aux notions de base lorsqu'on touche à l'Ajax. Ce que tu demandes est, somme toute, basique mais mérite quelques attentions particulières, ce pourquoi j'ai la forte impression que tu tentes de brûler les étapes... Smiley cligne

Je pense que tu devrais prendre le temps de te pencher un peu plus sur toutes les technologies qui constituent l'Ajax ainsi que sur certaines notions d'accessibilité avant même de penser à en faire.

Par ailleurs, le jour où tu y viendras, Ajax à 200% n'est pas un livre pour apprendre... Préfère ceux qui se trouvent dans ce sujet :

http://forum.alsacreations.com/topic-5-17057-1-Livres-de-rfrence-Javascript.html

Ce qui ne va pas dans ce que tu souhaites faire, c'est que tu ne devrais déjà pas avoir un tableau pour la mise en page mais de préférence un code sémantique... donc, au moins, un titre (hn), une courte citation (q) suivi d'un paragraphe (p). Par ailleurs, un titre n'est pas censé être cliquable. Si tu changes son rôle et que tu le rends cliquable, tu mets les utilisateurs naviguant au clavier à la porte. Il faut donc remplacer le titre par un lien généré en JS puis redonner au lien obtenu l'apparence d'un titre via CSS. Il est préférable de laisser le soulignement pour indiquer que c'est un lien et si tu souhaites donner un effet au survol comme ci-dessus, il est bon de le doubler via le focus pour que tout le monde puisse voir cet effet (navigation clavier). Donc, ne crois-tu pas qu'il te reste beaucoup de choses à apprendre avant de te pencher sur l'Ajax ? J'en ai bien l'impression... Smiley cligne

Bien sûr, ce n'est qu'un avis, libre à toi de continuer à faire de la soupe... Smiley smile
Modifié par koala64 (21 Sep 2006 - 09:48)
Bonjour,

a écrit :
Comme je l'ai dit je débute dans ce domaine et comme c'est dans un livre sur Ajax, j'ai un amalgame à tort.

Pas de souci, c'est une confusion que font aussi les professionnels (surtout les gens du marketing... forcément, c'est très "hype" Smiley murf ).

En ce qui concerne ton problème, il faut donc faire une fonction qui va masquer ta citation au chargement de la page (événement "onload" de l'objet "window"). Cette fonction devra aussi réagir au click sur la cellule de ton tableau (entre parenthèses, les tableaux sont inutiles ici, et les CSS pourraient t'éviter de mixer structure et contenu avec la présentation, pour une maintenance plus aisée, etc.). Pour simplifier, j'ai ajouté un ID sur cette cellule (toggleCitation) :
<table border="0" width="35%" cellpadding="3">
	<tr>
		<td bgcolor="404080" id="toggleCitation">
			<font color="#fff">
				Citation du jour
			</font>
		</td>
	</tr>
	<tr>
		<td bgcolor="#E0E0E0">
			<div id="divCitation">
				<em>"Ils ont échoué parce qu'ils n'avaient pas commencé par le rêve."</em>
				-- William Shakespeare
			</div>
		</td>
	</tr>
</table>

Le javascript maintenant :
function toggleCitation() {
	if(typeof document.getElementById == 'undefined') {return;}
	var trigger = document.getElementById('toggleCitation');
	var cible = document.getElementById('divCitation');
	if(!trigger || !cible) {return;}
	cible.style.display = 'none';
	trigger.onclick = function() {
		cible.style.display = cible.style.display == 'none' ? 'block' : 'none';
	};
}
window.onload = toggleCitation;

Le premier test vérifie l'existence de la méthode "getElementById". Si le navigateur ne la supporte pas, inutile de poursuivre. Ensuite, on récupère "toggleCitation" et "divCitation". Puis nouveau test : si ces éléments n'existent pas, inutile de poursuivre. Maintenant que l'on est sûr que l'on peut disposer de ces éléments, "divCitation" peut être masqué. On peut également appliquer un événement "onclick" sur "toggleCitation". On teste alors la propriété "display" de "divCitation" pour le masquer ou le montrer. Pour terminer, on charge la fonction en "onload". Attention avec cette façon de charger les fonctions, car tu ne pourras en charger qu'une seule (la dernière). C'est d'ailleurs vrai pour tous les événements appliqués de cette façon :
objet.événement

Une solution (pas idéale) consiste par exemple à rassembler toutes les fonctions devant être exécutées au démarrage :
function init() {
 functionName1();
 functionName2();
 ...
}
window.onload = init;

Si tu lis bien l'anglais, je te conseille vivement le livre DOM Scripting

Edit : grillé par koala Smiley lol (ta solution est un peu balèze pour un débutant quand même Smiley eek )
Modifié par golog (21 Sep 2006 - 09:59)
Modérateur
oups ! désolé golog ! Smiley lol

J'avais effectivement l'impression d'en faire trop avec mon code mais au moins, ça montre comment gérer tout çà pour ne pas être bridé par le fait qu'on ne puisse mettre qu'une méthode par événement et quelles sont les notions d'accessibilité à prendre en compte.

C'était un peu le terrain de jeu idéal pour ce genre d'exercice... Smiley ravi

Je suis d'accord avec toi que c'est un peu 'hard' à cerner comme çà, mais en même temps, un débutant doit-il se lancer directement sur de l'Ajax ? C'était juste histoire de remettre les choses à leur place... Smiley cligne
Modifié par koala64 (21 Sep 2006 - 10:23)
koala64 a écrit :
mais en même temps, un débutant doit-il se lancer directement sur de l'Ajax ? C'était juste histoire de remettre les choses à leur place...

C'est sûr, il vaut mieux commencer doucement... Ce n'est déjà pas évident de maîtriser HTML/CSS... alors en plus JS + langages serveurs !
Je pense effectivement que pyxosledisciple essaye de mettre la charrue avant les boeufs. Quelques bons bouquins expliquant les bases seraient une bonne chose avant de se lancer là-dedans...
golog a écrit :

C'est sûr, il vaut mieux commencer doucement... Ce n'est déjà pas évident de maîtriser HTML/CSS... alors en plus JS + langages serveurs !
Je pense effectivement que pyxosledisciple essaye de mettre la charrue avant les boeufs. Quelques bons bouquins expliquant les bases seraient une bonne chose avant de se lancer là-dedans...

Pour HTML, CSS et PHP, ça va j'ai l'habitude mais l'exemple fourni dans le livre précédemment cité était, semble-t-il tronqué, et je m'en rends bien compte avec l'exemple de Koala64 qui me permet de mieux appréhender le pb.

J'avais cité cet exemple car il répondait à un besoin bien précis car pour l'instant j'utilise une combinaison de span et :hover.

Merci en tous cas pour vos conseils.