Javascript 如何从该脚本中获取脚本文件名?
我很确定答案是否定的,但我想我还是会问 如果我的站点引用了一个名为“whater.js”的脚本,是否可以从该脚本中获取“whater.js”?比如: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
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如果找到解决方案,我会看一看并更新答案。@MaMazavarguments.callee.name
如果函数被定义为函数表达式,则将不起作用。我认为全面解决方案将使用scriptName
替换arguments.callee.name
,其中scriptName
是var scriptName=arguments.callee.name | |“getScriptName”
。当然,如果函数表达式分配给普通变量,则缩小会更改变量名称,因此必须将函数分配给对象键才能实现此功能。与答案没有直接关系,但著名的函数尚未监视document.currentScript
。但是出现了一个问题。要使此功能出现在caniuse.com上,您可以投票:。我喜欢这在async
脚本中也很有用,与其他一些答案不同。不幸的是,如果在偶数中调用currentScript