Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从该脚本中获取脚本文件名?_Javascript_Html - Fatal编程技术网

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

Javascript 如何从该脚本中获取脚本文件名?,javascript,html,Javascript,Html,我很确定答案是否定的,但我想我还是会问 如果我的站点引用了一个名为“whater.js”的脚本,是否可以从该脚本中获取“whater.js”?比如: var scriptName = ??? if (typeof jQuery !== "function") { throw new Error( "jQuery's script needs to be loaded before " + scriptName + ". Check the <sc

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

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

var scriptName = ???

if (typeof jQuery !== "function") {
    throw new Error(
        "jQuery's script needs to be loaded before " + 
        scriptName + ". Check the <script> tag order.");
}
var scriptName=???
if(jQuery的类型!=“函数”){
抛出新错误(
“jQuery的脚本需要在”+
scriptName+”。检查标记顺序。“);
}
可能比依赖性检查更麻烦,但管它呢

var scripts = document.getElementsByTagName('script');
var lastScript = scripts[scripts.length-1];
var scriptName = lastScript.src;
alert("loading: " + scriptName);
在:FF 3.0.8、铬1.0.154.53、IE6中测试



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

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
}
var位置;

对于(var i=0;i如果jQuery脚本不存在,会发生什么?您只是要输出一条消息吗?我想如果出现问题,调试会稍微好一点,但对用户没有多大帮助

我想说的是,只要设计你的页面,这样就不会发生这种情况,在罕见的情况下,让脚本失败就行了。

你可以使用

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

确保它是在解析和执行文件时运行的,而不是在DOM就绪或
窗口上运行


如果是空字符串,则您的
脚本
块没有或没有空的
src
属性。

Shog9的建议更简短:

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

我知道这很旧,但我开发了一个更好的解决方案,因为以上所有内容都不适用于异步脚本。通过一些调整,以下脚本可以覆盖几乎所有的用例。以下是对我有效的方法:

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,但在我测试的其他浏览器中都可以正常工作。

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

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

var fileName = path.substring(path.lastIndexOf('/')+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() ; 

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

window.myJSFilename = "";
window.onerror = function(message, url, line) {
    if (window.myJSFilename != "") return;
    window.myJSFilename =  url;
}
throw 1;
确保只有下面的函数。myJSFilename变量将包含JavaScript文件的完整路径,文件名可以从中解析。在IE11中测试,但它应该在其他地方工作。

在Node.js中:

var abc = __filename.split(__dirname+"/").pop();

如果不想使用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();
}

唯一防水的方法是:

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代码”也可以是函数名,但使用原型构造函数,您无需修改任何内容。此代码将自己的内容与所有现有脚本进行比较。不再需要硬编码的文件名。
是的,我抛出了一个新的错误()和一条“include the script dumbass!”消息。我的感觉是这只是一个很好的实践。人们往往会对这样的事情松懈,因为它是一种动态语言。不过,这样我会睡得更好。额外的100字节对我来说是值得的。:)既然你要在文件的某个地方输入那一行,你就不能直接输入你要添加的文件名吗?是的,这很有效,除非文件名被更改。我可能是太迂腐了。呵呵,如果有人想提交“不大惊小怪”并获得几张选票,我会接受这个答案在每个脚本中指定“var scriptName=…”可能不是最好的主意。按照声明方式,scriptName是一个全局变量。如果使用闭包,效果会更好。这样做的另一个好处是,如果您想获得运行脚本的完整URL路径。并非所有的.js文件都与使用它们的html页面来自同一个域。边缘情况:如果在加载
后将当前脚本添加到
,并且
中有任何脚本,这将返回
中的最后一个脚本,不是
中当前正在运行的脚本。我遇到了一个这种算法不能可靠工作的情况。设置为async的其他脚本标记可以在请求的脚本和运行的脚本之间运行。这些脚本可以将其他脚本添加到DOM中,这些脚本显示在您的脚本之后。当您的脚本运行时,页面上的最后一个脚本不再是您的脚本,并返回错误的
src
。此答案已严重过时。脚本可以是延迟的、异步的、模块的、工作的。这个答案在他们中都不起作用。我觉得像
文档。这里应该提到currentScript
,但像@gman说的,这个答案总体上已经过时了,算法没有涵盖很多边缘情况。谢谢!正是我要找的!有趣的是,有时在python或Java代码中会出现错误堆栈的相同方法。谢谢!这是一个很好的方法,因为它也适用于网络工作者。但是,它在缩小后失败,因为该函数不再被调用getScriptName。解决方案是将currentStackFrameRegex表达式替换为:new RegExp(arguments.callee.name++'\(.++\/(.*):\\d+:\\d++')非常好的解决方案,遗憾的是它在IE10上不起作用-:(@Psychood如果找到解决方案,我会看一看并更新答案。@MaMazav
arguments.callee.name
如果函数被定义为函数表达式,则将不起作用。我认为全面解决方案将使用
scriptName
替换
arguments.callee.name
,其中
scriptName
var scriptName=arguments.callee.name | |“getScriptName”
。当然,如果函数表达式分配给普通变量,则缩小会更改变量名称,因此必须将函数分配给对象键才能实现此功能。与答案没有直接关系,但著名的函数尚未监视
document.currentScript
。但是出现了一个问题。要使此功能出现在caniuse.com上,您可以投票:。我喜欢这在
async
脚本中也很有用,与其他一些答案不同。不幸的是,如果在偶数中调用
currentScript