IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

[GreaseMonkey] Tester si une fonction existe dans le script


Sujet :

JavaScript

  1. #1
    Membre régulier
    Avatar de osopardo
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Points : 105
    Points
    105
    Par défaut [GreaseMonkey] Tester si une fonction existe dans le script
    Bonjour,

    J'aurais besoin de tester si une fonction existe dans mon script greasemonkey, à partir d'une chaine de caractère, puis l'appeler si elle existe.

    En dehors de greaseMonkey cela se fait de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if( typeof window['nomFonction'] == 'function' ){
     window['nomFonction']();
    }
    Sauf qu'au sein des scripts greaseMonkey les fonctions ne sont pas accessibles dans le DOM à moins de les y enregistrer explicitement via

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsafeWindow.maFonction = function(){...
    Comme l'enregistrement de mes fonctions greaseMonkey dans le DOM pour les y récupérer ensuite ne me semble pas être une idée merveilleuse, quelqu'un connaitrait-il un moyen d'accéder dynamiquement aux fonctions créées dans le script ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 642
    Points : 66 668
    Points
    66 668
    Billets dans le blog
    1
    Par défaut
    ou un try catch ?

  3. #3
    Membre régulier
    Avatar de osopardo
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Points : 105
    Points
    105
    Par défaut
    Oui mais non parce que dans mon cas 'lafonction' ce n'est qu'une chaine de caractères que je connais pas, d'où la pseudo astuce window['mafonction']

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 642
    Points : 66 668
    Points
    66 668
    Billets dans le blog
    1
    Par défaut
    alors en conservant la possibilité de variabiliser le nom:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function foo(){alert('coucou')}
     
    alert(window['foo'] instanceof Function)
    alert(window['bar'] instanceof Function)

  5. #5
    Membre régulier
    Avatar de osopardo
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Points : 105
    Points
    105
    Par défaut
    Merci pour tes suggestions mais mon problème est vraiment spécifique à GreaseMonkey :

    Tous ce qui est dans un script greaseMonkey s'exécute dans un espace privé, inaccessible de la page web, à moins de passé par un objet spécifique unsafeWindow qui est une sorte de mapping de l'objet window dans l'espace privé de GreaseMonkey.

    Il est donc possible de stocker des variables, fonctions ou tous le contenu du script greaseMonkey dans le DOM de la page via unsafeWindow mais c'est risqué au niveau de la sécurité : le webmaster du site pourrait alors les modifier et abuser des privilèges supérieurs de greaseMonkey.

    Je cherchais donc un objet ou une méthode propre à GreaseMonkey qui permettrais d'avoir accès aux éléments du script comme avec window mais ça n'a pas l'air d'exister.

    Une autre solution pour mon cas est l'utilisation d'eval, habituellement assez risqué au niveau de la sécurité, mais comme la chaine que je teste provient uniquement d'un objet du script, je pense qu'il n'y a aucun risque.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Test si la fonction existe
    if( typeof eval('maFonction') == 'function'){
     
      //Appel de la fonction
      eval('maFonction')(params);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tester si une fonction existe
    Par Bouki dans le forum C
    Réponses: 2
    Dernier message: 13/01/2008, 14h30
  2. [AJAX] Tester si une fonction existe
    Par Kosti dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/08/2007, 18h24
  3. Tester si une table existe dans une base access
    Par codial dans le forum Bases de données
    Réponses: 6
    Dernier message: 28/03/2007, 08h39
  4. Tester qu'une valeur existe dans une "liste"
    Par Oluha dans le forum Langage
    Réponses: 12
    Dernier message: 04/08/2005, 23h01
  5. Réponses: 2
    Dernier message: 20/05/2005, 10h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo