Javascript 我的脚本src URL是什么?

Javascript 我的脚本src URL是什么?,javascript,dom,absolute-path,src,Javascript,Dom,Absolute Path,Src,是否有一种简单可靠的方法来确定当前正在执行的JavaScript文件(在网页内)的URL 我唯一的想法是扫描DOM中的所有脚本src属性,找到当前文件是如何被引用的,然后将其应用于document.location,计算出绝对URL。任何人都有其他想法,有没有我完全忽略的超级简单的方法 更新:通过DOM访问的脚本元素已经有一个包含完整URL的src属性。我不知道这是多么普遍/标准,但您也可以使用getAttribute(“src”),它将返回[X]HTML中的任何原始属性值。如果这是一个严格的客

是否有一种简单可靠的方法来确定当前正在执行的JavaScript文件(在网页内)的URL

我唯一的想法是扫描DOM中的所有脚本
src
属性,找到当前文件是如何被引用的,然后将其应用于
document.location
,计算出绝对URL。任何人都有其他想法,有没有我完全忽略的超级简单的方法


更新:通过DOM访问的脚本元素已经有一个包含完整URL的
src
属性。我不知道这是多么普遍/标准,但您也可以使用
getAttribute(“src”)
,它将返回[X]HTML中的任何原始属性值。

如果这是一个严格的客户端解决方案,您的解决方案听起来不错


如果您在服务器上编写代码,您可能只需使用脚本的完全解析URL填充一个div/hidden字段/(在此处插入您最喜欢的HTML元素),然后在客户端使用javascript获取它。

您可能想看看是否有兴趣了解哪些函数(以及哪些文件)正在您无法控制的页面上执行

如果您想知道哪些脚本正在执行,那么有很多方法。使用Firebug,您可以
console.log()
。即使只是在代码中添加警告语句(虽然很烦人),也可以帮助以低技术的方式进行调试。您还可以引发错误并捕获它们,然后使用错误的属性进行处理(请参阅:)


然而,为什么这很重要?如果脚本已经导致错误,那么很容易确定错误发生的位置。如果这根本不是关于错误,那么知道它来自哪个文件有什么好处呢?

把它放在需要知道它自己的url的js文件中

完全合格(例如
http://www.example.com/js/main.js
):

如源代码中所示(例如
/js/main.js
):


有关所使用的
getAttribute
参数的说明(这是一个IE错误)。

如源代码中所示(例如
/js/main.js
),这是跨浏览器的

var scriptSource = (function() 
{ 
    var scripts = document.getElementsByTagName('script'), 
        script = scripts[scripts.length - 1]; 

    //No need to perform the same test we do for the Fully Qualified
    return script.getAttribute('src', 2); //this works in all browser even in FF/Chrome/Safari
}()); 

完全合格(例如
http://www.example.com/js/main.js
):


经过一些测试后,似乎很难通过跨浏览器的方式获得完全合格的。在IE8中无法获得完全限定的,即使它在IE7中也可以

此方法适用于延迟、异步和延迟加载 因为您知道脚本的文件名,并且它是否唯一

/* see  
 * http://stackoverflow.com/questions/984510/what-is-my-script-src-url/984656#984656
 * http://www.glennjones.net/Post/809/getAttributehrefbug.htm
 * 
 * iterate all script to find script with right filename
 * this work with async and defer (but your script MUST have a unique filemane)
 * mozilla support document.currentScript and we use it, if is set
 *
 * this will not work with local script loaded by jQuery.getScript(),
 * since there is no script tag added into the dom. the script is only evaluated in global space.
 * http://api.jquery.com/jQuery.getScript/
 *  
 * to fix this odd, you can add a reference in meta ( meta[name=srcipt][content=url] )
 * when you load the script
 */
var scriptFilename = 'jquery.plugins.template.js'; // don't forget to set the filename 
var scriptUrl = (function() {
    if (document.currentScript) { // support defer & async (mozilla only)
        return document.currentScript.src;
    } else {
        var ls,s;
        var getSrc = function (ls, attr) {
            var i, l = ls.length, nf, s;
            for (i = 0; i < l; i++) {
                s = null;
                if (ls[i].getAttribute.length !== undefined) { 
                    s = ls[i].getAttribute(attr, 2);                    
                }               
                if (!s) continue; // tag with no src
                nf = s;
                nf = nf.split('?')[0].split('/').pop(); // get script filename
                if (nf === scriptFilename) {
                    return s;
                }
            }
        };          
        ls = document.getElementsByTagName('script');
        s = getSrc(ls, 'src');
        if ( !s ) { // search reference of script loaded by jQuery.getScript() in meta[name=srcipt][content=url]
            ls = document.getElementsByTagName('meta');             
            s = getSrc(ls, 'content');
        }           
        if ( s ) return s;
    }
    return '';
})();

var scriptPath =  scriptUrl.substring(0, scriptUrl.lastIndexOf('/'))+"/";

对于最新的浏览器,可以使用document.currentScript获取此信息

var mySource = document.currentScript.src;
好处是它对于异步加载的脚本更可靠。缺点是,据我所知,它没有得到普遍支持。它应该可以在Chrome>=29、FireFox>=4、Opera>=16上运行。像许多有用的东西一样,它在IE中似乎不起作用

当需要获取脚本路径时,我会检查document.currentScript是否已定义,如果未定义,则使用接受答案中描述的方法

if (document.currentScript) {
    mySource = document.currentScript.src;
} else {
    // code omitted for brevity
}

在我当前的项目中,JavaScript资源文件固定在特定的子目录中。计算脚本的绝对URL可以告诉我本地基本目录是什么,这样我就可以将其剥离出来,得到文档“key”(服务器端已知)。它将用于生成表单、异步请求等,而不是用于调试。在这种情况下,您上面提出的是唯一真正可用的解决方案。对于完全限定的解决方案,您不能只使用script.src吗?为什么要使用script.getAttribute('src',-1)??答案很好。一个警告-如果该脚本是延迟加载的(由另一个脚本注入DOM),它将不会是DOM中的最后一个脚本,因此这个片段不会工作。它肯定不会与
标记(html5形式的延迟加载)一起工作,即使没有这些,它也不会在FF12上工作,所以我想最近的浏览器开始有意打破这一点,不是“应该打破”,而是“正在打破”;我看到了。默认情况下,如果javascripts异步加载,页面看起来会更快。它可能会破坏功能,是的,但在大多数情况下可能不会。这些竞争条件可以并且可以在最新的js引擎加载时识别和处理@MarcoDemaioI遇到过这样一个例子,这个算法不能可靠地工作。设置为async的其他脚本标记可以在请求的脚本和运行的脚本之间运行。这些脚本可以将其他脚本添加到DOM中,这些脚本显示在您的脚本之后。当你的脚本运行时,页面上的最后一个脚本不再是你的,并且返回错误的
src
。服务器端,他可以通过asp/php/jsp/cgi为js提供服务,并从那里以javascript输出url。@ZJR--我目前很喜欢“js槽”的想法,不管它是如何提供的;)由于ie11的存在,似乎没有一个防水的方法。查看此站点以获得一些比较以获得确切答案:尚未监视此功能。你可以在这里帮我投票:。@Stephan成功了!Chrome何时提供此功能?它在87中还不可用…?这里有趣地使用了
document.currentScript
。遗憾的是,浏览器支持信息在上不可用。您可以通过对已公开的问题进行投票来提供帮助:。我投了赞成票,但caniuse.com不是唯一的信息来源。
function loadScript(url,callback) {     

    if ( $('[src="'+url+'"]').length ) return true; // is already loaded    

    // make a reference of the loaded script
    if ( $('meta[content="'+url+'"]', $("head")).length ) return true; // is already loaded 
    var meta = document.createElement('meta');
    meta.content = url;
    meta.name = 'script';
    $("head").append(meta);

    return $.ajax({
          cache: true,
          url: u,
          dataType: 'script',
          async: false,
          success : function (script) {                     
                try { 
                    if ( typeof callback == 'function' ) callback();    
                } catch (error) { 
                    //console.log(error);
                }
          }
     });
}
var mySource = document.currentScript.src;
if (document.currentScript) {
    mySource = document.currentScript.src;
} else {
    // code omitted for brevity
}