【问题标题】:Figuring out the base URL where JS script was loaded from within a script找出从脚本中加载 JS 脚本的基本 URL
【发布时间】:2019-09-26 04:53:11
【问题描述】:

假设我的 HTML 页面中包含一个 JS 脚本http://app.example.com

<script src="http://app.foo.com/script.js"></script>

<script src="http://app.bar.com/script.js"></script>

这是相同版本的 JS,但来自不同的域。 实际上它是同一个脚本,想知道它是从哪里加载的。

所以基本上我希望 script.js 有代码:

// 'app.foo.com' or 'app.bar.com' returned depending where it was loaded from
let baseUrl = somehowGetTheBaseUrlWhereImHostedAt();

附:实际上,我要解决的问题是 JS 脚本会从 app.foo.com/iframe.html 加载(插入 DOM)一个 iframe,如果它来自 app.foo.com 或 app.bar.com/iframe .html 如果它来自 app.bar.com

【问题讨论】:

  • 文件名是预先确定的且唯一的吗?
  • 哪个文件? iframe.html 和 script.js 在所有环境中都是独一无二的

标签: javascript html


【解决方案1】:

iframe.html 和 script.js 在所有环境中都是独一无二的

假设script.js 文件名是预先确定的且唯一的,我们可以搜索导入给定脚本的脚本标签。然后从 script 标签中获取完整的源 URL。

注意:在下面的示例中,我使用 jquery 只是因为它在 SO 沙箱中可用。

const fileName = 'jquery.min.js';

// src$="foo" is equivalent to "where the value of the src field ends with 'foo' "
const $script = document.querySelector(`script[src$="${fileName}"]`);
const scriptSrc = $script.src;

console.log(scriptSrc);
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 他们还可以在他们的 SCRIPT 标签中添加一个 ID,然后使用 ID 作为查询选择器来拉取路径。这将允许文件名不被设置为变量。只是一种替代解决方案。
  • @HBlackorby 假设 OP 正在使用脚本。消费者可能是其他开发人员。在那种情况下,需要脚本有一个 ID 可能很难传达。
  • @HBlackorby 同样,如果您要说服开发人员将 ID 添加到脚本标签,那么您不妨要求他们添加一个 data-origin 标签,告诉脚本从哪里加载它并完全绕过这个问题。
  • 他说这是他的 HTML 页面,所以我假设他编写/可以更新 HTML。如果没有,那么您的解决方案也很有效。
  • 谢谢大家,如果这是唯一的解决方案(我实际上希望有一个更优雅的解决方案),那就没问题了。
猜你喜欢
  • 2012-02-18
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多