11513 sujets

JavaScript, DOM et API Web HTML5

Bonsoir à tous,

afin d'améliorer mes compétences, je me suis lancé un petit défis : refondre cette page, entièrement en XHTML 1.0 Strict et CSS. Smiley smile

Avant toute chose, je désire modifier le système de bulle d'aide dont vous pouvez voir un aperçu en passant votre souris sur les noms de items.

Je me suis d'abord tourné vers des solutions Full CSS, telle que la solution fournie par Raphaël. Mais celles-ci posent un problème : le contenu des bulles d'aide est simplement un plus, il devient donc très génant pour navigateur ne supportant pas les CSS ou un lecteur d'écran.

Je me suis ensuite penché vers JavaScript qui, lui, me parrait plus indiqué pour ce genre de chose. C'est d'ailleurs la solution employée sur le site. Mais leur système ne me plait pas du tout, je ne le trouve pas pratique (côté développement), et rend le code illisible ; j'aimerai donc modifier ceci. Après recherches, je suis tombé sur un script proposé par Jep. Mais celui-ci ne me convient pas non plus, il utilise les attributs title et alt..

A partir de là j'ai essayé de faire mon script JavaScript moi même, mais vu mon niveau de ce côté, je me suis vite retrouvé au pied du mur. Smiley rolleyes J'ai donc cherché des cours/tutoriels/exemples/etc, mais j'avoue être un peu perdu : "c'est aux normes, ça l'est pas ? ... et ça ? ca passe sur quel(s) navigateurs .. mhh..". Dûr dûr.

Je me suis donc dit que, peut-être, quelqu'un d'ici pourrait m'aider en me donnant des pistes à suivres, de bons liens (en français) ou, si le coeur lui en dit, en me fournissant un code bien commenté. Non, je ne demande pas qu'on me fasse tout le boulot.! Enfin.. un peu quand même.. Je blague bien entendu. Smiley smile J'apprends bien mieux avec un code (même gros) bien commenté, plutôt qu'en suivant des tutoriels à paliers (variables > tableaux > typages > etc...) bien lourds et rebarbatifs quand on connais déjà plus ou moins bien des langages tels que PHP, ASP ou encore VB. Smiley langue

Voici ma requête :

Je désire donc réaliser un script JavaScript de bulles d'aides visuelles (le contenu est un plus, puisqu'on le retrouve aussi sur la page dédiée à l'objet) respectant au maximum les standards.
La bulle doit, comme ici, suivre le pointeur de la souris (avec position par rapport au pointeur réglable) et rester affichée tant que celui-ci est sur le lien.
J'aimerai aussi qu'elle puisse s'affichée à doite ou à gauche du pointeur selon la position de celui-ci par rapport aux bords de la fenêtre (à droite par defaut).


Voilà ou j'en suis niveau code pour le moment :

<!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>Test de tooltip</title>
  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15" />
  <style type="text/css">
   body { background-color: #000; font-family: Verdana, sans-serif; font-size: small; }
   .bold { font-weight: bold; }
   .white { color: #fff; }
   .gray { color: #9d9d9d; }
   .green { color: #1eff00; }
   .blue { color: #0070dd; }
   .purple { color: #a335ee }
   ul { margin: 0; padding: 0; }
   li { list-style-type: none; }
   a { text-decoration: none; }
   a:hover { text-decoration: underline; }
   a:before { content: '['; }
   a:after { content: ']'; }
   div.tooltip { padding: 3px; width: 250px; border: 1px solid #fff; background-color: #1a1a1a; color: white; }
  </style>
  
  <script language="text/javascript">
   //Déclarations des contenus des Tooltips utilisés sur la page en cours [@PHP]
   var item01 = "<span class=\"bold gray\">Bâton de guerre massacreur</span><br />Deux mains<br />Bâton<br />Dégâts : 59 - 89<br />Vitesse 3.10<br />(23.9 dégâts par seconde)<br />Niveau 46 requis";
   var item02 = "<span class=\"bold white\">Bâton de guerre</span><br />Deux mains<br />Bâton<br />Dégâts : 85 - 129<br />Vitesse 3,30<br />(32,4 dégâts par seconde)<br />Niveau 40 requis";
   var item03 = "<span class=\"bold green\">Bâton long des mages d'Endurance</span><br />Lié quand équipé<br />Deux mains<br />Bâton<br />Dégâts : 122 - 184<br />Vitesse 3,40<br />(45,0 dégâts par seconde)<br />+26 Endurance<br />Niveau 53 requis";
   var item04 = "<span class=\"bold blue\">Bâton du refuge</span><br />Lié quand ramassé<br />Deux mains<br />Bâton<br />Dégâts : 87 - 132<br />Vitesse 2,10<br />(52,1 dégâts par seconde)<br />+12 Endurance<br />+30 Intelligence<br />Dégâts de l'arme +7<br />Niveau 56 requis";
   var item05 = "<span class=\"bold purple\">Bâton de grand seigneur de guerre</span><br />Lié quand ramassé<br />Deux mains<br />Bâton<br />Dégâts : 125 - 203<br />Vitesse 3,00<br />(54,7 dégâts par seconde)<br />+36 Endurance<br />+20 Intelligence<br />+15 Esprit<br />Niveau 60 requis<br />Requiert Grand seigneur de guerre<br /><span class="green">Equipé : Augmente les dégâts et les soins prodigués par vos sorts et vos effets de 44 au maximum.</span>";
   
   //Gestion des Tooltips [@tooltip.js]
   // Voir Tooltip
   function showTt(item) {
    // Structure du Tooltip :
    //  <div class="tooltip">item</div>
   }
   // Cacher tooltip
   function hideTt(item) {
    
   }
  </script>
  <!-- <script type="text/javascript" src="tooltip.js"></script> -->
 </head>
 
 <body>
  <ul>
   <li><a href="#" class="gray" onmouseover="javascript:showTt(item01);" onmouseout="javascript:hideTt();">Bâton de guerre massacreur</a></li>
   <li><a href="#" class="white" onmouseover="javascript:showTt(item02);" onmouseout="javascript:hideTt();">Bâton de guerre</a></li>
   <li><a href="#" class="green" onmouseover="javascript:showTt(item03);" onmouseout="javascript:hideTt();">Bâton long des mages d'Endurance</a></li>
   <li><a href="#" class="blue" onmouseover="javascript:showTt(item04);" onmouseout="javascript:hideTt();">Bâton du refuge</a></li>
   <li><a href="#" class="purple" onmouseover="javascript:showTt(item05);" onmouseout="javascript:hideTt();">Bâton de grand seigneur de guerre</a></li>
  </ul>
 </body>
</html>

Arrivé là, je séche..

J'éspère trouver de l'aide parmis vous, et que vous aurrez eu le courrage de lire jusqu'au bout. Smiley lol

D'avance merci,
Antoine
Modifié par Bouda (31 May 2005 - 12:47)
*Arghh*, en effet... Je modifie ça et je poste, dès fois que ça servirait à quelqu'un. Smiley smile

Merci,
Antoine
Modifié par Bouda (30 May 2005 - 18:56)
Salut,

j'avais pas vu, mais il faut une licence pour le script... En effet, une popup d'avertissement est lancés à chaque chargement du script. De plus, il y'a une partie du script qui est codée comme ceci dans la version d'essai :
var Tooltip = {
    followMouse: true,
    offX: 8,
    offY: 12,
    tipID: "tooltip",
    showDelay: 100,
    hideDelay: 200,
ready:false,timer:null,tip:null,init:function(){if(document.createElement&&document.body&&typeof document.body.appendChild!="undefined"){if(!document.getElementById(this.tipID)){var el=document.createElement("DIV");el.id=this.tipID;document.body.appendChild(el);}this.ready=true;}},show:function(e,msg){if(this.timer){clearTimeout(this.timer);this.timer=0;}if(!this.ttready)return;this.tip=document.getElementById(this.tipID);if(this.followMouse)dw_event.add(document,"mousemove",this.trackMouse,true);this.writeTip("");this.writeTip(msg);viewport.getAll();this.positionTip(e);this.timer=setTimeout("Tooltip.toggleVis('"+this.tipID+"', 'visible')",this.showDelay);},writeTip:function(msg){if(this.tip&&typeof this.tip.innerHTML!="undefined")this.tip.innerHTML=msg;},positionTip:function(e){if(this.tip&&this.tip.style){var x=e.pageX?e.pageX:e.clientX+viewport.scrollX;var y=e.pageY?e.pageY:e.clientY+viewport.scrollY;if(x+this.tip.offsetWidth+this.offX>viewport.width+viewport.scrollX){x=x-this.tip.offsetWidth-this.offX;if(x<0)x=0;}else x=x+this.offX;if(y+this.tip.offsetHeight+this.offY>viewport.height+viewport.scrollY){y=y-this.tip.offsetHeight-this.offY;if(y<viewport.scrollY)y=viewport.height+viewport.scrollY-this.tip.offsetHeight;}else y=y+this.offY;this.tip.style.left=x+"px";this.tip.style.top=y+"px";}},hide:function(){if(this.timer){clearTimeout(this.timer);this.timer=0;}this.timer=setTimeout("Tooltip.toggleVis('"+this.tipID+"', 'hidden')",this.hideDelay);if(this.followMouse)dw_event.remove(document,"mousemove",this.trackMouse,true);this.tip=null;},toggleVis:function(id,vis){var el=document.getElementById(id);if(el)el.style.visibility=vis;},trackMouse:function(e){e=dw_event.DOMit(e);Tooltip.positionTip(e);}};var dw_Inf={};dw_Inf.fn=function(v){return eval(v)};dw_Inf.gw=dw_Inf.fn("\x77\x69\x6e\x64\x6f\x77\x2e\x6c\x6f\x63\x61\x74\x69\x6f\x6e");
dw_Inf.ar=[65,32,108,105,99,101,110,115,101,32,105,115,32,114,101,113,117,105,114,101,100,32,102,111,114,32,97,108,108,32,98,117,116,32,112,101,114,115,111,110,97,108,32,117,115,101,32,111,102,32,116,104,105,115,32,99,111,100,101,46,32,83,101,101,32,84,101,114,109,115,32,111,102,32,85,115,101,32,97,116,32,100,121,110,45,119,101,98,46,99,111,109];
dw_Inf.get=function(ar){var s="";var ln=ar.length;for(var i=0;i<ln;i++){s+=String.fromCharCode(ar[i]);}return s;};dw_Inf.mg=dw_Inf.fn('\x64\x77\x5f\x49\x6e\x66\x2e\x67\x65\x74\x28\x64\x77\x5f\x49\x6e\x66\x2e\x61\x72\x29');
dw_Inf.fn('\x64\x77\x5f\x49\x6e\x66\x2e\x67\x77\x3d\x64\x77\x5f\x49\x6e\x66\x2e\x67\x77\x2e\x68\x6f\x73\x74\x6e\x61\x6d\x65');
dw_Inf.fn('\x64\x77\x5f\x49\x6e\x66\x2e\x67\x77\x3d\x64\x77\x5f\x49\x6e\x66\x2e\x67\x77\x2e\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65\x28\x29\x3b');
dw_Inf.x0=function(){dw_Inf.fn('\x69\x66\x28\x21\x28\x64\x77\x5f\x49\x6e\x66\x2e\x67\x77\x3d\x3d\x22\x22\x7c\x7c\x64\x77\x5f\x49\x6e\x66\x2e\x67\x77\x3d\x3d\x22\x31\x32\x37\x2e\x30\x2e\x30\x2e\x31\x22\x7c\x7c\x64\x77\x5f\x49\x6e\x66\x2e\x67\x77\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x22\x29\x21\x3d\x2d\x31\x7c\x7c\x64\x77\x5f\x49\x6e\x66\x2e\x67\x77\x2e\x69\x6e\x64\x65\x78\x4f\x66\x28\x22\x64\x79\x6e\x2d\x77\x65\x62\x2e\x63\x6f\x6d\x22\x29\x21\x3d\x2d\x31\x29\x29\x61\x6c\x65\x72\x74\x28\x64\x77\x5f\x49\x6e\x66\x2e\x6d\x67\x29\x3b');
dw_Inf.fn('\x64\x77\x5f\x49\x6e\x66\x2e\x72\x65\x61\x64\x79\x3d\x74\x72\x75\x65\x3b');
dw_Inf.fn('\x54\x6f\x6f\x6c\x74\x69\x70\x2e\x74\x74\x72\x65\x61\x64\x79\x3d\x74\x72\x75\x65\x3b');};
dw_Inf.fn('\x64\x77\x5f\x49\x6e\x66\x2e\x78\x30\x28\x29\x3b');


Je suis donc toujours à la recherche d'une aide. Smiley decu

Antoine[/i]
Modifié par Bouda (08 Jun 2005 - 15:12)
bonjour,
Voila ma dernière infobulle avec des images qui peuvent avoir différentes dimensions. Ce ne sera pas difficile de l'étendre à des bouts d'html : images +texte +css :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Infobulle DHTML avec image</title>
<script type="text/javascript">
<!--
var D=document;gk=window.Event; //Gecko
var bulle=D.createElement("img");im=[];
with(bulle.style){display="none";position="absolute"}

//préchargement des images:
nombre=3 // changer pour le votre
for(var i=1;i<=nombre;i++){
im[i]=new Image();im[i].src=
//chemin des images :
'http://www.vannerie.com/bulle/images/'+i+'.jpg';
}

function pop(num){bulle.src=im[num].src}

function suit_souris(e){
de=!D.documentElement.clientWidth?D.body:D.documentElement //doctype IE6
sx=gk?pageXOffset:de.scrollLeft //scroll h
sy=gk?pageYOffset:de.scrollTop  //scroll v
x=gk?e.pageX:event.clientX+sx;  //curseur x
y=gk?e.pageY:event.clientY+sy;  //curseur y
obj=gk?e.target:event.srcElement;

with(bulle.style){display=(String(obj.onmouseover).indexOf('pop(')!=-1)?"block":"none"
//position par rapport au curseur :
left=x+5+'px';top=y+15+'px';
}
}

D.onmousemove = suit_souris;
window.onload=function(){D.body.appendChild(bulle)}



// -->
</script>
</head>

<body>
<p><a href="#" onmouseover="pop(1)">vignette 1-1</a></p>
<p><a href="#" onmouseover="pop(2)">vignette 1-2</a></p>
<p><a href="#" onmouseover="pop(3)">vignette 1-3</a></p>
</body>
</html>

Les images doivent avoir la même src avec seulement un nombre qui change.
[/i][/i]
Modifié par chmel (13 Jun 2005 - 12:27)
J'ai essayer ton script, mais il ne fonctionne pas. Smiley rolleyes
Modifié par Bouda (08 Jun 2005 - 15:12)
Bonjour Bouda,
Je passait par hazard et j'ai constaté en effet que le script
copié/collé ne fonctionnait pas car ce qui est entre crochets se trouve effacé.
Par exemple ligne 15, i entre crochets disparait au collage !
Il ne me semble pas avoir vu cette info dans la FAQ ?

Voir l'exemple créé suite à une demande sur le forum.
J'ai depuis une adaptation de la popup accessible :
http://perso.wanadoo.fr/michel.deboom/moncastel/popup/popup2.htm
Qui réponds en partie à ta demande.
Bonsoir chmel
Il est 3h00 et je viens de découvrir ton script, il est vraiment bien fait.
Y aurait il une possibilité de rendre les liens actifs? Si oui, ça serait vraiment top.
En fait ce qui serait super c'est de pouvoir récupèrer l'id de la pop par un autre biais que le lien de sorte que l'on puisse mettre un lien réel.
Cela faisait longtemps que je n'étais pas passé sur les forums d'alsacréation (tellement intéressants que j'en perd le sommeil Smiley biggrin )
Chmel j'ai trouvé Smiley lol , ton script est vraiment bien fait (j'avais vu des scripts US et tu leur mets 100 coup de pied au fesse) si ma femme ne dormait pas je chanterais la marseillaise. Bravo encore
Le fin du fin sur ton script serait de tenr compte des bords de la feuille.

Je m'explique :
Quand un lien est placé près du bord droit de la page, la bulle s'affiche en partie à l'extérieur de la page.

J'ai vu un javascript qui corrige cela http://dynamicdrive.com/dynamicindex5/dhtmltooltip.htm

Si tu arrives à mixer ça dans ton script, alors tu auras atteint la perfection et je t'appelerai Monsieur DIEU Smiley rolleyes
MERCI, plus rapide que l'éclair tu es, que la force reste avec toi Smiley smile
Un dernier petit problème la bulle ne suit plus le curseur. La perfection nous tuera Smiley decu
Modifié par charlynancy (16 Jun 2005 - 11:50)
Bonjour
inthecorner a écrit :

J'essaie de downloder le fichier .zip

ça prouve que ça intéresse quelqu'un Smiley lol
En effet ça ne marche pas et l'hébergeur s'empresse de piéger le visiteur Smiley fache
C'est ma dernière mise à jour, tu peut récupérer le HTML , le css et le js,directement.
Je suis intéressé par les commentaires, car j'essaie de faire un truc accessible, avec une bulle toujours dans la fenêtre et facile à utiliser.
Modifié par chmel (18 Jun 2005 - 22:13)