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:
// The pattern to split each row in the stack trace string
const STACK_TRACE_SPLIT_PATTERN = /(?:Error)?\n(?:\s*at\s+)?/;
// For browsers, like Chrome, IE, Edge and more.
const STACK_TRACE_ROW_PATTERN1 = /^.+?\s\((.+?):\d+:\d+\)$/;
// For browsers, like Firefox, Safari, some variants of Chrome and maybe other browsers.
const STACK_TRACE_ROW_PATTERN2 = /^(?:.*?@)?(.*?):\d+(?::\d+)?$/;
const getFileParams = () => {
const stack = new Error().stack;
const row = stack.split(STACK_TRACE_SPLIT_PATTERN, 2)[1];
const [, url] = row.match(STACK_TRACE_ROW_PATTERN1) || row.match(STACK_TRACE_ROW_PATTERN2) || [];
if (!url) {
console.warn("Something went wrong. You should debug it and find out why.");
return;
}
try {
const urlObj = new URL(url);
return urlObj.searchParams; // This feature doesn't exists in IE, in this case you should use urlObj.search and handle the query parsing by yourself.
} catch (e) {
console.warn(`The URL '${url}' is not valid.`);
}
}
Maintenant, dans tous les cas d'appel de script, comme dans le cas OP:
<script type="text/javascript" src="file.js?obj1=somevalue&obj2=someothervalue"></script>
Dans le file.js
script, vous pouvez maintenant faire:
const params = getFileParams();
console.log(params.get('obj2'));
// Prints: someothervalue
Cela fonctionnera également avec RequireJS et d'autres scripts de fichiers injectés dynamiquement.