Sebbene questa domanda sia stata posta qualche tempo fa, è ancora rilevante ad oggi. Questo non è un approccio banale usando i parametri del file di script, ma ho già avuto alcuni casi d'uso estremi che in questo modo erano più adatti.
Mi sono imbattuto in questo post per trovare una soluzione migliore di quella che ho scritto qualche tempo fa, con la speranza di trovare forse una funzionalità nativa o qualcosa di simile.
Condividerò la mia soluzione, fino a quando non verrà implementata una migliore. Funziona con la maggior parte dei browser moderni, forse anche con quelli meno recenti, non ci ha provato.
Tutte le soluzioni di cui sopra, si basano sul fatto che deve essere iniettato con tag SCRIPT predefinito e ben marcato e si basano completamente sull'implementazione HTML. Ma cosa succede se lo script viene iniettato in modo dinamico, o peggio ancora, e se si scrive una libreria, che verrà utilizzata in una varietà di siti Web?
In questi e in altri casi, tutte le risposte di cui sopra non sono sufficienti e diventano persino troppo complicate.
Innanzitutto, proviamo a capire cosa dobbiamo raggiungere qui. Tutto quello che dobbiamo fare è ottenere l'URL dello script stesso, da lì è un gioco da ragazzi.
In realtà c'è un bel trucco per ottenere l'URL dello script dallo script stesso. Una delle funzionalità della Error
classe nativa è la possibilità di fornire una traccia dello stack della "posizione problematica", inclusa la traccia esatta del file all'ultima chiamata. Per raggiungere questo obiettivo, userò la proprietà dello stack dell'istanza Error, che una volta creata fornirà la traccia dello stack completa.
Ecco come funziona la magia:
// 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.`);
}
}
Ora, in ogni caso di chiamata di script, come nel caso OP:
<script type="text/javascript" src="file.js?obj1=somevalue&obj2=someothervalue"></script>
Nello file.js
script ora puoi fare:
const params = getFileParams();
console.log(params.get('obj2'));
// Prints: someothervalue
Questo funzionerà anche con RequireJS e altri script di file iniettati dinamicamente.