在Javascript中有没有办法知道脚本加载自哪个主机?

12
在JavaScript中,作为从某个主机加载的脚本,有没有办法知道我被加载的服务器/主机是哪个?我需要向该主机进行额外的Ajax请求,并希望动态地找出主机。
因此,如果您在页面上包含一个JavaScript文件。
<script src="http://somehost.com/js/test.js"></script>

当JavaScript在test.js中执行时...

var host_loaded_from = ??? // should be somehost.com 

谢谢


+1 好问题,很想看看是否可以使用JS实现。 - Mikey1980
5个回答

12
是的,这是可能的,除非使用deferasync属性异步加载脚本,因为在这种情况下,DOM中的最后一个脚本不一定是当前正在执行的脚本。请参阅@kangax的评论以了解更多信息。
此外,最近有人发表了同样的问题
在test.js中,获取最后一个脚本元素,它将是当前正在解析的脚本(在您的情况下是test.js),并获取其src
// test.js
var scripts = document.getElementsByTagName('script');
var src = scripts[scripts.length - 1].src;

找到 src 后,使用正则表达式解析主机。

src.match(new RegExp('https?://[^/]*'))
["http://somehost.com"] // for your example

最后一个脚本元素不一定是当前正在执行的元素(考虑“defer”和“async”属性),因此这种方法不可靠。 - kangax
@kangax - 以上说法是否正确,除非使用了 deferasync 属性? - Anurag
2
是的,我认为是这样的。当前的HTML5规范 - 大部分应该反映真实浏览器的行为 - 表示:“如果两个属性都不存在(即“defer”和“async”),则脚本会立即获取并执行,然后用户代理程序继续解析页面。”因此,当前执行的脚本实际上应该是文档中的最后一个脚本元素(因为解析无法继续,直到执行完成)。 - kangax
为什么不直接在脚本标签中添加一个id属性,然后使用document.getElementById('the-script-id')来获取脚本元素呢? - ovi

1

脚本是否知道自己的文件名?(在 OP 问题中是“test.js”)

如果这样,您的脚本可以查询所有带有 src 属性的脚本标签的 DOM,但是您需要注意两个具有相同文件名并从不同服务器加载的脚本。例如:

<script src="http://somehost.com/js/test.js"></script>
<script src="http://somehost_number2.com/js/test.js"></script>

这是寻找元素中所有脚本标签的JS代码:
var scripts = el.getElementsByTagName('SCRIPT');

0

不确定 JavaScript 是否能够完成此操作。如果脚本位于 PHP 文件中,请按照以下方式执行:

...
var host_loaded_from = <?php echo $_SERVER[SERVER_NAME] ?>
...

在我的网站上,我使用PHP来包含我的JS脚本,只是为了这个原因。我很想知道是否有更好的方法。

0

不好意思,不行。

如果 <script> 有一个 id,那也许可以。但你不能真正依赖它。


0
由于同源策略,您只能向加载HTML页面(文档)的来源(主机+协议+端口)发出AJAX请求,这不一定与加载js的来源相同。
您可以使用window.location.hostnamedocument.location.hostname来查找文档的主机名。

请记住,虽然 Ajax 调用有限制,但 JavaScript 脚本可以从任何域加载其他脚本、数据(使用 JSONP)、图像等。同源策略是关于直接的 Ajax 调用。 - Larry K
1
@Larry:是的,但OP特别询问了Ajax调用。(JSONP不是Ajax。) - Chris Lercher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接