Comment passer des paramètres à une balise de Script?

j'ai lu le tutoriel: http://drnicwilliams.com/2006/11/21/diy-widgets/ pour XSS Widgets par le Dr Nic.

je cherche un moyen de passer des paramètres à la balise script. Par exemple, pour faire le travail suivant:

<script src="http://path/to/widget.js?param_a=1&param_b=3">

y a-t-il un moyen de le faire?


mise à jour: deux liens intéressants:

53
demandé sur Community 2011-03-14 00:05:21

9 réponses

Je m'excuse d'avoir répondu à une super vieille question mais après avoir passé une heure à lutter avec les solutions ci-dessus, j'ai opté pour des choses plus simples.

<script src=".." one="1" two="2"></script>

à l'Intérieur de script ci-dessus:

document.currentScript.getAttribute('one'); //1
document.currentScript.getAttribute('two'); //2

beaucoup plus facile que jquery ou url parsing.

vous pourriez avoir besoin du polyfil pour le doucment.texte actuel de la réponse de @Yared Rodriguez pour IE:

document.currentScript = document.currentScript || (function() {
  var scripts = document.getElementsByTagName('script');
  return scripts[scripts.length - 1];
})();
67
répondu Richard Fox 2016-11-25 13:03:43

il est préférable d'utiliser la caractéristique dans html5 5 attributs de données

<script src="http://path.to/widget.js" data-width="200" data-height="200">
</script>

dans le fichier de script http://path.to/widget.js vous pouvez obtenir les paremeters de cette façon:

<script>
function getSyncScriptParams() {
         var scripts = document.getElementsByTagName('script');
         var lastScript = scripts[scripts.length-1];
         var scriptName = lastScript;
         return {
             width : scriptName.getAttribute('data-width'),
             height : scriptName.getAttribute('data-height')
         };
 }
</script>
47
répondu OBender 2016-06-19 10:15:19

compris.

var params = document.body.getElementsByTagName('script');
query = params[0].classList;
var param_a = query[0];
var param_b = query[1];
var param_c = query[2];

je passe params dans la balise de script comme les classes:

<script src="http://path.to/widget.js" class="2 5 4"></script>

cet article a beaucoup aidé.

15
répondu Tomer Lichtash 2015-01-25 20:15:05

JQuery a une façon de passer des paramètres à partir de code HTML javascript:

mettez ceci dans le myhtml.html fichier:

<!-- Import javascript -->
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
<!-- Invoke a different javascript file called subscript.js -->
<script id="myscript" src="subscript.js" video_filename="foobar.mp4">/script>

dans le même répertoire, créer un fichier subscript.js et y mettre:

//Use jquery to look up the tag with the id of 'myscript' above.  Get 
//the attribute called video_filename, stuff it into variable filename.
var filename = $('#myscript').attr("video_filename");

//print filename out to screen.
document.write(filename);

Analyser Le Résultat:

chargement du myhtml.page html a 'foobar.mp4 " imprimer écran. La variable video_filename est passée de html à javascript. Javascript l'a imprimé à l'écran, et il est apparu comme intégré dans le html dans le parent.

jsfiddle preuve que les travaux ci-dessus:

http://jsfiddle.net/xqr77dLt /

9
répondu Eric Leschinski 2015-01-25 20:19:55

si vous utilisez jquery vous pourriez vouloir considérer leur méthode de données.

j'ai utilisé quelque chose similaire à ce que vous essayez dans votre réponse mais comme ceci:

<script src="http://path.to/widget.js" param_a = "2" param_b = "5" param_c = "4">
</script>

vous pouvez aussi créer une fonction qui vous permet de saisir les paramètres GET directement (c'est ce que j'utilise fréquemment):

function $_GET(q,s) {
    s = s || window.location.search;
    var re = new RegExp('&'+q+'=([^&]*)','i');
    return (s=s.replace(/^\?/,'&').match(re)) ? s=s[1] : s='';
}

// Grab the GET param
var param_a = $_GET('param_a');
7
répondu Stuart 2015-01-25 20:15:56

une autre façon est d'utiliser les balises meta. Quelles que soient les données qui sont censées être transmises à votre JavaScript, vous pouvez les affecter comme suit:

<meta name="yourdata" content="whatever" />
<meta name="moredata" content="more of this" />

les données peuvent alors être extraites des balises meta comme ceci (le mieux fait dans un gestionnaire D'événements chargé par Domcontent):

var data1 = document.getElementsByName('yourdata')[0].content;
var data2 = document.getElementsByName('moredata')[0].content;

absolument pas de tracas avec jQuery ou les autres, pas de hacks et de solutions de rechange nécessaires, et fonctionne avec n'importe quelle version HTML qui supporte les balises meta...

5
répondu Robidu 2017-08-31 08:11:34

grâce au jQuery, une solution simple conforme HTML5 est de créer une balise HTML supplémentaire, comme div, pour stocker les données.

HTML :

<div id='dataDiv' data-arg1='content1' data-arg2='content2'>
  <button id='clickButton'>Click me</button>
</div>

JavaScript :

$(document).ready(function() {
    var fetchData = $("#dataDiv").data('arg1') + 
                    $("#dataDiv").data('arg2') ;

    $('#clickButton').click(function() {
      console.log(fetchData);
    })
});

Live demo avec le code ci-dessus: http://codepen.io/anon/pen/KzzNmQ?editors=1011#0

sur la démo live, on peut voir les données de HTML5 données - * attributs à concaténer et à imprimer dans le journal.

Source: https://api.jquery.com/data /

3
répondu gagallo7 2016-03-09 00:44:07

mettez les valeurs dont vous avez besoin quelque part où l'autre script peut les récupérer, comme une entrée cachée, et puis tirez ces valeurs de leur conteneur lorsque vous initialisez votre nouveau script. Vous pourriez même mettre tous vos params comme une corde de JSON dans un champ caché.

2
répondu bwest 2011-03-13 21:07:30

c'est un très vieux fil, je sais mais cela pourrait aider aussi si quelqu'un arrive ici une fois qu'ils cherchent une solution.

J'ai utilisé le document.currentScript pour obtenir l'élément d'où mon code est en cours d'exécution et je filtre en utilisant le nom de la variable que je cherche. Je l'ai fait en étendant currentScript avec une méthode appelée "get", donc nous serons en mesure de récupérer la valeur à l'intérieur de ce script en utilisant:

document.currentScript.get('get_variable_name');

de cette façon nous pouvons utilisez L'URI standard pour récupérer les variables sans ajouter d'attributs spéciaux.

C'est le code final

document.currentScript.get = function(variable) {
    if(variable=(new RegExp('[?&]'+encodeURIComponent(variable)+'=([^&]*)')).exec(this.src))
    return decodeURIComponent(variable[1]);
};

j'oubliais IE :) cela ne pouvait pas être plus facile... J'ai bien fait de ne pas mentionner que le document.currentScript est une propriété de HTML5. Il n'a pas été inclus pour les différentes versions de IE (j'ai testé JUSQU'à IE11, et il n'était pas encore là). Pour la compatibilité IE, j'ai ajouté cette partie au code:

document.currentScript = document.currentScript || (function() {
  var scripts = document.getElementsByTagName('script');
  return scripts[scripts.length - 1];
})();

ce que nous faisons ici est de définir un code alternatif pour IE, qui renvoie l'objet script actuel, qui est requis dans la solution pour extraire les paramètres de la propriété src. Ce n'est pas la solution parfaite pour IE puisqu'il y a des limites; si le script est chargé asynchrone. Les nouveaux navigateurs devraient inclure ".propriété currentScript".

j'espère que ça aidera.

2
répondu Yared Rodriguez 2016-11-25 13:03:25