11489 sujets

JavaScript, DOM et API Web HTML5

Bonjour à toutes et tous,

Comme précisé dans le titre je n'y connais rien en JS. Merci pour votre indulgence.

Je rencontre 3 problèmes. Pour ne pas multiplier les discussions je vous les expose en bloc car il est possible que les deux premiers problèmes soient liés. A vous de déterminer si je dois créer un poste différent pour chacun d'eux. Merci.

Après de multiples prises de tête j'ai fini par décodé le JS (avec Jquery) d'un menu déroulant trouvé sur le net et je l'ai transformé à mon gout. J'y ai même ajouté quelques effets supplémentaires.

1 -
Tout fonctionne à merveille sous FF 3.6 - Opéra 10.61 - Google Chrome 0.0 - Safari 5.31 mais pas sous IE 7.0.6. alors que les Scripts ASP sont activés dans les options.
Le menu reste désespérément fermé.
De plus, dans IE7 toujours, si je clique sur un onglet du menu (qui est censé se dérouler avec un "mouseenter"), IE7 m'ouvre le dossier du site sur lequel je travaille (C:\Documents and Settings\...).
Il est possible que mon code JS comporte des erreurs. La réponse sera peut-être dans la solution du problème n°2

2 -
D'après ce que j'ai pu lire et comprendre il est préférable (et même recommandé) de placer le code JS juste avant la balise head fermante.
Malheureusement, à cet endroit, mon code ne fonctionne sur aucun navigateur.
Placé dans le Html, juste avant le premier onglet, seul celui-ci fonctionne. Avant le second, les deux premiers fonctionnent ... et ainsi de suite.
Donc, je dois placer mon JS dans le code Html après mon menu de navigation pour qu'il fonctionne entièrement.
Il semblerait qu'il me manque une sorte de balise "appelante" pour pouvoir loger mon JS dans le "head". J'ai essayé pas mal de combinaisons sans succès.

3 -
J'ai fais pointer les liens du menu vers la page en ligne :"Site en construction".
Quand je reviens en arrière dans le navigateur, le déroulant reste affiché dans sa dernière position. A savoir : menu déroulé et focus sur le lien (encadré en pointillés). Il faut faire un mouseenter et leave sur l'onglet principal du menu qui est déroulé pour qu'il se referme.
Je n'arrive pas à trouver la solution.

Voilà. J'espère avoir été assez explicite que pour vous éclairer sur mes petits soucis de débutant en JS.

Voici le HTML:


<body>
<div id="conteneur">
<div id="div_menu">
		<div id="ongl_pro"><a href="">Professionnels</a>
                   <ul id="menu_pro">
                       <li><a href="http://www.maquillarts.com">Téâtre-Opéra</a></li>
                       <li><a href="http://www.maquillarts.com">Ciné-TV-Pub</a></li>
                       <li><a href="http://www.maquillarts.com">Photo</a></li>
                       <li><a href="http://www.maquillarts.com">Défilés</a></li>
                   </ul>
                </div>
</div>
</div>
</body>


Voici le JS


<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">

$("#ongl_pro").mouseenter(function(){
	$("ul#menu_pro").fadeIn({ opacity: 1, fontSize: "0.9em", }, 50 );
$('ul#menu_pro li a').mouseenter(function () {
	$(this).animate({ fontSize: "1.3em"}, 150 );
	});
$('ul#menu_pro li a').mouseleave(function () {
	$(this).animate({ fontSize: "0.9em"}, 100 );
	});
$("#ongl_pro").mouseleave(function(){
	$("ul#menu_pro").fadeOut({ opacity: 0, fontSize: "0.9em", }, 50 );
	});
});


Et voici le CSS


/*-----Menu-navigation-----*/

#div_menu{
	margin: auto;
	margin-bottom: 70px; 
	padding: 0;
	display: table;
	width: 1215px;
	height: 38px;
	}
	
#ongl_pro, #ongl_particulier, #ongl_bio, #ongl_delires, #ongl_liens, #ongl_contact{
	float: left;
	width: 200px;
	line-height: 35px;
	text-align: center;
	color: #FFF;
	background-image: url(button2_200x35.png);
	background-repeat: no-repeat;
	}
	
#ongl_pro a, #ongl_particulier a, #ongl_bio a, #ongl_delires a, #ongl_liens a, #ongl_contact a{
	text-decoration: none;
	color: #ccc;
	display: block;	
	}
	
#ongl_pro li a, #ongl_particulier li a, #ongl_bio li a, #ongl_delires li a, #ongl_liens li a, #ongl_contact li a{
	color: #ccc;
	}
	
#ongl_pro:hover, #ongl_particulier:hover, #ongl_bio:hover, #ongl_delires:hover, #ongl_liens:hover, #ongl_contact:hover{
	background-image: url(button3_200x35.png);
	background-repeat: no-repeat;
	}

#menu_pro, #menu_particulier, #menu_bio, #menu_delires, #menu_liens, #menu_contact{
	display: none;
	margin: 0;
	padding: 0;
	width: 199px;
	list-style: none;
	line-height: 25px;
	text-align: left;
	text-indent: 15px;
	position: absolute;
	z-index: 2;
	background-color: #010101;
	border-bottom: 1px solid #F94A00;
	}
		
	
#menu_pro li:hover a, #menu_particulier li:hover a, #menu_bio li:hover a, #menu_delires li:hover a, #menu_liens li:hover a, #menu_contact li:hover a{
	background-color: #333333;
	color: #fff;
	text-indent: 30px;
	}	
	
/*-----Fin-menu-navigation-----*/


Désolé pour la longueur. Merci d'avance à mes sauveurs.
A+/>DonVtt
Modifié par donvtt (19 Aug 2010 - 20:34)
Il est préférable, d'un point de vue perf, de placer ton js juste avant la fermeture de body.

Une pratique standard est de placer un "$(document).ready" en début de code, afin que le script ne soit exécuté qu'après l'instanciation complète du DOM.

Sous ie, tu as des outils de développement qui peuvent t'indiquer les erreurs rencontrées par le navigateur (équivalent de firebug)

Pour le point 3, j'ajoute généralement une classe dans le li correspondant à la page visitée.
Le code js détecte cette classe et déplie le menu correspondant.
Bonjour et merci Paolo pour ta réponse rapide,

a écrit :
Il est préférable ...,de placer ton js juste avant la fermeture de body.


1 -
Il existe donc plusieurs écoles. Un peu comme pour les div au lieu des table ... . Mais bon si tu me dis que c'est le bon endroit ce n'est pas moi qui vais te contredire vu mes connaissances en JS. Mon soucis est le respect des standards pour offrir des sites accessibles à tous.
Si c'est le cas alors c'est un problème de moins.

2 -
La ligne "$(document).ready" existait dans le code. Ne sachant pas à quoi elle servait et que sans elle tout fonctionnait, je l'ai virée pensant qu'elle était inutile. J'aurais dû me renseigner (fainéant que je suis !).
Elle a maintenant retrouvé sa place.

3 -
a écrit :
Sous ie, tu as des outils de développement...

Heu ... et où ? Un plug-in à télécharger ?

J'ai téléchargé FireBug ce matin mais il faudrait que je passe du temps (impossible maintenant) pour apprendre son fonctionnement. Mais à première vue il n'y aurait pas d'erreur JS si j'ai bien compris FireBug.

4 -
a écrit :
Pour le point 3, j'ajoute généralement une classe...

Problème résolu pour le point 3.

Je ne sais pas si on s'est compris sur ce point. Ce que je voulais c'est que le menu soit fermé quand je reviens sur la page.
Mais ... je viens de mettre l'ébauche du site en ligne pour le tester et en ligne ce problème n'existe plus. Eurêka !

Il me reste encore le problème de IE7 à régler. 2/3 de résolu en quelques minutes. Merci Paolo.

Voici le lien du site. Ce n'est qu'une ébauche, ne soyez pas trop regardants svp.
Seuls les menus "Professionnel" et "Particuliers" sont plus ou moins terminés. Ne faites pas attention aux autres menus.

http://www.maquillarts.com/
Tu as mis un DocType ? parce que ie est allergique à un manque de Doctype avec jQuery Smiley smile
Bon, après vérif, tu as bien mis le DocType.

Sinon, tes fadeIn et fadeOut me surprennent. Il me semblait qu'en premier argument, il fallait une durée ? "slow", "fast", "normal"...
Modifié par Borak (15 Aug 2010 - 18:31)
A Borak
a écrit :
tes fadeIn et fadeOut me surprennent

Moi, tout me surprend en JS !
Comme dit dans le titre, je suis archi débutant en JS.
Dans mes recherches je me suis limité à comprendre le code lié au menu que j'ai trouvé car à chaque nouvelle info trouvée venait se greffer des nouveaux éléments JS qui m'éloignait du sujet. J'ai dû me limiter pour ne pas me perdre.
Je ne sais donc pas trop bien quoi faire de ta réponse concernant l'argument à placer avant.
Plus loin dans le code j'ai utilisé un fadeIn/Out avec fast et slow pour assombrir la page au survol du menu.

$("#div_menu").mouseenter(function(){
	$("#texte_contenu, #flash_contenu").fadeTo("fast", 0.2, function(){
	});
});
$("#div_menu").mouseleave(function(){
	$("#texte_contenu, #flash_contenu").fadeTo("slow", 1, function(){
	});
});

Penses-tu que se soit incorrecte ?

A Heyoan
Comme pour mon premier site (celui-ci est le second), une fois terminé, il sera ok pour le w3c et s'affichera correctement dans les cinq navigateurs pré-cités.
D'ailleurs les erreurs mentionnées par le w3c sont liées à la balise embed (générée automatiquement-dreamweaver) qui doit disparaitre. Comme pour mon premier site.
Il me reste donc deux erreurs et un avertissement à corriger pour le w3c.
Concernant la virgule effectivement c'est pas joli. Désolé. C'est une relique du code d'origine. Il y avait un paddingLeft après.
Je sais que le code n'est pas très propre, mais c'est toujours comme ça quand je suis en plein dedans. Je dois encore passer l'aspirateur dans les coins pour éliminer les nounous.

Je ne sais pas si le fait d'enlever la virgule changera quelque chose pour IE7. J'essaye dès que je suis rentré chez moi.

A+ et merci de vous décarcasser pour moi.
DonVtt
donvtt a écrit :
une fois terminé, il sera ok pour le w3c
Sauf que ce n'est pas à la fin qu'il faut valider... et ce n'est pas pour faire plaisir à "monsieur w3c". Smiley cligne

La non validation a (ou peut avoir) un impact sur le rendu : cf. Valider ? Pour quoi faire concrètement ?

donvtt a écrit :
Je ne sais pas si le fait d'enlever la virgule changera quelque chose pour IE7.
Je pense que oui.
Re Heyoan,

Monsieur w3c ! Haha elle est bonne celle-là.
Non certes. Je suis un fervent partisan d'un web propre et accessible à tous. Ce n'est pas pour M. w3c que je valide, t'inquiètes.
En général je valide après chaque gros avancement. J'avais déjà validé et remarqué les erreurs mais j'attendais de résoudre le problème de IE7 pour le refaire.

Concernant les reliques de virgules ...
And the winner is ... Mister Heyoan !
Impeccable. IE7 a fini par accepter mon code grâce à toi. La solution était sous mon nez. Un grand merci pour ton aide.
Cependant,...(hé oui, sacré IE7) le déroulant s'affiche avec une marge gauche d'environ 100px. Il ne s'aligne donc pas sous l'onglet mais 100px plus à droite.
Une idée du pourquoi ?

Encore une fois merci.
A+ et bonne nuit.
DonVtt
donvtt a écrit :
Cependant,...(hé oui, sacré IE7) le déroulant s'affiche avec une marge gauche d'environ 100px.
C'est un peu dur à dire vu que le code en ligne n'est pas corrigé mais je dirais que c'est parce les versions d'IE < 8 aiment bien que l'on précise la valeur de left ou de right d'un élément positionné en absolu.

A tester :
#ongl_pro, #ongl_particulier, #ongl_bio, #ongl_delires, #ongl_liens, #ongl_contact {
	...
	position: relative;
}
	
#menu_pro, #menu_particulier, #menu_bio, #menu_delires, #menu_liens, #menu_contact {
	...
	left: 0;
}
Salut Heyoan,

And the winner is again ...Heyoan !

Wahou ! Heyoan tu es un génie. Smiley clapclap
J'en reste bouche bée.

J'étais loin de cette piste que tu m'as donné. J'étais partis vers du chipotage dans "margin" ou "clear both", mais sans succès.

Voilà une affaire rondement menée et une grosse épine hors du pied. Je vais attaquer maintenant la balise <embed> et lui tordre le cou afin de valider cette nouvelle avancée.

Un grand merci pour ton aide claire et efficace. Merci aussi pour ton indulgence face à mon ignorance.

A bientôt pour de nouvelles questions.
DonVtt.
donvtt a écrit :
Wahou ! Heyoan tu es un génie.
C'est pas faux... Smiley ghni

Si tu considères que ce sujet est [Résolu] merci de l'indiquer en éditant ton premier post et en modifiant le titre. Smiley cligne
Salut Heyoan le modeste !

J'attendais un éventuel dernier commentaire pour clore l'affaire. Voilà qui est fait.

A bientôt tous pour de nouvelles aventures.

DonVtt, ... l'autodidacte têtu.