2010-08-26 35 views
9

在JavaScript中,作为从somer主机加载的脚本,有什么方法可以知道我从哪个服务器/主机加载?我需要向该主机发出额外的Ajax请求,并且希望动态地找出主机。用Javascript以任何方式知道主机脚本是从哪里加载的?

所以,如果你有一个页面

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

上的JavaScript文件时的JavaScript执行,test.js内...

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

感谢

+0

+1好的问题,希望看到是否有可能使用JS – Mikey1980 2010-08-26 20:02:40

回答

11

有没有什么办法可以知道服务器/主机是我是从加载的?当脚本使用,因为在DOM中的最后一个脚本deferasync属性可能不一定是在这种情况下,当前正在执行脚本异步加载

是的,这是可能的除了。有关更多信息,请参阅@kangax的评论。

此外,same question最近发布。

在你的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 
+0

最后一个脚本元素不一定是一个尽管目前正在执行(认为是“推迟”和“异步”属性),所以这种方法不可靠。 – kangax 2010-08-26 20:28:41

+0

@ kangax - 是否正确地说,除了使用'defer'或'async'属性时,上述内容将起作用? – Anurag 2010-08-26 20:35:09

+2

是的,我认为是。目前的HTML5规范 - 大多数情况下,它应该反映真实的浏览器行为 - 说:“如果两个属性都不存在(意思是”延迟“和”异步“),那么在用户代理继续之前立即获取并执行脚本解析页面“。所以当前执行的脚本实际上应该是文档中的最后一个脚本元素(因为解析无法继续直到执行完成)。 – kangax 2010-08-26 20:46:11

0

不,对不起。

如果<script>有一个ID,那么也许。但是你不能真的依靠这个。

0

不确定这是否可以用JavaScript来完成。如果脚本是一个PHP文件中做这样的:

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

在我的地盘我包括我的JS脚本中使用PHP只是出于这个原因。我很想看看有没有更好的方法。

0

由于同源策略,您可以仅向源(主机+协议+端口)发送AJAX请求,HTML页面(文档)已加载 - 这不一定与您的js加载的源相同从。

您可以使用window.location.hostnamedocument.location.hostname找出文档的主机名。

+0

请记住,虽然Ajax调用有限,但JavaScript脚本可以从任何域加载其他脚本,数据(使用JSONP),图像等。同源策略是关于直接的Ajax调用。 – 2010-08-26 20:04:31

+1

@Larry:是的,但是OP在询问Ajax调用。 (JSONP不是Ajax。) – 2010-08-26 20:05:27

0

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

如果是这样,您的脚本可以查询dom中所有脚本标记,查找具有src属性的脚本标记。但是,您需要注意两个脚本使用不同服务器加载的相同文件名。例如

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

这里的JS,看起来所有在EL脚本标签:

var scripts = el.getElementsByTagName('SCRIPT'); 
相关问题