我很确定答案是否定的,但我想我还是会问。
如果我的网站引用了一个名为“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.");
}
可能比依赖检查更值得麻烦,但是到底是怎么回事。
答案 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
答案 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之外的所有浏览器都支持
确保它在文件被解析和执行时运行,而不是在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 的方向是正确的,但比较不完整。