Exécuter un code javascript sous certaines conditions

Voir le sujet précédent Voir le sujet suivant Aller en bas

  • 0

Astuce Exécuter un code javascript sous certaines conditions

Message par Ea le Dim 31 Juil 2011 - 7:16

Exécuter un code javascript
sous certaines conditions


Le javascript est un langage de script qui permet à son exécution de modifier des éléments de la page. Il est possible de mettre des codes javascripts dans le panneau d'administration pour qu'ils soient exécutés sur le forum ( voir Gestion des codes Javascript ).

Accessibilité aux éléments de la page par le code javascript :

Le code javascript a accès à tout les éléments existant avant là où il se trouve, les codes javascript mis dans le panneau d'administration sont mis dans la partie <head> ... </head> du forum ( où on spécifie l'adresse de la feuille de style, le titre de la page, l'encodage de la page ), ce qui veut dire que le script n'a accès au départ à aucun des éléments du contenu de la page ( vu qu'ils se trouvent après ).

Comment accéder aux éléments se trouvant après le script ? C'est assez simple, il suffit de retarder l'exécution du code. Il y a moyen de le faire avec des dispositifs de base de javascript, mais en les utilisant mal ( et beaucoup de scripts existants les utilisent mal ), 2 scripts auraient de fortes chance de ne pas fonctionner l'un avec l'autre. Alors plutôt que d'utiliser ce moyen il est préférable d'utiliser celui fourni par jQuery ( qui est une bibliothèque de javascript disposant de fonctions simplifiants les actions à faire pour arriver au résultat voulu ). En jQuery pour retarder l'exécution du code à quand tout les éléments de la page existent, il suffit de mettre :

Code:
$(function(){

  /* votre code javascript */

});
Le code que vous mettez à la place de /* votre code javascript */ sera exécuté à la fin de la page ( c'est à dire quand tout les éléments de la page existent et sont accessibles par le code ).

Pourquoi ne pas le faire automatiquement sur tout les codes ? Plein de raison peuvent faire que votre script n'a pas besoin d'accéder aux éléments de la page, par exemple si quand le titre de page est "Poster un nouveau sujet" on veut le remplacer par "Ouvrir un nouveau topic de discussion", il suffit de mettre ce script :

Code:
if(document.title=="Poster un nouveau sujet") document.title= "Ouvrir un nouveau topic de discussion";
Et pas besoin de le retarder, ça fonctionne bien juste comme cela.

Comment mettre une condition sur le code ?

C'est très simple il suffit de mettre :

Code:
if(condition) {

  /* votre code javascript à exécuter si la condition est vrai */

}

Comment faire une condition ?

Il suffit de mettre un élément, il sera évalué et suivant sa valeur la valeur de la condition sera vrai ou faux.

Ce qui est vrai :

  • la valeur true ( = valeur vrai )

  • toutes les chaînes de caractère ( non vide ).

  • tout les nombres sauf 0, -0 et NaN ( = pas un nombre ( Not a Number ), par exemple parseInt est une fonction qui transforme une chaîne de caractère en un entier, par exemple parseInt("4") renvoie le chiffre 4, et bien si on met parseInt("a") ce qui est renvoyé est le chiffre "spécial" NaN qui signifie pas un nombre ).


Ce qui est faux :

  • les valeurs undefined ( valeur qui indique que quelque chose a été déclaré mais n'a pas été défini par exemple en mettant "var test;" la valeur que test à est undefined tant qu'on ne lui a pas donné une autre valeur ( avec "test=3;" par exemple ) ), null ( valeur utilisée pour mettre une variable vide sans la mettre en indéfinie ( undefined ) ) et false ( = faux ).

  • les chaînes vides ( donc "" et '' ).

  • le nombre 0, -0 et NaN.

Pour comparer 2 valeurs ( et que le résultat donne vrai ou faux ) il faut utiliser un opérateur de comparaison parmi les suivants :

  • == : permet et vérifier que ce qu'il y a à gauche égale ce qui a à droite ( par exemple 1==3 renvoie faux et 42-2==40 est vrai ), vous pourriez le remplacer par égale en lisant ( par exemple if(3==5) donne si trois égale 5 ). Il faut faire attention que le type est ignoré ( par exemple "7"==7 est vrai et false==0 est vrai aussi ).

  • != : pareille que == mais ça compare si ce qu'il y a à droite est différent de ce qu'il y a à gauche ( par exemple 1!=3 est vrai et 10+7!=17 est faux ), vous pourriez le remplacer par est différent en lisant ( par exemple if(6!=7) donne si six est différent de sept ). Il faut faire attention aussi au fait que le type soit ignoré ( "7"!=7 est faux et false!=0 est faux ).

  • > : permet de tester si ce qui est à gauche est plus grand que ce qui est à droite ( par exemple 3<10 est vrai, 5<5 est faux ), vous pourriez le remplacer en lisant par est plus grand ( par exemple if(5>3) donne si 5 est plus grand que 3 ). Il faut faire attention à ne pas mélanger entier et chaîne de caractère, quand vous comparez 2 chaînes de caractère celle qui est plus grande que l'autre est juste déterminée par l'ordre alphabétique avec les majuscules avant les minuscules et les chiffres avant les lettres ( "aaa">"0zzz" est vrai, "aaa">"ZZZ" est vrai ( car les majuscules sont avant les minuscules ) et "6">"50" est vrai ( car 6 est avant 5 ) ) que c'est surtout destiné aux nombres, si vous testez un entier avec une chaîne, la chaîne sera convertie en nombre et si elle ne peut pas être convertie en nombre ( la chaîne "a" par exemple ) elle devient NaN et toutes les comparaisons de grandeur renvoient faux ( "a">7 est faux et "a"<=8 est faux, mais si la chaine peut être convertie en nombre c'est bon, "40">5 renvoie vrai ).

  • >= : permet de tester que ce qu'il y a à gauche est plus grand ou égale à ce qu'il y a à droite ( 3>=2 renvoie vrai, 19>=19 renvoie vrai et 12>=5225 renvoi faux ), vous pourriez le remplacer en lisant par est plus grand ou égal ( par exemple if(24>=5) donne si 24 est plus grand ou égal à 5 ). Même remarque pour les chaînes de caractères ( si 2 chaînes : ce sera par ordre alphabétique, si 1 chaîne et un nombre : la chaîne sera convertie en nombre ).

  • < : permet de tester que ce qu'il y a à gauche est plus petit que ce qu'il y a à droite ( 2<2 renvoie faux et 19<20 renvoie vrai ), vous pourriez le remplacer en lisant par est plus petit ( par exemple if(2<3) donne si deux est plus petit que trois ). Même remarque pour les chaînes de caractères ( si 2 chaînes ce sera par ordre alphabétique et si 1 chaîne et un nombre la chaîne sera convertie en nombre ).

  • <= : permet de tester que ce qu'il y a à gauche est plus petit ou égale à ce qu'il y a à droite ( 3<=2 renvoie faux, 19<=19 renvoie vrai et 12<=5225 renvoie vrai ), vous pourriez le remplacer en lisant par est plus petit ou égal ( par exemple if(24>=5) donne si 24 est plus petit ou égal à 5 ). Même remarque pour les chaînes de caractères ( si 2 chaînes ce sera par ordre alphabétique et si 1 chaîne et un nombre la chaîne sera convertie en nombre ).

  • === : permet de tester l'égalité et si c'est le même type ( 1===1 renvoie vrai mais 1==="1" renvoi faux ), vous pourriez le remplacer en lisant par est égale et du même type ( par exemple if(24===45) donne si 24 est égale et du même type que 45 ).

  • !== : permet de tester la différence ou si c'est un type différent ( 1!==2 renvoie vrai mais 1!=="2" renvoie faux ), vous pourriez le remplacer en lisant par est différent ou d'un type différent ( par exemple if(1!=="1") donne si un est différent ou d'un type différent que la chaîne de caractère "1" ).


Comment combiner plusieurs conditions ?

Vous pouvez soit combiner plusieurs if, par exemple :

Code:
if(condition1)
{
  if(condition2)
  {
     
      /* votre code javascript à exécuter si les 2 conditions sont vrai */

  }
}
Ou bien il y a des opérateurs qui permettent de combiner une condition à l'autre :

  • && : permet de tester la condition à gauche et à droite ( si celle à gauche est vrai ), si une des deux conditions est fausse la valeur renvoyée est faux, sinon la valeur renvoyée est vrai ( 1==1&&"3"==3 renvoie vrai mais 1==3 && 5==5 ou 1==1 && 3==4 ou 2==4 && 6==3 renvoient faux ).

  • || : permet de tester si la condition à gauche et à droite ( si celle à gauche est fausse ), si une des deux conditions est vrai la valeur renvoyée est vrai, sinon la valeur renvoyée est faux ( 1==1&&"3"==3, 1==3 && 5==5 ou 1==1 && 3==4 sont vrai mais 2==4 && 6==3 est faux ).

Ainsi l'exemple de juste au dessus pourrait s'écrire simplement :

Code:
if(condition1 && condition2)
{

    /* votre code javascript à exécuter si les 2 conditions sont vrai */

}

Exemples

Vous avez tout ce qu'il vous faut pour exécuter un code javascript sous certaines conditions, mais voici quelques exemples pour mettre cela en application.

Changer la bannière si on est sur le sujet 40 :

    Tout d'abord il faut mettre le script juste sur les pages de sujet. Ensuite chaque sujet à un numéro qu'on retrouve dans l'adresse de la page, par exemple /t40- pour le sujet 40 ( ou /t40p15- pour une page du sujet ).

    Tout les éléments concernant la page, se trouve dans l'objet document, ce qui nous intéresse dedans est document.location qui a plusieurs propriété concernant la page sur laquelle on se trouve, par exemple si on était sur http://forum.forumactif.com/h3-tutoriels?test#bonjour, voici les propriétés qu'il y aurait :

    • document.location.hash => #bonjour
    • document.location.host => forum.forumactif.com
    • document.location.href => http://forum.forumactif.com/h3-tutoriels?test#bonjour
    • document.location.origin => http://forum.forumactif.com
    • document.location.pathname => /h3-tutoriels
    • document.location.search : ?test

    Grâce à ces variables on a moyen de récupérer l'adresse de la page sur laquelle on est ( ensuite il suffit de la tester pour voir si on est sur la bonne page, ici donc les adresses pourraient être :

    Code:
    http://adresse-forum/t40-nom-du-sujet
    http://adresse-forum/t40p50-nom-du-sujet
    http://adresse-forum/t40-nom-du-sujet#424
    Donc il faut que notre test fonctionne avec tout cela.

    On ne peut pas faire simplement un test d'égalité car si le sujet fait 4 pages il faudrait déjà faire :

    Code:
    if(document.location.pathname=="/t40-nom-du-sujet" || document.location.pathname=="/t40p15-nom-du-sujet" || document.location.pathname=="/t40p30-nom-du-sujet" || document.location.pathname=="/t40p45-nom-du-sujet")
    {

        /*  code à exécuter */

    }
    Et si il en fait 200 n'en parlons pas.

    Donc plutôt que d'utiliser cela on va utiliser les expressions régulières ( des "modèles" pour lesquels on peut tester si une chaîne de caractère y correspond ou pas ).

    Pour faire une expression régulière il suffit de mettre :

    Code:
    /test/
    Et on peut l'utiliser de plusieurs façons, pour ce qu'on veut faire on peut l'utiliser de cette façon :

    Code:
    /test/.test("chaine de caractère contenant test")
    Si l'expression régulière /test/ est trouvée dans la chaîne, vrai est renvoyé sinon faux est renvoyé.

    Donc il nous suffit de trouver une expression régulière qui correspond à l'url de la page et ce sera notre condition pour exécuter le code.

    L'expression régulière qui convient ici si on teste le document.location.pathname ( donc /t40p2145-nom-du-sujet ) est :

    Code:
    /^\/t40(p[1-9][0-9]*)?-/
    Le ^ permet de signifier ce que je trouve doit commencer par ce qui suit, le \/ c'est juste pour chercher le / ( vu que c'est le caractère qui signale la fin de l'expression régulière on doit mettre \/ pour l'utiliser dedans ), ensuite le (contenu)?, les parenthèse permettent juste de sélectionner une partie, et le ? signifie ce qui précède doit être présent ou pas ( donc le contenu de la parenthèse est facultatif ), le [1-9], le [ et ] signifie une des lettres qui me compose ( donc par exemple aaa[edc]bbb ça trouvera aaaebbb, aaadbbb et aaacbbb ), le trait d'union à l'intérieur et entre deux caractère signifie "et tout ce qu'il y a entre" ( donc [1-7] c'est pareille à mettre [1234567] ) et puis pour finir le * signifie ce qui précède est présent 0 ou plusieurs fois.

    Donc si on voulait exprimer ce que fait le /^\/t40(p[1-9][0-9]*)?-/ ce serait trouver les chaînes de caractères qui commencent par /t40 après quoi il peut y avoir p1 à p9999... ( autant qu'on veut ) après quoi il y a un trait d'union.

    Donc on a notre code final :

    Code:
    if(/^\/t40(p[1-9][0-9]*)?-/.test(document.location.pathname))
    {
      // on retarde l'exécution pour que l'image existe à l'exécution de la partie de code
      $(function(){
        $("#pun-logo,#i_logo,#logo img").attr("src","http://illiweb.com/fa/i/smiles/icon_cat.png");
      });
    }
    Pour ce qui est du code pour changer la bannière, le $("selecteur") ( de la librairie jQuery inclue sur les forum forumactifs ) permet de sélectionner des éléments par un sélecteur CSS, le sélecteur #pun-logo,#i_logo,#logo img permet de sélectionner la bannière ( #i_logo celle de phpbb2, #logo img celle de phpbb3 et invision et #pun_logo celle de... punbb ), ensuite à cette sélection d'élément on peut faire un peu tout ce qu'on veut, nous on utilise la méthode attr("nom de l'attribut","valeur qui doit lui être mise") qui permet de modifier la valeur d'un attribut afin de changer l'adresse de l'image dans notre cas.

    Plus d'info sur les expressions régulières : comment ça marche, tout javascript et développez.

    Plus d'info sur les sélecteurs d'élément en jQuery : jquery (anglais), développeur web et jarodxxx.

    Plus d'info sur la méthode attr() de jQuery : jquery (anglais), développeur web et jarodxxx.


Mettre une alerte "hello amigo" à un membre qui n'avait pas visité le forum depuis 24h :

    Tout d'abord pour savoir si un membre est connecté ou pas, on peut utiliser le lien de déconnexion de la barre de menu, il est comme ceci :

    Code:
    <a class="mainmenu" href="/login?logout=1&tid=1e5fcece9113042c5a59c10f9ba5e060&key=afc70e" rel="nofollow" id="logout" >
    Et n’apparaît évidemment que si on est connecté, on peut le sélectionner facilement avec $("#logout") et il y a la propriété length de jQuery qui peut nous renvoyer combien d'éléments sont sélectionnés ( donc si on est connecter $("#logout").length renverra 1, et si on est déconnecté cela renverra 0 ).

    Ensuite pour savoir si le membre n'a pas ouvert de page depuis 24h, il suffit à chaque page ouverte d'enregistrer un cookie avec la date.

    Pour avoir la date il faut faire new Date() qui nous renvoie un objet Date contenant la date actuelle ( et pour le transformé en entier qui sont plus facile à utiliser, il suffit de mettre un + devant ).

    Forumactif inclut des fonctions pour lire et écrire des cookies sur ses forums. Il suffit de faire my_setcookie("nom du cookie","valeur",1,0) pour écrire un cookie et my_getcookie("nom du cookie") pour lire un cookie ( si on lit un cookie qui n'existe pas, la valeur null sera renvoyée ).

    On a tout ce qu'il nous faut, voici le code pour résoudre notre désir :

    Code:
    // vu qu'on test l'existant du bouton de logout, il faut retarder l'exécution du code pour que le bouton puisse être vu
    $(function(){
      // on fait juste $("#logout").length car à part (-)0, et NaN tout les chiffres sont "vrai"
      // on pourrait mettre $("#logout").length==1 ou $("#logout").length!=0
      if($("#logout").length)
      {
        // on regarde si le cookie n'existe pas ou bien si la date enregistrée est plus petite que la date actuelle moins 24h
        if(my_getcookie("dernierePage")===null || my_getcookie("dernierePage") < new Date()-1000*60*60*24)
        {
          alert("hello amigo");
        }
        // on met à jour la date de la dernière page affichée
        my_setcookie("dernierePage",+new Date(),1,0);
      }
    });
    Pour plus d'info sur la propriété length de jQuery : jquery, développeur web et jarodxxx.


Afficher un message à l'écriture d'un nouveau sujet dans le forum 6, 7 et 8 :

    Cette fois encore, il faut faire en fonction de l'adresse, l'adresse pour écrire un message dans le forum 7 est :

    Code:
    http://adresse-du-forum/post?f=7&mode=newtopic
    Donc il faut que le document.location.pathname soit /post et que le document.location.search soit ?f=7&mode=newtopic ou ?f=8&mode=newtopic ou ?f=9&mode=newtopic, on a ainsi déjà notre condition :

    Code:
    document.location.pathname=="/post" && /^\?f=[789]&mode=newtopic$/.test(document.location.search)
    ( il faut mettre \? à la place de ? quand on veut le chercher, car ? est un caractère spécial, et le $ signifie ce qui précède doit finir la ligne )

    Il nous reste juste à mettre un message, ce qui nous donne :

    Code:
    if(document.location.pathname=="/post" && /^\?f=[789]&mode=newtopic$/.test(document.location.search))
    {
      // retardement pour que la page soit chargée à l'exécution du code
      $(function(){
        $("form[name=post]").prepend('<div style="text-align: center; font-weight: bold; font-size: 20px; color: red">Pensez à mettre un titre explicite ;)</div>');
      });
    }
    prepend est une méthode de jQuery qui permet d'ajouter du code html au début d'un élément, aussi il faut faire attention car on met le contenu à afficher sous forme de chaîne javascript, dans une chaîne de texte javascript :

    Code:
    "cc'aa\\bb"xx" est le texte cc'aa\bb"xx
    'cc\'aa\\bb"xx' est le texte cc'aa\bb"xx
    ( si il est dans la chaîne, il faut mettre devant le caractère de fin et début ( qui est soit ' soit " ) un antislash ( \ ) )



Ea
Aidactif
Aidactif

Messages : 23429
Inscrit(e) le : 04/04/2008

Ea a été remercié(e) par l'auteur de ce sujet.

Voir le sujet précédent Voir le sujet suivant Revenir en haut


Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum