Forum Programmation.web Javascript appelé avec paramètre(s) dans l'URL

Posté par (page perso) .
Tags : aucun
0
4
mai
2008
Bonjour à tous,

J'ai une question pour les gurus en Javascript :

Est-ce qu'il est possible d'appeler un Javascript avec un paramètre (ou plusieurs) dans l'URL, et si oui, comment récupérer ce paramètre, et est-ce compatible pour les principaux navigateurs ?

Exemple : j'appelle par exemple le script truc.js

[script src="truc.js" type="text/javascript"][/script]

Je voudrai lui passer un paramètre bidule avec la valeur machin :

[script src="truc.js?bidule=machin" type="text/javascript"][/script]

Car avec document.location.href, on obtient l'URL de la page HTML, donc, est-ce qu'il y a une astuce ou un objet/méthode que je ne connais pas qui permette de récupérer les paramètres passés en GET au script Javascript.

Voilà, merci de vos éventuelles réponses !
  • # on peu pas

    Posté par . Évalué à 1.

    par contre il est possible de faire d'autres choses.

    Le mieux est que tu précises ce que tu souhaites faire.

    1) tu veux initialiser des varaibles et qu'un javascript static les récupère ?
    2) tu veux passer des paramètres a un javascript dynamique (php,python, ruby?) ?
    3) il n'y a pas de petit 3 (pour l'instant).
    • [^] # Re: on peu pas

      Posté par . Évalué à 2.

      Bonjour,

      Je pense comme blobmaster, mais si tu retrouve bien tes paramètres dans document.location.href, tu peux toujours utiliser ce genre de bidouilles:

      - v1 = document.location.href.split('?'); pour séparer les arguments de l'url;
      - v2 = v1[1].split('&'); pour séparer les différents paramètres;
      - for (v3 in v2) { v4 = v3.split("="); my_vars[v4[0]] = v4[1].unescape(); } pour créer le tableau my_vars avec les différentes valeurs.

      Une remarque: je n'ai pas testé, je te laisse ce privilège, en te remerciant de bien vouloir nous faire part du résultat.
      • [^] # Re: on peu pas

        Posté par (page perso) . Évalué à 1.

        Bonsoir,

        J'ai réalisé une petite fonction qui fait exactement ce que je désire, la voici :


        function getParam(){
        var src;
        var scripts = document.getElementsByTagName('script');
        for(var i = 0; i < scripts.length; i++){
        src = scripts[i].getAttribute('src');
        if(src.match(/myeffects\.js(\?.*)?$/) != null){
        var splitURL = src.split('?');
        var params = splitURL[1].split('&');
        var myParams = new Object();
        var keyValue = new Array();
        for(var j = 0; j < params.length; j++){
        keyValue = params[j].split('=');
        myParams[keyValue[0]] = unescape(keyValue[1]);
        }
        }
        }
        return myParams;
        }


        La fonction retourne un tableau associatif. Dans l'expression régulière, il faut mettre le nom du script. Et voilà, ça marche :)
        • [^] # Re: on peu pas

          Posté par . Évalué à 3.

          Re-bonjour,

          Merci de partager tes résultats, c'est très intéressant.
          Tellement interessant d'ailleurs, que je n'avais pas pu m'empécher de faire quelques essais de mon côté, voici mes conclusions (qui valent ce qu'elles valent) par rapport à ton bout de code:

          - au lieu du split('?'), j'avais utilisé un substring et indexOf pour éviter les problèmes potentiels, mais je doute que concretement cela fasse une grande différence;

          - j'ai appris que la fonction unescape est deprecated, il faut utiliser à la place decodeURIComponent (même si je préfère quand même unescape);

          - attention, ni unescape ni decodeURIComponent ne gèrent les espaces codés par +, il faut faire un replace avant;

          - tu sait que pour tes boucles for, tu as une construction plus simple:
          for (i in scripts)
          for (j in params)
          cela fait la même chose mais perso je les trouve plus lisibles.

          Bonne continuation dans tes scripts.
          Christophe.
    • [^] # Re: on peu pas (ben en fait, si)

      Posté par (page perso) . Évalué à 1.

      Merci de ta réponse,

      Pendant ce temps, j'ai fait autre chose, et, en allant voir le site de scriptaculous, j'ai vu une ligne qui était comme ça :

      [script src="scriptaculous.js?load=effects,dragdrop" type="text/javascript"][/script]

      Whoa ! C'est exactement ce que je veux... Je regarde la source de scriptaculous, et là, j'ai compris : il suffit tout simplement d'analiser via DOM les balises SCRIPT, trouver celle qui correspond à l'inclusion du fichier javascript, et analiser l'URL.

      C'est tout bête, mais j'étais resté obstiné sur une possibilité native en Javascript de faire ça.

      Pour les curieux, le passage de Scriptaculous correspondant au support des options passées par URL est le suivant (nécessite Prototype) :

      $A(document.getElementsByTagName("script")).findAll( function(s) {
      return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
      }).each( function(s) {
      var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
      var includes = s.src.match(/\?.*load=([a-z,]*)/);
      (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider,sound').split(',').each(
      function(include) { Scriptaculous.require(path+include+'.js') });
      });

      Et si on veut se passer de Prototype, il y a une solution sur le site Netlobo :
      http://www.netlobo.com/url_query_string_javascript.html
      Dans ce dernier, il faut ajouter la détection de la balise script et récupérer la valeur de l'attribut src à la place de window.location.href

      Voilà, donc du coup, c'est possible et assez simplement (ça m'apprendra à travailler un dimanche tiens !)

      Merci pour l'aide en tout cas.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.