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