11521 sujets

JavaScript, DOM et API Web HTML5

Bonsoir à tous !


Je mets les pieds ici avec stupeur et tremblements, pour deux raisons :

- J'ai conscience que la page que je vais vous soumettre est écrite avec les pieds (avec du déchet pas encore nettoyé partout), et une bien mauvaise idée en soi (tout le site internet sur une même page, avec div affichées / cachées).

- Je ne comprends absolument rien au Javascript (hum). Ce qui est un peu con pour poser une question sur un forum javascript... Habituellement j'en aurais appris les rudiments, mais ce site a du être fait dans l'urgence, et doit être mis en ligne demain soir.

Mais je me dis qu'un œil averti verra peut-être l'origine du problème tout de suite, et je vous soumets donc la chose...



Le site fonctionne en cachant toutes les autres div que celle qu'on demande d'afficher. Mon souci (pas dramatique) est le suivant : l'infobulle que je crée avec javascript empêche ma page de se repositionner correctement quand je change de div affichée.

UN EXEMPLE DE MON PROBLÈME (voici la page) : http://ledebut.free.fr/FIDE/SITE6/index2

> Si vous allez sur "LES FILMS > Par Film > Blood on the window", et que vous scrollez en bas de la page, puis que vous cliquez sur "AGENDA" en haut à gauche : la page remonte toute seule pour se caler sur la hauteur de la div "agenda", et vous n'avez pas d'espace inutile en dessous du tableau horaire.

> Mais si vous faites F5 (nécessaire pour remettre le pb à zéro), que faites le même chemin ("LES FILMS > Par Film > Blood on the window") et qu'en bas vous cliquez sur "Mercredi 8 à 21h30", la page ne remonte pas. On se retrouve avec un grand vide qui restera bloqué tel quel tant qu'on aura pas réactualisé toute la page.

La différence entre les deux, c'est que sur "Mercredi 8 à 21h30", il y a une infobulle javascript. C'est l'origine du problème, car si je la supprime, tout remarche normalement.



Cette infobulle vient d'un code javascript que j'avais piqué tel quel il y a quelques années sur un tutoriel. Ma question est donc : y voyez-vous une couille évidente qui pourrait expliquer mon problème ?


<script language="javascript" type="text/javascript">
		  <!--
			function GetId(id)
			{
			return document.getElementById(id);
			}
			var i=false; // La variable i nous dit si la bulle est visible ou non
			
			function move(e) {
			  if(i) {  // Si la bulle est visible, on calcul en temps reel sa position ideale
			    if (navigator.appName!="Microsoft Internet Explorer") { // Si on est pas sous IE
			    GetId("curseur").style.left=e.pageX - 110+"px";
			    GetId("curseur").style.top=e.pageY - 84+"px";
			    }
			    else { // Modif proposé par TeDeum, merci à lui
			    if(document.documentElement.clientWidth>0) {
			        GetId("curseur").style.left=20+event.x+document.documentElement.scrollLeft+"px";
			        GetId("curseur").style.top=10+event.y+document.documentElement.scrollTop+"px";
			    }
			    else {
			        GetId("curseur").style.left=20+event.x+document.body.scrollLeft+"px";
			        GetId("curseur").style.top=10+event.y+document.body.scrollTop+"px";
			    }
			    }
			  }
			}
			
			function montre(text) {
			  if(i==false) {
			  GetId("curseur").style.visibility="visible"; // Si il est cacher (la verif n'est qu'une securité) on le rend visible.
			  GetId("curseur").innerHTML = text; // Cette fonction est a améliorer, il parait qu'elle n'est pas valide (mais elle marche)
			  i=true;
			  }
			}
			function cache() {
			if(i==true) {
			GetId("curseur").style.visibility="hidden"; // Si la bulle etais visible on la cache
			i=false;
			}
			}
			document.onmousemove=move; // des que la souris bouge, on appelle la fonction move pour mettre a jour la position de la bulle.
		//-->
	</script>	


Ce à quoi il faut rajouter un élément à mettre n'importe où sur la page :

<div id="curseur" class="infobulle"> </div>


Et pour l'appeler :

<a class="bulle" class="question"  href="javascript:slidereponse2('Agenda')" onmouseover="montre('Texte de linfobulle');" onmouseout="cache();" onclick="javascript:slidereponse(Vide_sousmenu);">Mercredi 8 à 21h30</a>

("slidereponse2" change la div de la partie centrale de la page, "slidereponse" change le contenu de la colonne orange pour mettre un div vide à la place)



Y a aussi du CSS pour la div (mais a priori on s'en fout ?)


.infobulle{
			position: absolute;
			text-align: left;	
			visibility : hidden;
			border: 1px solid #364755;
			color:black;
			padding-left: 10px;
			padding-right: 10px;
			padding-top: 6px;
			padding-bottom: 6px;
			font-family: Arial;
			font-size: 11px;
			background-color: #BFCCD7;
			 }




Voilà, est-ce qu'il y a quelque chose d'évident comme le nez au milieu de la figure qui merde dans le code javascript ? (à part que mon site est écrit avec les pieds, donc)

Si ça implique de tout revoir de fond en comble et que c'est trop laborieux de chercher la solution, n'hésitez pas à me le dire, j'ai bien conscience d'arriver avec un truc assez foireux...
Modifié par TB54 (16 Mar 2015 - 13:50)
Bonjour,

de prime abord je dirais de placer tous les Vide_texte et tous les Vide_sousmenu (qui sont des IDs en fait) entre guillemets
Bonjour !

Merci beaucoup d'avoir pris le temps d'y jeter un œil. C'est corrigé (c'est toujours ça de pris pour un code moins dégueu ! Le site mis à jour : http://ledebut.free.fr/FIDE/SITE6/index4.html ), mais le problème de repositionnement ne venait apparemment pas de là.

J'ai essayé de supprimer à la barbare plusieurs segments du javascript pour trouver plus précisément l'endroit du problème. Le problème de repositionnement disparaît quand je supprime cette partie-la :

function cache() {
			if(i==true) {
			GetId("curseur").style.visibility="hidden"; // Si la bulle etais visible on la cache
			i=false;
			}
			}

J'ai une bulle qui reste du coup collée à ma souris ad vitam eternam, mais le repositionnement fonctionne à nouveau. C'est donc peut-être dans ce petite passage que ça merde ?
Modifié par TB54 (16 Mar 2015 - 16:33)
Je connais ce script d'infobulle (il date!).
Quelques réflexions :
a) ne pas enlever la fonction cache() dans le script, car, comme tu le disais, le onmouseout="cache();" ne fonctionnera évidemment plus.
b) il manque un doctype dans la page que tu renseignes.
c) je ne comprends pas pourquoi tu as mis des valeurs à soustraire dans le js de l'infobulle : ici ...
			    GetId("curseur").style.left=e.pageX - 110+"px";
			    GetId("curseur").style.top=e.pageY - 84+"px";
Le problème est peut-être là ...
d) je n'aurais pas placé le < div id="curseur" class="infobulle"> </div> à l'intérieur du < div id="global">.
e) Cette ligne apparaît plusieurs fois dans la page: une fois suffit (mais au bon endroit)
<script type="text/javascript" src="http://code.jquery.com/jquery-2.1.3.min.js"></script>


EDIT: Mais comme tu appelles déjà jQuery, pourquoi ne pas créer les tooltips (infobulles) avec cette librairie??
Modifié par lddsoft (16 Mar 2015 - 17:47)
lddsoft a écrit :
b) il manque un doctype dans la page que tu renseignes.

On retouche à mon amateurisme en programmation : je n'y avais jamais fait gaffe. Je viens d'aller faire le tour un peu partout pour trouver le bon doctype, mais tout ceux que j'essaie me foutent la page en l'air. Pas bon signe, je suppose. Une page sans doctype risque de créer des problèmes sur certains navigateurs ?

lddsoft a écrit :
c) je ne comprends pas pourquoi tu as mis des valeurs à soustraire dans le js de l'infobulle : ici ...
			    GetId("curseur").style.left=e.pageX - 110+"px";
			    GetId("curseur").style.top=e.pageY - 84+"px";
Le problème est peut-être là ...

Je met en négatif pour mettre l'info bulle au dessus et à gauche du lien survolé (en positif, ça va en bas et à droite). Je viens d'essayer avec des "+" (infobulle en bas à droite), mais le problème de repositionnement persiste.

lddsoft a écrit :
d) je n'aurais pas placé le &lt; div id="curseur" class="infobulle"&gt; &lt;/div&gt; à l'intérieur du &lt; div id="global"&gt;.

Ok, je l'ai déplacé en première ligne du body (j'ai aussi essayé dans le head, avant ça, même résultat).

lddsoft a écrit :
e) Cette ligne apparaît plusieurs fois dans la page: une fois suffit (mais au bon endroit)
&lt;script type="text/javascript" src="http://code.jquery.com/jquery-2.1.3.min.js"&gt;&lt;/script&gt;

Ah oui effectivement ! Je n'a gardé que le premier, tout en haut de la page.

lddsoft a écrit :
EDIT: Mais comme tu appelles déjà jQuery, pourquoi ne pas créer les tooltips (infobulles) avec cette librairie??

Je vais être honnête, là je lis du chinois... Jusqu'ici, contrairement à l'html/css que j'ai un peu appris, j'ai utilisé le javascript en copiant tels quels des tutoriels quand j'en avais besoin (c'est à dire extrêmement rarement) et m'en sortais comme ça, mais je n'y entend rien (d'où la question, très naïve, "y a-t-il une énormité là-dedans ?"). Je vais faire une recherche jQuery/tooltips pour voir ce dont tu parles.

Merci en tout cas pour tout ce temps accordé !
Modifié par TB54 (16 Mar 2015 - 18:06)
Pas de quoi Smiley smile !

Sincèrement, je ne vois pas encore où se situe ton problème Smiley decu . Il faut dire (à ma décharge Smiley confused ) que ton code n'est pas très limpide Smiley langue .

Un point où je suis catégorique : il faut un doctype à ta page !!!
D'accord, mais comment faire pour savoir lequel ?
Tous ceux que je teste la foutent en l'air... (première colonne qui part dans la deuxième, etc)
Etant donné ton code, j'essaierais avec un doctype "HTML4.01 transitional".
TB54 a écrit :
Tous ceux que je teste la foutent en l'air... (première colonne qui part dans la deuxième, etc)
Justement, il faudrait soumettre ta page à un validateur tel que celui du W3C pour voir les erreurs et les avertissements qu'il indique. (Celui du W3C renseigne ceci : "280 Errors, 4 warning(s)" et précise lesquelles )

Une erreur fréquente dans ton code : < a class="c2" class="question" href="javascript:slidereponse2('Presentatio…
Il faut faire comme ceci < a class="c2 question" ...
J'ai constaté dans ton code-source que la page avait été générée par "WebExpert 6" (que je n'ai jamais utilisé). Je sais toutefois, par expérience, qu'il faut veiller à bien paramétrer la page que l'on veut créer avec un logiciel d'édition : doctype, jeu de caractères etc.
Modifié par lddsoft (17 Mar 2015 - 10:12)
lddsoft a écrit :
Etant donné ton code, j'essaierais avec un doctype "HTML4.01 transitional".

Ça déconne aussi, mais effectivement, si y a tellement d'erreurs...

Merci pour le site, très pratique en effet. Je vais retourner corriger ma page... une fois mise en ligne (c'est aujourd'hui, donc ça part sans doctype puisque pour l'instant c'est la seule façon pour qu'elle s'affiche correctement - les navigateurs se débrouillent bien, dis-donc...).

Merci encore !
Modifié par TB54 (17 Mar 2015 - 16:38)