Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Javascript知道从哪个主机加载脚本吗?_Javascript - Fatal编程技术网

用Javascript知道从哪个主机加载脚本吗?

用Javascript知道从哪个主机加载脚本吗?,javascript,Javascript,在javascript中,作为从somer主机加载的脚本,有没有办法知道我是从哪个服务器/主机加载的?我需要向该主机发出额外的ajax请求,并且更愿意动态地确定主机 因此,如果在页面上包含javascript文件 <script src="http://somehost.com/js/test.js"></script> 谢谢不,对不起 如果有id,那么可能。但你不能真的相信这一点 有没有办法知道是从哪个服务器/主机I加载的 是的,除了使用defer或async属性异步

在javascript中,作为从somer主机加载的脚本,有没有办法知道我是从哪个服务器/主机加载的?我需要向该主机发出额外的ajax请求,并且更愿意动态地确定主机

因此,如果在页面上包含javascript文件

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

不,对不起

如果
有id,那么可能。但你不能真的相信这一点

有没有办法知道是从哪个服务器/主机I加载的

是的,除了使用
defer
async
属性异步加载脚本时,可以,因为在这种情况下,DOM中的最后一个脚本不一定是当前正在执行的脚本。有关更多信息,请参见@kangax的评论

而且,这是最近发布的

在test.js中,获取最后一个脚本元素,该元素将是当前正在解析的脚本(在您的示例中为test.js),并获取其
src

// test.js
var scripts = document.getElementsByTagName('script');
var src = scripts[scripts.length - 1].src;
找到一个
src
,使用regex解析主机

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

不确定是否可以用JavaScript实现。如果脚本位于PHP文件中,请执行以下操作:

...
var host_loaded_from = <?php echo $_SERVER[SERVER_NAME] ?>
...
。。。
var主机\u已从中加载\u=
...

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

由于同源策略,您只能向源站(主机+协议+端口)发出AJAX请求,HTML页面(文档)是从该源站加载的,但不一定与js的加载源站相同


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

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

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

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

+一个很好的问题,想看看是否可以使用JSONP。记住,当Ajax调用有限时,Javascript脚本可以从任何域加载额外的脚本、数据(使用JSONP)、图像等。同源策略是关于直接Ajax调用的。@Larry:是的,但OP是专门询问Ajax调用的。(JSONP不是Ajax。)但最后一个脚本元素不一定是当前正在执行的元素(想想“延迟”和“异步”属性),所以这种方法不可靠。@kangax-如果使用
defer
async
属性,上面的说法是否正确?是的,我想是这样。当前的HTML5规范(在很大程度上应该反映真实的浏览器行为)说:“如果两个属性都不存在(意思是“延迟”和“异步”),那么在用户代理继续解析页面之前,脚本将被立即获取并执行。”因此,当前执行的脚本实际上应该是文档中的最后一个脚本元素(因为解析在执行完成之前无法继续)。为什么不简单地向脚本标记添加一个
id
属性,并使用
document.getElementById('the-script-id')
来获取脚本元素呢?
<script src="http://somehost.com/js/test.js"></script>
<script src="http://somehost_number2.com/js/test.js"></script>
var scripts = el.getElementsByTagName('SCRIPT');