11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

J'ai récemment adapté un menu css/javascript de type "suckerfish" http://alistapart.com/articles/dropdowns/.

J'ai deux problèmes interdépendants....

Le premier est que je veux utiliser onfocus et onblur pour garantir également l'accès au clavier, dans un fichier js lié afin de ne pas les utiliser directement dans le code html. Je sais que depuis il y a eu des versions améliorées avec accès au clavier : http://carroll.org.uk/sandbox/suckerfish/bones2.html. Mais ça m'ennuie de les utiliser parce que sous IE sans javascript, le menu marche pas... Ce qui m'amène au second problème : je veux qe tous mes sous-menus soient déployés comme ceci lorsque js est désactivé, pour être sûre qu'il y a encore la possibilité d'accès aux contenus et de navigation au clavier :

upload/12897-fo.png

Or, le code du nouveau menu suckerfish accessible au clavier ne permet pas cet effet qd js est désactivé : il s'entête à vouloir continuer sur le modèle "déroulant".

Donc, je souhaite avoir de l'aide pour adapter le code qui suit, pour :
(1) permettre l'accès clavier grâce à onblur/onfocus, grâce à du js non intrusif
(2) prévoir un déploiement de tous les menus/sous-menus visibles lorsque js est désactivé.


Actuellement, les fragments de code css, js et html qui suivent permettent un menu déroulant uniquement au contact de la souris, et pour ie, le js doit être activé:


http://pages.usherbrooke.ca/eviau/menuprob/in.html

Merci à l'avance Smiley smile
Modifié par nalita33 (26 Jun 2007 - 08:04)
Modérateur
Un petit ajout... Smiley ravi

Le mieux, ce n'est pas de passer par onfocus et onblur car les onmachinchose ne peuvent être multipliés sur un même élément. La gestion des événements type DOM2 (focus, blur) est préférable (mais plus complexe) pour conserver cette possibilité.

Nota : Les prochains menus d'Alsacréations reposeront là-dessus d'ailleurs.
Je connais bien la version du menu de Fairytells (v1 et v2), il s'agit certes d'un très bon travail.... Par contre, je le trouve un peu moins intéressant que les menus suckerfish keyboard actuels. Il a plusieurs éléments à corriger, dont celui de créer une vibration au contact des sous-menus avec la souris et de mal afficher la subdivision des sous-menus dans les versions de mozilla et firefox légèrement plus anciennes. C'est un problème connu et répertorié, et je ne veux pas faire de concession là-dessus, car c'est vraiment hallucinogène pour l'internaute... et j'en ait fait l'expérience.

Quand je pensais à onfocus et à onblur, je pensais en fait au menu de iubito :
http://iubito.free.fr/prog/menu.php, qui intègre onfocus et onblur. Je voulais toutefois que ces deux éléments ne soient pas intérégrés dans le code html, pour des raisons de validation w3C, mais surtout pour l'aspect pratique : mise à jour facilité pour des néophytes du html, car pas de jeux de codes et d'appels de fonction à effectuer "manuellement" dans le code html.

Je croyais possible d'intégrer onblur et onfocus en même temps que onmouseover et onmouseout en raison de cet article :

http://onlinetools.org/articles/unobtrusivejavascript/chapter2.html (voir l'exemple final de code en bas de cette page, avec des fonctions onfocus, onblur, onmouseover, onmouseout toutes ensemble).

Merci
J'ai tenté de prendre les choses en main une à la fois... à commencer par le voilement par défaut des sous-menus si js est activé.

J'ai désigné dans mon css que mes sous-menus sont déployés par défaut (sans js)...


 
#nav li ul {display: block;
	border-bottom: 0px; 
	position: absolute;
	left:0px;}


J'ai fait une class .avecjs (dans #nav li.avecjs ul) qui masque le sous-menu par défaut si js est activé.

 
#nav li.avecjs ul { width: 12em;
	position: absolute;
	padding:0px;
	left:-999em;}



Je l'attribue dynamiquement avec js, de sorte que les sous-menus soient voilés par défaut si js est activé :


// menu déroulant au contact de la souris

MenuSouris = function()
{
  if (document.all&&document.getElementById)
  {
    RacineMenu = document.getElementById("navlist");
    if (RacineMenu) {
      for (i=0; i<RacineMenu.childNodes.length; i++)
	  {
        node = RacineMenu.childNodes[i];
        if (node.nodeName=="LI")
		{
	  
	  node.className = " avecjs";
	  node.onmouseover=function() { this.className+= " over"; }
          node.onmouseout=function() { this.className=this.className.replace(" over", ""); }
       
		}
	  }
	}
  }
}


window.onload=MenuSouris;


Tout fonctionne comme des roulettes dans Internet Explorer, mais pas dans firefox... Que faire? Smiley biggol Merci d'avance. [/i]
Modérateur
Salut, Smiley smile

Je n'ai pas fait le tour de ton menu mais ton script n'est pas prévu pour fonctionner avec Firefox à cause de document.all (qui dit donc que c'est pour IE uniquement)

Par ailleurs, ce n'est pas à CSS de gérer l'ouverture / fermeture des sous-menus mais bien à JS. CSS est bien plus limité de ce côté : tu ne peux pas mettre de temporisation par exemple.

La difficulté d'intégrer la navigation clavier vient du fait que les événements du type mouseover / mouseout "bouillonnent" alors que ce n'est pas le cas des événements du type focus / blur.

voir ces tutos :
http://css.alsacreations.com/Tutoriels-JavaScript/La-gestion-des-evenements-en-JavaScript
http://gilles.chagnon.free.fr/cours/dhtml/evenements.html
http://www.quirksmode.org/js/introevents.html

Il faut donc gérer cela d'une manière différente.

a écrit :
Par contre, je le trouve un peu moins intéressant que les menus suckerfish keyboard actuels.
Non, je ne trouve pas. FairyTells répond mieux à la problématique des menus déroulants... mais il est vrai qu'il y a un petit scintillement... sur Fx 1.0.7 en tout cas. (A partir de Fx 1.5, il n'y a plus de problème)

a écrit :
Il a plusieurs éléments à corriger
Y'a-t-il une liste ? Je ne la connais pas ; ça m'intéresse.

a écrit :
mais surtout pour l'aspect pratique : mise à jour facilité pour des néophytes du html, car pas de jeux de codes et d'appels de fonction à effectuer "manuellement" dans le code html.
+1 Smiley cligne

a écrit :
Je croyais possible d'intégrer onblur et onfocus en même temps que onmouseover et onmouseout
oui, tout à fait ; je voulais simplement dire que si tu affectes un onmouseover sur un élément, un autre script ne pourrait plus, à son tour, ajouter un onmouseover sur le même élément (pour une autre action). C'est le problème de la gestion d'événements selon DOM 0.

voir ici :
http://css.alsacreations.com/Tutoriels-JavaScript/bonnes-pratiques-javascript#event

En ce qui concerne ta demande, j'ai bien un script qui répond à tes attentes (l'un des futurs menus d'Alsa') mais... je tiens à finaliser le tutoriel avant d'en faire part donc ben... patience. Je tente de le sortir au plus vite... Smiley confused
Modifié par koala64 (27 Jun 2007 - 15:12)
Merci Koala64 pour les explications...

J'ai cherché pendant trois semaines un script qui correspondait à mes attentes (en ordre de priorité, quoique tout soit important à mes yeux!) :


- L'utilisation d'éléments de listes (<ul><li>...) et des css pour le rendu d'affichage du menu (l'apparence)
- L'utilisation d'un js non intrusif, géré dans un fichier à part
- Un menu horizontal tout déployé si js est désactivé
- Un menu navigable au clavier
- Un menu qui ne scintille pas comme celui de Fairytells
- (ET si possible), un menu qui présente un délai avant l'enroulement du menu, pour ceux et celles qui maîtrisent moins leurs mouvements.

L'ensemble de mes critères visait à faciliter la mise à jour des menus (néophytes ou non) et à le rendre plus accessible.

Je suis heureuse de savoir qu'un futur menu d'Alsa répondra en tout ou en grande partie à ces attentes!! Après autant de recherche, je capitule! Je me doutais que mes attentes n'étaient pas aussi farfelues, mais bon, ma force est en (x)html/css, malheureusement pas en js. D'où mes difficultés d'implanter les comportements que j'avais en tête.

Je crois que je vais attendre patiemment l'issue de ton tutoriel... Smiley smile Pour information (sans pression Smiley ravi ) , sera-il offert au cours des prochaines semaines?


a écrit :
Y'a-t-il une liste ? Je ne la connais pas ; ça m'intéresse.

En fait, j'ai dû mal m'exprimer... Il y a en effet un nombre d'éléments à corriger qui ont été répertoriés via les posts de rétroaction dans Fairytells.
Après avoir effectué des tests, j'ai compilé (ma liste perso) un certain nombre d'éléments plus "désagréables" :

- Clignottement du menu au survol de la souris dans Mozilla/FireFox versions plus anciennes
- Décalement des contours des sous-menus (espaces irréguliers)
- Code js comprenant à la fois la gestion du menu et du "canevas accessible" : difficile pour un débutant en js d'isoler le menu du reste des comportements...

Le clignottement m'appaissait le plus critique (même si réglé dans des versions plus récentes de firefox), et je n'étais pas prête à sacrifier le confort des usagers de la souris pour implanter une navigation clavier. (Problèmes de lisibilité, épilepsie, etc.). Comme je l'ai dis auparavant, je trouve le menu de fairytells très bien. Seulement,dans mon cas, il réponds moins à mes besoins...
Modifié par nalita33 (27 Jun 2007 - 16:57)
Modérateur
Hello,

nalita33 a écrit :
Je crois que je vais attendre patiemment l'issue de ton tutoriel... Smiley smile Pour information (sans pression Smiley ravi ) , sera-il offert au cours des prochaines semaines?
C'est ce que j'envisage. Smiley ravi -> Il m'est urgent de me séparer de ce gros boulet que je traine depuis pas mal de temps déjà. En tout cas, tous les critères que tu cites sont respectés. Smiley cligne
Modifié par koala64 (28 Jun 2007 - 09:40)
Bonjour,

je suis également intéressé par la solution que l'équipe de alsacreations est en train d'imaginer.

Quand pensez-vous la publier ?