我如何从该脚本中获取脚本文件名?

时间:2009-04-02 18:16:58

标签: javascript html

我很确定答案是否定的,但我想我还是会问。

如果我的网站引用了一个名为“whatever.js”的脚本,是否可以从该脚本中获取“whatever.js”?像:

var scriptName = ???

if (typeof jQuery !== "function") {
    throw new Error(
        "jQuery's script needs to be loaded before " + 
        scriptName + ". Check the <script> tag order.");
}

可能比依赖检查更值得麻烦,但是到底是怎么回事。

12 个答案:

答案 0 :(得分:33)

var scripts = document.getElementsByTagName('script');
var lastScript = scripts[scripts.length-1];
var scriptName = lastScript.src;
alert("loading: " + scriptName);

测试:FF 3.0.8,Chrome 1.0.154.53,IE6


另见:How may I reference the script tag that loaded the currently-executing script?

答案 1 :(得分:18)

我知道这已经过时了,但我已经开发出了更好的解决方案,因为以上所有内容都不适用于异步脚本。通过一些调整,以下脚本可以涵盖几乎所有用例。什么对我有用:

function getScriptName() {
    var error = new Error()
      , source
      , lastStackFrameRegex = new RegExp(/.+\/(.*?):\d+(:\d+)*$/)
      , currentStackFrameRegex = new RegExp(/getScriptName \(.+\/(.*):\d+:\d+\)/);

    if((source = lastStackFrameRegex.exec(error.stack.trim())) && source[1] != "")
        return source[1];
    else if((source = currentStackFrameRegex.exec(error.stack.trim())))
        return source[1];
    else if(error.fileName != undefined)
        return error.fileName;
}

不确定Internet Explorer上的支持,但在我测试过的每个其他浏览器中都能正常工作。

答案 2 :(得分:11)

你可以使用......

var scripts = document.getElementsByTagName("script"),
  currentScriptUrl = (document.currentScript || scripts[scripts.length - 1]).src;
除IE之外的所有浏览器都支持

currentScript()

确保它在文件被解析和执行时运行,而不是在DOM就绪或window加载时运行。

如果它是空字符串,则您的script块没有空src属性。

答案 3 :(得分:5)

我会留下这个以防万一:

obj

答案 4 :(得分:4)

Shog9的建议更短:

alert("loading: " + document.scripts[document.scripts.length-1].src);

答案 5 :(得分:3)

您可以在页面中返回脚本元素列表:

var scripts = document.getElementsByTagName("script");

然后评估每个并检索其位置:

var location;

for(var i=0; i<scripts.length;++i) {
   location = scripts[i].src;

   //Do stuff with the script location here
}

答案 6 :(得分:2)

由于“src”属性包含脚本文件的完整路径,因此您可以添加子字符串调用以仅获取文件名。

var path = document.scripts[document.scripts.length-1].src;

var fileName = path.substring(path.lastIndexOf('/')+1);

答案 7 :(得分:1)

当调用代码包含在.html文件中时,我在解析脚本名称时遇到上述代码问题。 因此我开发了这个解决方案:

var scripts = document.getElementsByTagName( "script" ) ;
var currentScriptUrl = ( document.currentScript || scripts[scripts.length - 1] ).src ;
var scriptName = currentScriptUrl.length > 0 ? currentScriptUrl : scripts[scripts.length-1].baseURI.split( "/" ).pop() ; 

答案 8 :(得分:1)

您可以尝试将其放在JavaScript文件的顶部:

window.myJSFilename = "";
window.onerror = function(message, url, line) {
    if (window.myJSFilename != "") return;
    window.myJSFilename =  url;
}
throw 1;

确保您只有此功能。 myJSFilename变量将包含JavaScript文件的完整路径,可以从中解析文件名。在IE11中测试过,但它应该可以在其他地方使用。

答案 9 :(得分:0)

如果jQuery脚本不存在会发生什么?你刚要输出一条消息吗?我想如果出现问题,调试稍微好一些,但对用户来说这没什么用。

我会说你只是设计你的页面以便不会发生这种情况,并且在极少数情况下它会发生,只是让脚本失败。

答案 10 :(得分:0)

如果你不想使用jQuery:

function getCurrentFile() {
    var filename = document.location.href;
    var tail = (filename.indexOf(".", (filename.indexOf(".org") + 1)) == -1) ? filename.length : filename.lastIndexOf(".");
    return (filename.lastIndexOf("/") >= (filename.length - 1)) ? (filename.substring(filename.substring(0, filename.length - 2).lastIndexOf("/") + 1, filename.lastIndexOf("/"))).toLowerCase() : (filename.substring(filename.lastIndexOf("/") + 1, tail)).toLowerCase();
}

答案 11 :(得分:0)

唯一防水的方法:

var code = this.__proto__.constructor.toString();
$("script").each(function (index, element) {
    var src = $(element).attr("src");
    if (src !== undefined) {
        $.get(src, function (data) {
            if (data.trim() === code) {
                scriptdir = src.substring(0, src.lastIndexOf("/"));
            }
        });
    }
});

"var code" 也可以是函数名,但是使用原型构造函数你不需要修改任何东西。此代码将其自己的内容与所有现有脚本进行比较。不再需要硬编码的文件名。 Korporal Nobbs 的方向是正确的,但比较不完整。