[Résolu] Afficher/masquer une zone

HTML5, CSS3, Javascript, support des mobiles... Que penser de votre site ? Vous manquez d'informations pour la construction d'un site qui puisse s'afficher correctement partout ? C'est un problème simple, un peu complexe ? Venez ici !
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

[Résolu] Afficher/masquer une zone

Message par calimo »

Bonjour,

J'ai mis au point un script qui affiche/masque les commentaires sur le site des extensions. Il est basé sur le script de ce forum pour la zone membres, donc tout simple, et très efficace. Un exemple sur une page au hasard : http://extensions.geckozone.org/Adblock/
Le script est là : http://extensions.geckozone.org/scripts ... omments.js

Il marche pas mal du tout pour l'instant. Reste cependant un ou deux points...
  • J'aurais aimé qu'il y ait deux petites flèches vers le bas. Pour cela j'ai mis deux fois SCspan.appendChild(SCimg); en espérant que ça insère deux fois l'image... eh bien déception, ce n'est pas le cas :(
    Seule la deuxième apparait. J'ai essayé de mettre une deuxième variable en me disant qu'on ne pouvait inclure chaque variable qu'une fois... non, pareil :?
    Qu'est-ce que j'ai faux ? :shock:
  • Est-il imaginable que le "montrer les commentaires" se transforme en "masquer les commentaires" lorsque les commentaires sont affichés ? Si oui comment ?
  • Je me disais qu'on pourrait peut-être stocker un cookie pour se souvenir du dernier état d'ouverture/fermeture des commentaires.
    1. Est-ce une bonne idée ?
    2. Est-ce réalisable ? (mes fonctions set cookie ont toujours été passablement foireuses à vrai dire...)
  • Quelqu'un voit-il de grosses erreurs dans mon code de débutant :lol:
  • Visiblement il est incompatible avec la navigation par onglet. Si on a plusieurs onglets ouverts, le script ne fonctionne que dans un... c'est mon Firefox qui est à ce point corrompu ou c'est le script ?
Bon, je vous en demande un peu beaucoup mais je suis sur que vous pouvez le faire :P
Merci d'avance !

Edit : tiens, je viens de découvrir un bug du forum. Ma liste numérotée fait <ol><li>...<li>...</ul> :lol: et le <ol> est fermé plus loin, à la place où il devrait y avoir un <ol>... bug connu de phpBB ?
Dernière modification par calimo le 25 févr. 2005, 20:59, modifié 1 fois.
KissCoolMan
Salamandre
Messages : 37
Inscription : 16 févr. 2005, 18:09

Message par KissCoolMan »

rapidement, avant d'aller dormir, j'approfondirais demain :
- pour phpBB, je sais pas
- pour les deux flèches, en fait, le code est construit un peu bizarrement, à étudier plus longuement
- Montrer / Masquer , ca se fait très simplement, en prenant une variable "IsClicked" que tu crées ... regardes comment je procède pour la deuxieme image ici (serveur local ==> posibilité de lenteur, upload limité) . Donc, en gros, une fois que c'est cliqué, tu passes la valeur à true, et quand on reclique , tu la remets à false, et tu fais un if. Je trouve que c'est une bonne idée (j'aime bien les p'tits gadgets tout con comme ça :d )
- pour les cookies ... j'pense que tu pourrais garder en mémoire si, globalement, la personne veux afficher les commentaires ou pas, mais pas le faire sur CHAQUE page ...
- à part ca, je te conseille de virer la 1.0+ que tu compiles en secret, et de refaire un profil propre ... :p ! Nan, plus sérieusement, fonctionne très bien chez moi avec les onglets !
Kévin Descoubes
kevindescoubes[-at-]gmail[-dot-]com

http://kevin.descoubes.free.fr/kisscoolblog/

Get Firefox : http://getfirefox.com/
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

  1. Pour phpbb j'ai reporté le bug ici mais en fait je suis en train de me dire que j'aurais du le rapporter sur le forum anglais... pas grave, de toutes façons ils n'ont pas non plus d'endroit pour les reporter... bizarre :roll: J'ai pas du le trouver :oops:
  2. Je pense bien qu'il est bizarre, mais je ne vois pas comment faire autrement :oops:
  3. Montrer / masquer : Ok, je vais tester ça c'est une bonne idée :D
  4. Pour le cookie effectivement je pensais à un seul cookie général
  5. Ce matin ça fonctionne. Je pense que c'était l'extension Geckomenu qui a foutu le bordel ici aussi, mais visiblement maintenant c'est mieux. Ouf (parce que c'était vriament bizarre et que je n'ai aucune envie de me refaire un profil :P )
Merci pour tes idées !
Invité

Message par Invité »

1. ok, j'y connais pas grand chose en phpBB en fait lol ...
2. Heuuuu, bha j'vais regarder ça ce soir j'pense, ou demain aprem, erf, j'suis à la salle de jeux en réseau là :$ ...
3. ;)
4. ;) ²
5. Oki !
martin
Varan
Messages : 1074
Inscription : 21 janv. 2004, 16:23

Message par martin »

J'ai regardé un peu ton code.
en fait, le code est construit un peu bizarrement
ben je trouve pas.

Pour les deux flêches, je pense qu'il faut créer 2 images avec 2 name différents, sinon les navigateurs écrasent ceux précedement créés. En tout cas çà marche chez moi si je fais cette modification.
Changer le texte n'est pas trés compliqué, tu aurais trouvé tout seul en continuant à chercher.

Mes (petites) critiques.
Eliminer les onMouseOver et autres en attribut de balises, mais les gérer directement dans le fichier javascript . Même si présentement ils sont créés par le script donc çà revient un peu au même, mais çà te permettra de prendre les bonnes habitudes pour séparer les comportements du html.
Ne pas hésiter à passer par des variables pour stocker les sous objets que l'on manipule, c'est plus optimisé, i.e. répéter "document.getElementByTagName("machin).item(7)..." fait parcourir inutilement plusieurs fois le DOM au navigateur.

J'ai rajouté une fonction (piqué dans l'excellent HTMLoverlays), pour prendre en compte un éventuel script déjà existant placé sur le onLoad de du document.

Je te propose donc çà (c'est sûrement largement encore à améliorer, je ne suis en rien maître es javascript):

Code : Tout sélectionner

function switchComments() {
	var monBox = document.getElementById('box_comment');
	var titreActuel=document.getElementById('commentaires').getElementsByTagName('span')[0].childNodes[1];
	
	if (monBox.className == "commentVisible") {
		monBox.className = "commentHidden";
		titreActuel.nodeValue ='\u00A0montrer les commentaires\u00A0';
	} else {
		monBox.className = "commentVisible";
		titreActuel.nodeValue ='\u00A0cacher les commentaires\u00A0';
	}
}
function switchImage(){
	// monMouseOver : variable globale
	if (monMouseOver) {
		document.down.src="/images/down_on.gif";
		document.down2.src="/images/down_on.gif";
		monMouseOver=false;
	}else{
		document.down.src="/images/down.gif";
		document.down2.src="/images/down.gif";
		monMouseOver=true;
	};
}

//window.onload = function() {
function specialCommentaire() {
	var monBox = document.getElementById('box_comment');
	var titreCommentaire = document.getElementById('commentaires');

	var SCimg = document.createElement('img');
	SCimg.setAttribute('name', 'down');
	SCimg.setAttribute('src', '/images/down.gif');
	SCimg.setAttribute('alt', 'Down');
	var SCimg2 = document.createElement('img');
	SCimg2.setAttribute('name', 'down2');
	SCimg2.setAttribute('src', '/images/down.gif');
	SCimg2.setAttribute('alt', 'Down');
	
	var SCa = document.createElement('a');
	SCa.setAttribute('href', '#commentaires');

	var SCspan = document.createElement('span');
	SCspan.appendChild(SCimg);
	SCspan.appendChild(document.createTextNode('\u00A0montrer les commentaires\u00A0'));
	SCspan.appendChild(SCimg2);
	
	SCa.appendChild(SCspan);
	
	titreCommentaire.appendChild(document.createTextNode('\u00A0'));
	titreCommentaire.appendChild(SCa);
	
	titreCommentaire.getElementsByTagName("a")[0].onclick=switchComments;
	monMouseOver=true;
	titreCommentaire.getElementsByTagName("a")[0].onmouseover=switchImage;
	titreCommentaire.getElementsByTagName("a")[0].onmouseout=switchImage;
	
	switchComments();

}
function HO_addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

HO_addLoadEvent(specialCommentaire);
Si tu comprends pas une partie, tu demandes.

Pour les cookies, pourquoi pas, mais personnellement (en tant qu'utilisateur), çà me convient comme çà, çà ressemble à framasoft.
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Whaw génial merci, j'étais justement en train de plancher (avec un succès mitigé :? )

Tu es sur que monMouseOver est vraiment global ? J'ai l'erreur suivante

Code : Tout sélectionner

Erreur : monMouseOver is not defined
Fichier Source : file:///C:/Documents%20and%20Settings/Xavier/Bureau/Adblock_fichiers/showhidecomments.js
Ligne : 16
visiblement dans la fonction... j'ai ajouté un var devant monMouseOver=true; parce qu'il n'était pas déclaré, je ne pense pas que ce soit la cause du problème...

Par contre il y a un truc que je comprend pas, c'est que le script original semble persister... :shock: J'ai le switcher à double du coup, je pense que le problème est là... Ah non, j'ai rien dit désolé :oops:
martin
Varan
Messages : 1074
Inscription : 21 janv. 2004, 16:23

Message par martin »

j'ai ajouté un var devant monMouseOver=true; parce qu'il n'était pas déclaré
Si tu mets le mot clé var, la variable devient justement locale à la fonction, ce que l'on ne veut pas. Sans le mot clé var , la variable est déclarée lors de sa première utilisation, mais est globale, accessible à tous le document.
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Une démo est disponible ici : http://extensions.geckozone.org/tests/Adblock.htm

Il y a un avertissement Javascript
Avertissement : assignment to undeclared variable monMouseOver
Fichier Source : http://extensions.geckozone.org/tests/A ... omments.js
Ligne : 57
Mais de toutes façons le mouseOver ne semble pas fonctionner... une fois que la souris est passée dessus, ça clignotte, et ça arrête plus.

Si je mets le var, plus d'avertissement dans la console JS mais ça ne fonctionne pas mieux...

On ne peut pas déclarer une variable pour qu'elle soit globale ? C'est bizarre ça :?
martin
Varan
Messages : 1074
Inscription : 21 janv. 2004, 16:23

Message par martin »

Mais de toutes façons le mouseOver ne semble pas fonctionner... une fois que la souris est passée dessus, ça clignotte, et ça arrête plus.
vire l'argument de la fonction switchImage(), et çà (re)fonctionnera.
On ne peut pas déclarer une variable pour qu'elle soit globale ?
Ben si, on affecte une variable sans utiliser var, et elle est globale. Javascript n'a pas "besoin" de déclaration de variable, on affecte un descripteur et c'est une variable. Et si on ajoute var, elle est locale.
Du moins à l'intérieur d'une fonction.
Tu peux déclarer ta variable en dehors d'une fonction avec var, elle sera globale à tout le script.
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

martin a écrit :
Mais de toutes façons le mouseOver ne semble pas fonctionner... une fois que la souris est passée dessus, ça clignotte, et ça arrête plus.
vire l'argument de la fonction switchImage(), et çà (re)fonctionnera.
:oops:
martin a écrit :
On ne peut pas déclarer une variable pour qu'elle soit globale ?
Ben si, on affecte une variable sans utiliser var, et elle est globale. Javascript n'a pas "besoin" de déclaration de variable, on affecte un descripteur et c'est une variable. Et si on ajoute var, elle est locale.
Du moins à l'intérieur d'une fonction.
Tu peux déclarer ta variable en dehors d'une fonction avec var, elle sera globale à tout le script.
Ah ok, c'est donc ce que j'ai fait, comme ça plus d'avertissements, c'est plus propre (avec le nombre qu'il y en a sur tous les sites :roll: )

Mais maintenant... pourquoi les commentaires sont affichés par défaut ??? (mais pas sur ma page test... étrange :oops: )
Je suis vraiment nul en JS :lol: :oops: :? Désolé pour tout :(
martin
Varan
Messages : 1074
Inscription : 21 janv. 2004, 16:23

Message par martin »

:lol:
Mais maintenant... pourquoi les commentaires sont affichés par défaut
(Re)met les parenthèses à la fonction switchComments(); dans specialCommentaire(), et la fonction sera bien appelée une première fois aprés le chargement de la page.
Je sais, on peut s'y perdre, on ne met pas ces parenthèses lorsque l'on associe un évenement d'un objet à une fonction, mais là ce n'est pas le cas.

Pour la déclaration de la variable globale monMouseOver, laisse là où tu l'as ma mise, mais ce n'est pas la cause de l'avertissement javascript (je n'en ai pas chez moi), celà venait des changements que tu avais fait.
Désolé pour tout
Faut pas, tu étais proche de tes souhaits avec ton script, et ce sont des erreurs normales lorsqu'on commence.
KissCoolMan
Salamandre
Messages : 37
Inscription : 16 févr. 2005, 18:09

Message par KissCoolMan »

Par défaut, les commentaires sont affichés, et y'a marqué "Montrer les Commentaires" (problème d'initialisation).

Personnellement, plutôt que de créer une class "CommentHidden"

Code : Tout sélectionner

monBox.className = "commentHidden"; 
j'aurais plutôt fait quelque chose comme ça :

Code : Tout sélectionner

monBox.style.display = 'none';
puisque quelle que soit la stylesheet, on voudra quand même virer les commentaires quand on clique sur cacher ;) !
Kévin Descoubes
kevindescoubes[-at-]gmail[-dot-]com

http://kevin.descoubes.free.fr/kisscoolblog/

Get Firefox : http://getfirefox.com/
KissCoolMan
Salamandre
Messages : 37
Inscription : 16 févr. 2005, 18:09

Message par KissCoolMan »

J'ai oublié, parce que ca me paraissait simple, mais, heuuu, si tu veux que ca affiche le bon texte, t'as juste ça :

Code : Tout sélectionner

   SCspan.appendChild(document.createTextNode('\u00A0montrer les commentaires\u00A0'));
à changer en :

Code : Tout sélectionner

   SCspan.appendChild(document.createTextNode('\u00A0cacher les commentaires\u00A0'));
Kévin Descoubes
kevindescoubes[-at-]gmail[-dot-]com

http://kevin.descoubes.free.fr/kisscoolblog/

Get Firefox : http://getfirefox.com/
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

KissCoolMan a écrit :Par défaut, les commentaires sont affichés, et y'a marqué "Montrer les Commentaires" (problème d'initialisation).
C'est d'ailleurs le sujet du message précédent :wink:
martin a écrit :(Re)met les parenthèses à la fonction switchComments(); dans specialCommentaire(), et la fonction sera bien appelée une première fois aprés le chargement de la page.
Ah ouf, merci grand chef !

martin a écrit :Je sais, on peut s'y perdre, on ne met pas ces parenthèses lorsque l'on associe un évenement d'un objet à une fonction, mais là ce n'est pas le cas.
J'essayerai de m'en souvenir. Je pense que je mélange tout parce que l'an passé j'ai "appris" (un bien grand mot tiens, appris :roll: ) quelques bases de Pascal, et c'est vraiment nettement plus simple sur les histoires de fonctions (même s'il y a d'autres trucs plus compliqués/chiants).
martin a écrit :Pour la déclaration de la variable globale monMouseOver, laisse là où tu l'as ma mise, mais ce n'est pas la cause de l'avertissement javascript (je n'en ai pas chez moi), celà venait des changements que tu avais fait.
J'ai en fait mis la préférence "javascript.options.strict" à true, et du coup tous les avertissements sont affichés. Je pense que ça viens de là. :wink:


Bon, au tour du cookie maintenant :? :lol:
(parce que ces commentaires fermés ça va un moment mais ça ne m'a jamais gêné qu'ils soient ouverts et maintenant ça me gêne qu'ils soient fermés...)
Cette fois je vais essayer de réussir seul (ce qui n'est de loin pas gagné) 8)

Merci :wink:
KissCoolMan
Salamandre
Messages : 37
Inscription : 16 févr. 2005, 18:09

Message par KissCoolMan »

Tu fais ça en Javascript ou en PHP ?
Kévin Descoubes
kevindescoubes[-at-]gmail[-dot-]com

http://kevin.descoubes.free.fr/kisscoolblog/

Get Firefox : http://getfirefox.com/
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 3 invités