Souvent, j'aurai un fichier JavaScript que je souhaite utiliser et qui nécessite la définition de certaines variables dans ma page Web.
Donc, le code est quelque chose comme ceci:
<script type="text/javascript" src="file.js"></script>
<script type="text/javascript">
var obj1 = "somevalue";
</script>
Mais ce que je veux faire, c'est:
<script type="text/javascript"
src="file.js?obj1=somevalue&obj2=someothervalue"></script>
J'ai essayé différentes méthodes et la meilleure à ce jour est d'analyser la chaîne de requête comme ceci:
var scriptSrc = document.getElementById("myscript").src.toLowerCase();
Et puis recherchez mes valeurs.
Je me demande s'il existe une autre façon de faire cela sans créer de fonction pour analyser ma chaîne.
Connaissez-vous tous d'autres méthodes?
Réponses:
Je recommanderais de ne pas utiliser de variables globales si possible. Utilisez un espace de noms et une POO pour transmettre vos arguments à un objet.
Ce code appartient au file.js:
Et dans votre fichier html:
la source
var MYLIBRARY = MYLIBRARY || (function(){}());
? Pourquoi devrait-ilMYLIBRARY
être défini sur une valeur booléenne?Vous pouvez transmettre des paramètres avec des attributs arbitraires. Cela fonctionne dans tous les navigateurs récents.
Dans somefile.js, vous pouvez obtenir les valeurs des variables transmises de cette façon:
........
...etc...
la source
document.currentScript
, voir caniuse.com/#feat=document-currentscript pour la compatibilité (ou utiliser un polyfill)$(..)
syntaxe est jquery, n'oubliez pas de l'inclure.Une autre idée que j'ai rencontrée était d'assigner un
id
à l'<script>
élément et de passer les arguments en tantdata-*
qu'attributs. La<script>
balise résultante ressemblerait à ceci:Le script peut ensuite utiliser l'ID pour se localiser et analyser les arguments par programme. Compte tenu de la
<script>
balise précédente , le nom pourrait être récupéré comme ceci:Nous obtenons
name
=helper
la source
helper.js
script parcoure toutes lesscript
balises de la page, en recherchant celle avecscr="helper.js"
, puis en extrayantdata-name
.var this_js_script = $('script[src*=somefile]');
(copié d'en haut )Consultez cette URL. Cela fonctionne parfaitement pour l'exigence.
http://feather.elektrum.org/book/src.html
Merci beaucoup à l'auteur. Pour une référence rapide, j'ai collé la logique principale ci-dessous:
la source
Vous utilisez des variables globales :-D.
Comme ça:
Le code JavaScript dans 'file.js' peut accéder à
obj1
etobj2
sans problème.EDIT Je veux juste ajouter que si 'file.js' veut vérifier si
obj1
etobj2
a même été déclaré, vous pouvez utiliser la fonction suivante.J'espère que cela t'aides.
la source
return typeof window[$Name] !== 'undefined';
. Veuillez noter que vous passeriez à cette fonction une chaîne contenant le nom de la variable. Il est probablement plus facile de vérifier simplement si la variable existe dans le code appelant (cela ne peut pas être implémenté en tant que fonction) viaif (typeof var !== 'undefined')
.var
.Voici une preuve de concept très précipitée.
Je suis sûr qu'il y a au moins 2 endroits où il peut y avoir des améliorations, et je suis également sûr que cela ne survivrait pas longtemps à l'état sauvage. Tout commentaire pour le rendre plus présentable ou utilisable est le bienvenu.
La clé définit un identifiant pour votre élément de script. Le seul problème est que cela signifie que vous ne pouvez appeler le script qu'une seule fois, car il recherche cet ID pour extraire la chaîne de requête. Cela pourrait être corrigé si, à la place, le script effectue une boucle sur tous les éléments de requête pour voir si l'un d'entre eux pointe vers lui, et si tel est le cas, utilise la dernière instance d'un tel élément de script. Quoi qu'il en soit, avec le code:
Script appelé:
Script appelé via la page suivante:
la source
pourrait être très simple
par exemple
Vous pouvez ensuite convertir la chaîne de requête en json comme ci-dessous
et puis peut utiliser comme
la source
Cela peut être facilement fait si vous utilisez un framework Javascript comme jQuery. Ainsi,
Vous pouvez maintenant utiliser ces paramètres en les fractionnant en tant que paramètres variables.
Le même processus peut être fait sans aucun cadre, mais prendra quelques lignes de code supplémentaires.
la source
Eh bien, vous pourriez avoir le fichier javascript en cours de construction par l'un des langages de script, en injectant vos variables dans le fichier à chaque demande. Vous devrez dire à votre serveur Web de ne pas distribuer de fichiers js de manière statique (l'utilisation de mod_rewrite suffirait).
Sachez cependant que vous perdez toute mise en cache de ces fichiers js car ils sont constamment modifiés.
Au revoir.
la source
<script>
bloc, vous pouvez utiliser quelque chose comme celuiMyModule.Initialize( '<%: Model.SomeProperty%>', '<%: Model.SomeOtherProperty%>', ...);
qui est rendu sur le serveur. Attention:<%:
échappe la valeur, tandis que<%=
envoie la valeur sans échappement.MyModule
serait un espace de noms (c'est-à-dire une variable à l'intérieur du fichier .js qui est auto-invoquée, qui expose la fonctionInitialize
). J'ai voté pour votre réponse, car c'est une contribution utile.Bonne question et réponses créatives mais ma suggestion est de paramétrer vos méthodes et cela devrait résoudre tous vos problèmes sans aucune astuce.
si vous avez une fonction:
vous pouvez changer cela en:
Je pense que c'est l'approche la plus naturelle, vous n'avez pas besoin de créer de documentation supplémentaire sur les `` paramètres de fichier '' et vous recevez la même chose. Ceci est particulièrement utile si vous autorisez d'autres développeurs à utiliser votre fichier js.
la source
Non, vous ne pouvez pas vraiment faire cela en ajoutant des variables à la partie chaîne de requête de l'URL du fichier JS. Si c'est écrit la partie de code pour analyser la chaîne qui vous dérange, peut-être une autre façon serait de json encoder vos variables et de les mettre dans quelque chose comme l'attribut rel de la balise? Je ne sais pas à quel point cela est valable en termes de validation HTML, si c'est quelque chose qui vous inquiète beaucoup. Ensuite, il vous suffit de trouver l'attribut rel du script, puis de json_decode.
par exemple
la source
Ce n'est pas du HTML valide (je ne pense pas) mais cela semble fonctionner si vous créez un attribut personnalisé pour la balise de script dans votre page Web :
<script id="myScript" myCustomAttribute="some value" ....>
Accédez ensuite à l'attribut personnalisé dans le javascript:
var myVar = document.getElementById( "myScript" ).getAttribute( "myCustomAttribute" );
Je ne sais pas si c'est meilleur ou pire que l'analyse de la chaîne source du script.
la source
Si vous avez besoin d'un moyen qui passe la vérification CSP (qui interdit unsafe-inline), vous devez utiliser la méthode nonce pour ajouter une valeur unique à la fois au script et à la directive CSP ou écrire vos valeurs dans le html et les relire.
Méthode Nonce pour express.js:
ou écrivez des valeurs dans la méthode html. dans ce cas en utilisant Jquery:
la source
Bien que cette question ait été posée il y a quelque temps, elle est toujours d'actualité. Ce n'est pas une approche triviale utilisant des paramètres de fichier de script, mais j'avais déjà des cas d'utilisation extrêmes où cette méthode était la plus adaptée.
Je suis tombé sur ce post pour trouver une meilleure solution que ce que j'avais écrit il y a quelque temps, avec l'espoir de trouver peut-être une fonctionnalité native ou quelque chose de similaire.
Je partagerai ma solution, jusqu'à ce qu'une meilleure soit mise en œuvre. Cela fonctionne sur la plupart des navigateurs modernes, peut-être même sur les plus anciens, je n'ai pas essayé.
Toutes les solutions ci-dessus, sont basées sur le fait qu'il doit être injecté avec une balise SCRIPT prédéfinie et bien marquée et s'appuyer entièrement sur l'implémentation HTML. Mais que se passe-t-il si le script est injecté dynamiquement, ou pire encore, que se passe-t-il si vous écrivez une bibliothèque, qui sera utilisée dans une variété de sites Web?
Dans ces cas et dans d'autres, toutes les réponses ci-dessus ne sont pas suffisantes et deviennent même trop compliquées.
Tout d'abord, essayons de comprendre ce que nous devons accomplir ici. Tout ce que nous devons faire est d'obtenir l'URL du script lui-même, à partir de là, c'est un jeu d'enfant.
Il existe en fait une astuce intéressante pour obtenir l'URL du script à partir du script lui-même. L'une des fonctionnalités de la
Error
classe native est la possibilité de fournir une trace de pile de «l'emplacement problématique», y compris la trace exacte du fichier jusqu'au dernier appel. Pour ce faire, j'utiliserai la propriété stack de l'instance Error, qui une fois créée, donnera la trace complète de la pile.Voici comment fonctionne la magie:
Maintenant, dans tous les cas d'appel de script, comme dans le cas OP:
Dans le
file.js
script, vous pouvez maintenant faire:Cela fonctionnera également avec RequireJS et d'autres scripts de fichiers injectés dynamiquement.
la source