从另一个域名获取Javascript域名

4
我正在编写一个可以跨域工作的脚本。我尝试包含来自另一个域的一个脚本,然后让该脚本包含来自同一域的其他脚本。
例如:域1 - www.mydomain.com
<html>
    <head>
       <script type="text/javascript" src="http://www.example.com/app.js"></script>
    </head>
</html>

示例应用程序 JS

var imported = document.createElement('script');
imported.src = window.location.host + 'config.js';
document.head.appendChild(imported);

var imported = document.createElement('script');
imported.src = window.location.host + 'stuff.js';
document.head.appendChild(imported);

问题在于window.location.host返回的是脚本下载到的域名,比如www.mydomain.com。我需要的是脚本当前所在的域名,例如www.example.com。
这个能实现吗?请不要使用JQuery。

window 指的是当前脚本所在的页面。您需要使服务器动态地在 JavaScript 文件中打印主机的 URL,并以这种方式提供服务。 - Ian
基本上,您需要在页面中查找src-string并解析实际域。也许这可以帮助您?-> http://stackoverflow.com/questions/6146632/get-domain-of-javascript-file - GNi33
可能是重复的问题:在动态加载时获取当前执行的js文件的url - Bergi
3个回答

3
你可以尝试这个。
if (document.currentScript && document.currentScript.src) {
    var uri = new URL(document.currentScript.src);
    includeJsFile(uri.origin + '/static/script.js');
}

请注意,document.currentScript在IE浏览器上无法使用。 https://caniuse.com/#search=document.currentScript

-1

再次阅读您的问题后,我想简单地问一下:

为什么不相对于那个JS这样做呢?比如:

imported.src = 'config.js';

它将导入config.js,这应该是app.js的兄弟文件。

关于评论,我很抱歉犯了错误,没有理解问题。


没有 Jquery,只有 Javascript - Devin Dixon
1
这并不真正与实际问题相关。 - GNi33

-1

这里有一种适用于新版浏览器的替代方法,即使是由DOM添加器注入的脚本,有时也不是getElementsByTagName("script")集合中的最后一个脚本:

(function(){ // script filename setter, leaves window.__filename set with active script URL.
if(self.attachEvent){
 function fn(e,u){self.__filename=u;}
 attachEvent("onerror",fn);
 setTimeout(function(){detachEvent("onerror", fn)},20);
 eval("gehjkrgh3489c()");
}else{
 Object.defineProperty( window, "__filename", { configurable: true, get:function __filename(){
   try{document.s0m3741ng()}catch(y){
    return "http://" + 
     String(y.fileName || y.file || y.stack || y + '')
     .split(/:\d+:\d+/)[0].split("http://")[1];
    } 
 }})//end __filename
}//end if old IE?
}());

更新:增加了更全面的支持: 在IE9(s+q),IE9作为IE8(s+q),FF,Ch中进行了测试。
我不知道还有什么其他的方法,除了手动嗅探脚本标记.SRC以匹配硬编码字符串,呕吐。
快速演示:http://danml.com/pub/getfilenamedemo2.html 链接脚本:http://danml.com/js/filename2.js

这是一个好主意,但似乎在任何东西上都不起作用。我刚刚尝试了旧版IE(甚至是IE 9)- fileNamefilestack没有定义(像你警告的那样,除了IE 9)。我在Chrome(和IE 10)中尝试了一下,只有stack被定义了,但是URL的检索不起作用。而在Firefox中,所有3个都被定义了,但检索不起作用。我想知道我是否做错了什么... - Ian
@ian:你是从外部脚本调用它吗? - dandavis
是的,它在一个 test.js 文件中。我想知道外部文件是否在同一项目/域中是否重要。 - Ian
我刚刚从我的桌面验证了 <script src="http://danml.com/js/filename.js"></script><script>alert(__filename);</script>(修复了注释重排的标签)。 - dandavis
尝试使用http://danml.com/pub/getfilenamedemo.html。在CH + FF中对我有效,但你关于IE9是正确的,可恶。也许还有其他属性我可以找到。感谢提醒。 - dandavis
显示剩余2条评论

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