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

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

更新:通过DOM访问脚本元素已经有一个包含完整的URL一个src属性。我不知道该怎么无处不/标准是,但你也可以用getAttribute("src")将返回任何原始属性值是在[X] HTML。

有帮助吗?

解决方案

将这个在需要知道这是自己的URL js文件。

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

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

    if (script.getAttribute.length !== undefined) {
        return script.src
    }

    return script.getAttribute('src', -1)
}());

或者 的正如它出现在来源(例如/js/main.js):

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

    if (script.getAttribute.length !== undefined) {
        return script.getAttribute('src')
    }

    return script.getAttribute('src', 2)
}());

请参阅 http://www.glennjones.net/Post/809/getAttributehrefbug.htm ,在getAttribute参数的解释被使用(它是一个IE的bug)。

其他提示

有关最新的浏览器,你可以使用document.currentScript得到这个信息。

var mySource = document.currentScript.src;

的好处是,它是被异步加载脚本更可靠。缺点是,它不是,尽我所知,普遍支持。它应在Chrome工作> = 29,火狐> = 4,歌剧> = 16如同许多有用的东西,它似乎没有在IE工作。

当我需要获得一个脚本路径,我检查,看看是否document.currentScript被定义,并且,如果没有,在使用接受的答案中描述的方法。

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

https://developer.mozilla.org/en-美国/文档/网络/ API / document.currentScript

<强>正如它出现在来源(例如/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('/'))+"/";

与它jquery插件模板: https://github.com/mkdgs/mkdgs -snippet /斑点/主/ JavaScript的/ jquery.plugins.template.js

请注意:这不会有)由jQuery.getScript(加载本地脚本工作,因为没有添加到DOM没有脚本标签。该脚本仅在全球空间分析。 http://api.jquery.com/jQuery.getScript/

要解决它,你可以这样做:

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);
                }
          }
     });
}

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

如果您在服务器上编写代码,你很可能只是填充DIV /隐藏字段/与完全解析URL的脚本(此处插入你最喜欢的HTML元素),并挑选了在客户方您的JavaScript

您可能想看看 HTTPS://addons.mozilla .ORG / EN-US / firefox的,如果你有兴趣学习/插件/ 10345 这是你无法控制的网页上执行的函数(文件,因此)。

如果您有兴趣搞清楚其中的的脚本执行时,则有多种方式。随着Firebug的,你可以console.log()的信息。即使只是把警示语句在代码中(而恼人)可以帮助调试在低技术的方式。你也可以抛出错误,把他们捉住,然后使用错误的性质过程(参见:的 https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error

然而,这究竟是为什么很重要?如果脚本导致错误已经那么它是很容易确定在错误发生。如果它不是在所有的错误,那么什么是在知道其优势的文件的它来自哪里?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top