Хотя этот вопрос был задан некоторое время назад, он все еще актуален на сегодняшний день. Это не тривиальный подход с использованием параметров файла сценария, но у меня уже было несколько крайних вариантов использования, которые наиболее подходили для этого способа.
Я наткнулся на этот пост, чтобы найти лучшее решение, чем писал некоторое время назад, с надеждой найти, возможно, нативную функцию или что-то подобное.
Я поделюсь своим решением, пока не будет реализовано лучшее. Это работает на большинстве современных браузеров, может быть, даже на старых, не пробовал.
Все решения, приведенные выше, основаны на том факте, что он должен быть внедрен с предопределенным и хорошо маркированным тегом SCRIPT и полностью полагаться на реализацию HTML. Но что, если скрипт внедряется динамически или, что еще хуже, что, если вы напишите библиотеку, которая будет использоваться на различных веб-сайтах?
В этих и некоторых других случаях все приведенные выше ответы являются недостаточными и даже становятся слишком сложными.
Во-первых, давайте попробуем понять, чего нам нужно достичь здесь. Все, что нам нужно сделать, это получить URL-адрес самого скрипта, оттуда это будет просто.
На самом деле есть хороший трюк, чтобы получить URL скрипта от самого скрипта. Одной из функциональных возможностей нативного Error
класса является возможность обеспечения трассировки стека «проблемного местоположения», включая точную трассировку файла до последнего вызова. Чтобы добиться этого, я буду использовать свойство стека экземпляра Error, который после создания даст полную трассировку стека.
Вот как работает магия:
// 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.`);
}
}
Теперь в любом случае вызова скрипта, как в случае с OP:
<script type="text/javascript" src="file.js?obj1=somevalue&obj2=someothervalue"></script>
В file.js
скрипте теперь вы можете сделать:
const params = getFileParams();
console.log(params.get('obj2'));
// Prints: someothervalue
Это также будет работать с RequireJS и другими динамически внедренными файловыми сценариями.