[Résolu] JavaScript - if (variable)

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 !
FF_Olivier
Iguane
Messages : 979
Inscription : 09 juil. 2004, 15:41

[Résolu] JavaScript - if (variable)

Message par FF_Olivier »

Bonjour,

Pour des raisons de lisibilité, je souhaiterais remplir des variables parfois complexes en début de code, pour les utiliser clairement plus loin dans le programme, comme ceci :

Code : Tout sélectionner

  var criteriaForPhpBBPage = '(allLinks[i].href == "http://www.ppbb.com/") && ' +
                             '(allLinks[i].firstChild.data == "phpBB") && ' +
                             '(allLinks[i].previousSibling.data.match(/Powered by/)) && ' +
                             '(allLinks[i].nextSibling.data.match(/phpBB Group/))'
  ...
  ...<100 lignes plus bas>...
  ...
  var allLinks = document.getElementsByTagName("A");
  for (var i = (allLinks.length-1); i > (allLinks.length-20) ; i--)	// Only test the last 20 links on a page, for speed.
   if (criteriaForPhpBBPage) {
      HideSigs();	// Triggers sig hiding.
      break;		// No need to search any further.
    }
Malheureusement, si je fais ça, if (criteriaForPhpBBPage) ne fonctionne pas, le contenu de la variable n'est pas interprété/développé, il me retourne un résultat tjs vrai (pcq la variable existe, je pense).

Je suis assez nul en JavaScript, qqn pourrait me mettre sur la voie svp ? C'est pour utiliser dans un script Greasemonkey, je suis sûr que ça doit être très con, le b.a.-ba du JavaScript, mais je trouve pô :oops: ...

Merci ;)

EDIT : modif du code
Dernière modification par FF_Olivier le 13 sept. 2005, 14:25, modifié 2 fois.
openSUSE 12.2 - FF v24.0 FR - TB v24.0 FR ma config en détails - Décrivez la vôtre ici ;)
userContent.css : modifiez l'apparence et le contenu des sites visités !
jv2759
Tyrannosaurus Rex
Messages : 4161
Inscription : 12 févr. 2004, 14:29

Message par jv2759 »

Si j'était confronter à ce genre de probléme ce que je ferais c'est que juste en dessous d'inicialiserais une variable de test avec une chaine de caractére...

Le but et de pouvoir faire un alert... Ainsi je sais si ma variable et ou non renceigner... Puis je déplace le alert pour voir ou elle est ou n'est pas renceigner, jusqu'au moment ou elle ne les plus ainsi cela peux donner une bonne piste pour savoir pourquoi j'ai perdut la valeur à cette endroit.
Inscrit sur la liste des abonner absent...
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Est-ce que quelque chose comme

Code : Tout sélectionner

var criteriaForPhpBBPage =
 			(allLinks[i].href == "http://www.ppbb.com/") &&
			(allLinks[i].firstChild.data == "phpBB") &&
			(allLinks[i].previousSibling.data.match(/Powered by/)) &&
			(allLinks[i].nextSibling.data.match(/phpBB Group/))
? true : false
ferait l'affaire ? Peut-être le tout entouré d'une parenthèse ?

À mon avis, il ne faut pas de ' ... ', parce que dans ce cas ce sont juste des chaines de caractères, qui ne seront pas interprétées...
jv2759
Tyrannosaurus Rex
Messages : 4161
Inscription : 12 févr. 2004, 14:29

Message par jv2759 »

Cela decrais même marchais sans le ? true : false (ce qui me plairais plus)

Mais en effet avec le + ce sont des chaine qui sont interpreter...

Pous les '...', je supose que tu tes tromper avec le +, car les ... Je suppose nous était réserver à nous...
Inscrit sur la liste des abonner absent...
FF_Olivier
Iguane
Messages : 979
Inscription : 09 juil. 2004, 15:41

Message par FF_Olivier »

calimo a écrit :Est-ce que quelque chose comme

Code : Tout sélectionner

var criteriaForPhpBBPage =
 			(allLinks[i].href == "http://www.ppbb.com/") &&
			(allLinks[i].firstChild.data == "phpBB") &&
			(allLinks[i].previousSibling.data.match(/Powered by/)) &&
			(allLinks[i].nextSibling.data.match(/phpBB Group/))
? true : false
ferait l'affaire ? Peut-être le tout entouré d'une parenthèse ?

À mon avis, il ne faut pas de ' ... ', parce que dans ce cas ce sont juste des chaines de caractères, qui ne seront pas interprétées...
Non Calimo, ça ne marche pas, pcq le n'est pas encore défini au moment de la déclaration de la variable, il faut vraiment le stocker comme une chaîne de caractères qui sera interprétée plus tard.

Je me rends compte en répondant à ta question que j'ai oublié deux lignes importantes dans le code, qui clarifie justement cela, désolé :oops: ... (j'ai édité mon msg original)

J'essaie maintenant d'utiliser la fonction eval(), mais sans succès jusqu'à présent :

Code : Tout sélectionner

  var allLinks = document.getElementsByTagName("A");
  for (var i = (allLinks.length-1); i > (allLinks.length-20) ; i--)	// Only test the last 20 links on a page, for speed.
    eval("var criteria = " + criteriaForPhpBBPage);
    if (criteria) {
      HideSigs();	// Triggers sig hiding.
      break;		// No need to search any further.
    }
openSUSE 12.2 - FF v24.0 FR - TB v24.0 FR ma config en détails - Décrivez la vôtre ici ;)
userContent.css : modifiez l'apparence et le contenu des sites visités !
FF_Olivier
Iguane
Messages : 979
Inscription : 09 juil. 2004, 15:41

Message par FF_Olivier »

jv2759 a écrit :Pous les '...', je supose que tu tes tromper avec le +, car les ... Je suppose nous était réserver à nous...
Oui, c'est pour vous, j'ai viré une partie du code (trop, d'ailleurs, j'ai modifié mon msg original) ;) ...
openSUSE 12.2 - FF v24.0 FR - TB v24.0 FR ma config en détails - Décrivez la vôtre ici ;)
userContent.css : modifiez l'apparence et le contenu des sites visités !
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Hum... pourquoi ne pas utiliser une fonction dans ce cas ? Tu envoies le i en paramètre et tu teste dans la fonction...
jv2759
Tyrannosaurus Rex
Messages : 4161
Inscription : 12 févr. 2004, 14:29

Message par jv2759 »

eval("var criteria = " + criteriaForPhpBBPage);

si tu veux être sur de ce que tu evalut, fait utilise un alert...

Par exemple je ne sais plus si c'est php ou javascript, mais l'un des deux utilise le + pour l'adition et le . Pour la concatenation. Imagine que ce soit le cas
Inscrit sur la liste des abonner absent...
FF_Olivier
Iguane
Messages : 979
Inscription : 09 juil. 2004, 15:41

Message par FF_Olivier »

calimo a écrit :Hum... pourquoi ne pas utiliser une fonction dans ce cas ? Tu envoies le i en paramètre et tu teste dans la fonction...
Ceci fonctionne effectivement :

Code : Tout sélectionner

  function Criteria(Link) {
    // The variables. 
    // Please change here and nowhere else !!!
    return ((Link.href == "http://www.phpbb.com/") &&
            (Link.firstChild.data == "phpBB") &&
            (Link.previousSibling.data.match(/Powered by/)) &&
            (Link.nextSibling.data.match(/phpBB Group/)))
  
  }
  

  // Here we look for "Powered by" and "phpBB Group" at the bottom of all pages.
  // GM_log("phpBB sig image hider is checking if the page is phpBB...", 0);

  var allLinks = document.getElementsByTagName("A");
  for (var i = (allLinks.length-1); i > (allLinks.length-20) ; i--)	// Only test the last 20 links on a page, for speed.
    if (Criteria(allLinks[i])) {
      HideSigs();	// Triggers sig hiding.
      break;		// No need to search any further.
    }
C'est déjà mieux, merci, mais ça me «force» à définir la fonction avant le code principal pour que le critère variable soit en tête, je n'aime pas trop.
openSUSE 12.2 - FF v24.0 FR - TB v24.0 FR ma config en détails - Décrivez la vôtre ici ;)
userContent.css : modifiez l'apparence et le contenu des sites visités !
FF_Olivier
Iguane
Messages : 979
Inscription : 09 juil. 2004, 15:41

Message par FF_Olivier »

jv2759 a écrit :eval("var criteria = " + criteriaForPhpBBPage);

si tu veux être sur de ce que tu evalut, fait utilise un alert...

Par exemple je ne sais plus si c'est php ou javascript, mais l'un des deux utilise le + pour l'adition et le . Pour la concatenation. Imagine que ce soit le cas
eval() n'a pas l'air d'être accepté dans Greasemonkey.
alert() dans un for n'a pas l'air de fonctionner, il me répond invalid break...
C'est bien «+» pour la concaténation de chaînes dans JavaScript.
openSUSE 12.2 - FF v24.0 FR - TB v24.0 FR ma config en détails - Décrivez la vôtre ici ;)
userContent.css : modifiez l'apparence et le contenu des sites visités !
PsyDk
Lézard à collerette
Messages : 317
Inscription : 23 sept. 2003, 09:41

Message par PsyDk »

FF_Olivier a écrit :C'est déjà mieux, merci, mais ça me «force» à définir la fonction avant le code principal pour que le critère variable soit en tête, je n'aime pas trop.
Mmh, et une fonction locale ?

Code : Tout sélectionner

Du code...

var funcCriteria = function (Link) {
  return ((Link.href == "http://www.phpbb.com/") &&
            (Link.firstChild.data == "phpBB") &&
            (Link.previousSibling.data.match(/Powered by/)) &&
            (Link.nextSibling.data.match(/phpBB Group/)));
 
}

if( funcCriteria(blabla) )
{
   Du code...
}

Du code...
FF_Olivier
Iguane
Messages : 979
Inscription : 09 juil. 2004, 15:41

Message par FF_Olivier »

:oops: Euuh, quelle différence avec le dernier code que j'ai donné ? Quels avantages ? Je vois bien que tu définis une fonction dans une variable, mais qu'est-ce que ça change par rapport à ma définition de fonction ?
Désolé, j'ai prévenu, nul en JavaScript :? ...
openSUSE 12.2 - FF v24.0 FR - TB v24.0 FR ma config en détails - Décrivez la vôtre ici ;)
userContent.css : modifiez l'apparence et le contenu des sites visités !
PsyDk
Lézard à collerette
Messages : 317
Inscription : 23 sept. 2003, 09:41

Message par PsyDk »

FF_Olivier a écrit ::oops: Euuh, quelle différence avec le dernier code que j'ai donné ? Quels avantages ? Je vois bien que tu définis une fonction dans une variable, mais qu'est-ce que ça change par rapport à ma définition de fonction ?
Désolé, j'ai prévenu, nul en JavaScript :? ...
Heu, bah ça semblait t'embêter d'avoir à définir une fonction avant ton code principal. Là avec une fonction locale tu la définis dans ta fonction principale au moment de tes besoins. Je dois dire que tu me mets aussi dans le flou là :mrgreen:
jv2759
Tyrannosaurus Rex
Messages : 4161
Inscription : 12 févr. 2004, 14:29

Message par jv2759 »

FF_Olivier a écrit ::oops: Euuh, quelle différence avec le dernier code que j'ai donné ? Quels avantages ?
Cela n'aporte agsolument aucun avantage... C'est chaqu'un qui fait comme ils préfére... Deux fasson de déclarer une fonction, on peux alors ce dire que l'un est utiliser pour les fonction importante, l'autre pour des fonction mineur... A ce niveaux les avantage inconvéniant son casi nul, c'est plus des régle de codage qui compte...
Inscrit sur la liste des abonner absent...
FF_Olivier
Iguane
Messages : 979
Inscription : 09 juil. 2004, 15:41

Message par FF_Olivier »

PsyDk a écrit :Heu, bah ça semblait t'embêter d'avoir à définir une fonction avant ton code principal. Là avec une fonction locale tu la définis dans ta fonction principale au moment de tes besoins. Je dois dire que tu me mets aussi dans le flou là :mrgreen:
Désolé de t'avoir embrouillé, ce n'était pas le but ;) !
En fait, je ne suis pas obligé de définir une fonction en début de code, le prg sera fonctionnel où que soit la fonction par rapport au code principal, c'est juste que j'aime, pour des raisons pratiques, que les variables et les constantes soient définies et regroupées en tête de programme, là où il est facile de les trouver et de les modifier.

D'une manière générale, j'aime bien que mon code ait la structure suivante :

Code : Tout sélectionner

// Les variables
// Les constantes

// le code principal (principalement des appels aux fonctions)

// Les fonctions
Or, ici, comme je n'arrive pas à évaluer une variable String qui contiendrait la condition de test, la seule alternative que j'aie (pour le moment) est d'effectuer le test dans une fonction, comme l'a suggéré calimo.

Du coup, soit je garde cette fonction-filtre en tête puisque son contenu est susceptible de varier, et je ne suis pas content pcq la fonction n'est pas à sa place dans mon code, soit je déplace cette fonction-filtre dans la partie fonctions, et je ne suis pas content non plus puisque son contenu susceptible de varier n'apparaît pas en tête avec les autres variables.

Bref, je suis frustré ;) ... Ça marche, mais je suis frustré par rapport à l'écriture du code...
openSUSE 12.2 - FF v24.0 FR - TB v24.0 FR ma config en détails - Décrivez la vôtre ici ;)
userContent.css : modifiez l'apparence et le contenu des sites visités !
Répondre

Qui est en ligne ?

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