11545 sujets

JavaScript, DOM et API Web HTML5

Je vous explique mon problème:

je veux faire un menu déroulant tout ce qu'il y a de plus simple.

Sauf que au lieu d'avoir un déroulement au "onmouseover", je veux que ce soit sur un "onclick".

Fort bien, remplaçons onmouseover par un onclick.

Et ça marche! Mais du coup, pas le onmouseover, qui désormais est pris en compte dès que je bouge de l'élèment fraichement cliqué.

window.onload=toggle;
function toggle(){
	var selectbox = document.getElementById('selectbox')
	if (selectbox.style.display == 'none') {
		selectbox.style.display = 'block'
	} else {
		selectbox.style.display = 'none'
	}
}

function toggle2(){
	var selectbox = document.getElementById('selectbox')
		selectbox.style.display = 'none'

}


* et ensuite son implémentation *

<div id="select" >

			
		<dt><a href="#" onmouseover="javascript: toggle()" onmouseout="javascript: toggle2();" class="menulink">menu</a></dt>
		
		

		
			<dd id="selectbox" onmouseover="javascript: toggle()"  class="menulink" onmouseout="javascript: toggle2();">


alors en retirant des onmouseout là où logiquement il en faudrait pas, ou en retirant des onclick etc, ça marche pas forcément mieux.

help.
Modérateur
bonjour à toi aussi et bienvenue Jori, Smiley smile

Jori a écrit :
je veux faire un menu déroulant tout ce qu'il y a de plus simple.
Ah ?! C'est simple, tu trouves ? Smiley rolleyes

Pourquoi as-tu besoin d'un menu déroulant ? Est-ce pour rendre service à tes visiteurs ? As-tu un plan de site ?

Bon, le soucis, c'est qu'actuellement, tu as déjà perdu ceux qui naviguent au clavier donc faudrait le corriger... trois fois rien... ça complique un peu le script mais bon, on ne va pas en faire une montagne...

Ah ! Je vois aussi que tu monopolises les éléments de ton menu pour les gestionnaires d'événement définis dans ton script. (Impossible qu'un autre script vienne se servir du même événement sur la balise <a/> insérée dans ton dt par exemple...) D'ailleurs, impossible de mettre un autre script externe vu que seul ton script peut être chargé (window.onload). Tout de suite, ça complique un peu plus mais bon, ce n'est pas infaisable... et puis ce n'est qu'un futur problème technique... ça n'affecte pas les visiteurs donc c'est moins grave.

hum... Par contre, si on désactive JS, à quoi sert cette balise <a/> ? Vaudrait mieux générer ce lien via JS ou bien le rendre utile lorsque JS est désactivé non ? parce que là, quand l'utilisateur se trouve dans ce cas et qu'il clique dessus, ben il se passe rien... Smiley confus Bon, c'est vrai... on étoffe encore un peu plus le script mais c'est simple non ? Smiley cligne

mmh... Pourquoi une liste descriptive ? La définition d'un menu ne correspond pas à ce qu'il contient... (oups ! désolé, celle-là, j'aurais mieux fait de m'abstenir... Smiley confused pas grave, j'assume... Smiley lol )

Je vois que sur ta balise <dd/>, tu as un identifiant et une classe... C'est utile ?

arf... bon... pour recoller un peu plus à ta question, pourquoi crées-tu deux fonctions pour le même type d'action ? et pourquoi sur les <dt/> et sur les <dd /> ? m'est avis qu'il y a des petites choses en trop... Smiley smile
Modérateur
euh... Je complète un peu... Smiley ravi

Loin de moi l'idée de te descendre hein ! Smiley cligne

mais un menu déroulant, ben c'est loin d'être simple... J'en sais quelquechose, ayant entamé la refonte du tuto actuel, il y a quelques mois déjà...

Avant de faire ce choix, faut vraiment être sûr qu'on ne peut pas faire autrement... d'où ma réponse. Smiley smile

On peut continuer dans ce sens et palier à ton problème mais réfléchis-y à deux fois...

Si vraiment tu ne peux pas attendre, tu devrais faire un petit tour du côté du menu déroulant de FairyTells... Ca t'en apprendrait pas mal...
Wah toutes ces questions... mais heu attends... c'est moi le n00b ici, je ne sais pas y répondre O_o tu pourrais me donner une ou deux pistes?

Comment je fais pour charger le javascript autrement que par window.onload ? Si je ne le fais pas, le menu sera déroulé, ce que je prefere plutot que de le cacher via css avec un display:none, justement par soucis d'accessibilité.

http://e-jori.com/etc/hover.html

Voilà le lien vers le bidule - exigence de client -. Ce qui est simple, c'est visuellement, pour l'internaute. Pas au niveau du code, évidemment. L'objectif est de garder exactement le même aspect visuel, avec la même fonctionnalité qu'une select box, tout en étant accessible aux moteurs de recherche.

Pour le <a> qui semble inutile au premier abord, c'est pour avoir le :hover sur IE6 du background.

edit: ah je viens de voir ton complément de réponse, je vais éplucher ton lien, je sais pas si il répondra à mes questions actuelles, mais je serais moins bête.
Modifié par Jori (28 Mar 2007 - 15:07)
Modérateur
arf... ces clients ! Smiley lol

bon dac, je peux déjà te donner quelques pistes...

Ce qui serait bien, ce serait déjà que tu lises ce tuto dans son ensemble... Même si tu ne comprends pas tout, ça devrait commencer à t'orienter ne serait-ce que pour les questions de la navigation clavier et du window.onload. Smiley cligne

Je reviendrais sur ton sujet un peu plus tard, ne disposant pas de beaucoup de temps (là tout de suite)
Modérateur
euh... désolé... je suis un peu dans le speed... donc, je te l'ai fait Smiley confused

... à la va-vite et sans les gestionnaires d'événements type DOM-2 vu qu'apparemment, ça ne te sert pas à grand chose...
(ça complexifierait pas mal le script surtout)
Je l'ai mis pour l'événement load quand même, des fois que tu aies d'autres scripts à ajouter...

Au moins, ça fonctionne au clavier, c'est un moindre mal...
Par contre, mon coup de l'image, c'est pas top... peut mieux faire mais pas le temps... Smiley langue sorry

<!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>blehover</title>
	<meta http-equiv="Content-type" content="text/html; charset=iso-8859-1" />
	<script type="text/javascript">//<![CDATA[

(function () {

var oO =
{
	_Connect: function(oElem, sEvType, fn, bCapture)
	{
		return document.addEventListener ?
			oElem.addEventListener(sEvType, fn, bCapture):
			oElem.attachEvent ?
				oElem.attachEvent('on' + sEvType, fn):
				false;
	},

	_oId: function(sId)
	{
		if(document.getElementById(sId))
			return document.getElementById(sId);

		return;
	},

	_aTag: function(oEl, sTag)
	{
		if(oEl && sTag && oEl.getElementsByTagName(sTag) != 0)
			return oEl.getElementsByTagName(sTag);

		return;
	},

	_oCreaLink: function(oEl)
	{
		if(oEl)
		{
			var oA = document.createElement('a');
			oA.setAttribute('href', '#ssmenu');
			oA.setAttribute('id', 'ctrl');
			oA.appendChild(oEl);
			return oA;
		}

		return;
	},

	_Actif: function()
	{
		var oSelect = oO._oId('select'),
		    oUl = oO._aTag(oSelect, 'ul')[0],
		    oLi = oO._aTag(oSelect, 'li')[0],
		    oCtrl = oO._oCreaLink(oLi.firstChild);
		
		oUl.className = 'cache';
		
		oLi.replaceChild(oCtrl, oLi.firstChild);
		
		oCtrl.onmouseover = oO._ChangeImg;
		oCtrl.onfocus = oO._ChangeImg;
		oCtrl.onmouseout = oO._InitImg;
		oCtrl.onblur = oO._InitImg;
		oCtrl.onclick = oO._CtrlDisplay;
		
		return;
	},
	
	_ChangeImg: function()
	{
		return this.firstChild.src = 'liste-survol.png';
	},
	
	_InitImg: function()
	{
		return this.firstChild.src = 'liste.png';
	},

	_CtrlDisplay: function()
	{
		var oLi = this.parentNode,
		    oUl = oO._aTag(oLi, 'ul')[0];
		
		oUl.className = oUl.className === 'cache' ?
			'montre' :
			'cache';

		if(oUl.className === 'montre')
			oO._aTag(oUl, 'a')[0].focus();

		return false;
	}
};

oO._Connect(window, 'load', oO._Actif, false);

})();

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

@media screen, projection {

	body {
		font-family: Verdana, Arial, Helvetica, sans-serif;
		font-size: 80%;
		color: #000;
		background-color: #fff;
		margin: 20px;
	}
	#select {
		font-size: 1em;
	}
	#select img {
		height: 1.6em;
		border: 0;
	}
	#select {
		list-style-type: none;
		padding: 0;
		margin: 0;
	}
	#select ul {
		list-style-type: none;
		margin: -3px 0;
		padding: 1px;
		width: 146px;
		border: 1px solid #bbb;
		height: 10em;
		overflow: auto;
		background-color: #fff;
	}
	#select li {
		padding: 0;
		margin: 0;
	}
	#select a {
		color: #676767;
		font-size: .8em;
		text-decoration: none;
		display: block;
		padding: 1px 1px 1px 5px;
	}

	/* class et id lorsque JS actif */

	.cache {
		display: none;
	}
	.montre {
		display: list-item;
		position: absolute;
	}
	a#ctrl {
		text-decoration: none;
		padding: 0;
		width: 150px;
	}
	a#ctrl img {
		height: 2em;
	}
}

	/*]]>*/</style>
</head><body>

<ul id="select">
	<li><img src="liste.png" width="150" height="18" alt="menu" />
		<ul>
			<li><a href="#">bleh</a></li>
			<li><a href="#">blah</a></li>
			<li><a href="#">bloh</a></li>
			<li><a href="#">bleh</a></li>
			<li><a href="#">blah</a></li>
			<li><a href="#">bloh</a></li>
			<li><a href="#">blehnnf dkbvk bksdbkj bsdknvjk bsdvbsv lnsknd  sfo jposjdfp </a></li>
			<li><a href="#">blah</a></li>
			<li><a href="#">bloh</a></li>
			<li><a href="#">bleh</a></li>
			<li><a href="#">blah</a></li>
			<li><a href="#">bloh</a></li>
			<li><a href="#">bleh</a></li>
			<li><a href="#">blah</a></li>
			<li><a href="#">bloh</a></li>
			<li><a href="#">bleh</a></li>
			<li><a href="#">blah</a></li>
			<li><a href="#">bloh</a></li>
		</ul>
	</li>
</ul>

<p>bleh</p>

</body></html>

Modifié par koala64 (28 Mar 2007 - 20:53)
Et bien merci beaucoup Smiley smile

J'ai appris plein de trucs Smiley smile

En fait, ce que je vais faire, c'est de remplacer en js mon code orienté "moteurs de recherche" par une select box tout à fait normale. Comme ça, les utilisateurs verront la select box, et Google le contenu alternatif, sans soucis Smiley smile