虽然这个问题已经被问过一段时间了,但到今天它仍然是相关的。这不是使用脚本文件参数的简单方法,但我已经有一些极端用例最适合这种方法。
我发现这篇文章是为了找到一个比我前一段时间写的更好的解决方案,希望能找到一个原生功能或类似的东西。
我将分享我的解决方案,直到实施更好的解决方案。这适用于大多数现代浏览器,甚至可能适用于较旧的浏览器,但没有尝试过。
上述所有解决方案都基于这样一个事实,即它必须注入预定义且标记良好的 SCRIPT 标签,并且完全依赖于 HTML 实现。但是,如果脚本是动态注入的,或者更糟糕的是,如果你正在编写一个库,它将被用于各种网站怎么办?
在这些和其他一些情况下,上述所有答案都不够充分,甚至变得过于复杂。
首先,让我们尝试了解我们需要在这里实现什么。我们需要做的就是获取脚本本身的 URL,从那里它是小菜一碟。
实际上有一个很好的技巧可以从脚本本身获取脚本 URL。本机类的功能之一Error
是能够提供“有问题的位置”的堆栈跟踪,包括到最后一次调用的确切文件跟踪。为了实现这一点,我将使用 Error 实例的 stack 属性,该属性一旦创建,就会提供完整的堆栈跟踪。
以下是魔术的工作原理:
// 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和其他动态注入的文件脚本。