Page 1 sur 2
[Résolu] JavaScript - if (variable)
Publié : 12 sept. 2005, 17:44
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ô

...
Merci
EDIT : modif du code
Publié : 12 sept. 2005, 18:32
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.
Publié : 12 sept. 2005, 18:41
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...
Publié : 12 sept. 2005, 18:44
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...
Publié : 12 sept. 2005, 18:59
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é
... (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.
}
Publié : 12 sept. 2005, 19:00
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)

...
Publié : 12 sept. 2005, 19:09
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...
Publié : 12 sept. 2005, 19:12
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
Publié : 12 sept. 2005, 19:44
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.
Publié : 12 sept. 2005, 19:46
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.
Publié : 12 sept. 2005, 20:32
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...
Publié : 13 sept. 2005, 00:26
par FF_Olivier

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

...
Publié : 13 sept. 2005, 08:11
par PsyDk
FF_Olivier a écrit :
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à

Publié : 13 sept. 2005, 11:43
par jv2759
FF_Olivier a écrit :
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...
Publié : 13 sept. 2005, 11:58
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à

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...