如何获取当前正在执行的javascript代码的文件路径
我正在尝试做一些类似于C如何获取当前正在执行的javascript代码的文件路径,javascript,include,absolute-path,src,Javascript,Include,Absolute Path,Src,我正在尝试做一些类似于C#include“filename.C”,或者PHPinclude(dirname(uu FILE).“filename.PHP”)但使用javascript。我知道,如果我可以获取加载js文件的URL(例如,标签的src属性中给出的URL),我就可以做到这一点。javascript有没有办法知道这一点 或者,有没有什么好方法可以从同一个域动态加载javascript(不知道具体的域)?例如,假设我们有两个相同的服务器(QA和production),但它们显然有不同的UR
#include“filename.C”
,或者PHPinclude(dirname(uu FILE).“filename.PHP”)
但使用javascript。我知道,如果我可以获取加载js文件的URL(例如,标签的src属性中给出的URL),我就可以做到这一点。javascript有没有办法知道这一点
或者,有没有什么好方法可以从同一个域动态加载javascript(不知道具体的域)?例如,假设我们有两个相同的服务器(QA和production),但它们显然有不同的URL域。有没有一种方法可以像include(“myLib.js”)代码>myLib.js将从加载它的文件的域中加载到哪里
抱歉,如果这有点让人困惑。我可能误解了您的问题,但似乎您应该能够使用相对路径,只要生产和开发服务器使用相同的路径结构
<script language="javascript" src="js/myLib.js" />
不管它是脚本、html文件(例如,一个框架)、css文件、图像等等,如果您不指定服务器/域,html文档的路径将是默认路径,因此您可以这样做,例如
或
如果不提供服务器/域,则路径将相对于页面路径或脚本中主文档路径的脚本:
var scripts = document.getElementsByTagName("script"),
src = scripts[scripts.length-1].src;
这是因为浏览器按顺序加载和执行脚本,所以在执行脚本时,包含脚本的文档中的脚本元素肯定是页面上的最后一个元素。当然,这段代码必须是脚本的“全局”代码,所以请将src
保存到以后可以使用它的地方。通过将全局变量包装为以下内容,避免其泄漏:
(function() { ... })();
除了Internet Explorer(任何版本)之外的所有浏览器都有,它始终工作(无论文件是如何包含的(异步、bookmarklet等))
如果您想知道您现在所在的JS文件的完整URL:
var script = document.currentScript;
var fullUrl = script.src;
Tadaa。我最近发现了一种更简洁的方法,可以随时执行,而不是在加载脚本时被迫同步执行
用于获取当前位置的堆栈跟踪,并从堆栈顶部抓取info.file
名称
info = stackinfo()
console.log('This is the url of the script '+info[0].file)
如果文档中有内联脚本,则此处接受的答案无效。为了避免这种情况,您可以使用以下命令仅针对具有[src]
属性的
标记
/**
* Current Script Path
*
* Get the dir path to the currently executing script file
* which is always the last one in the scripts array with
* an [src] attr
*/
var currentScriptPath = function () {
var scripts = document.querySelectorAll( 'script[src]' );
var currentScript = scripts[ scripts.length - 1 ].src;
var currentScriptChunks = currentScript.split( '/' );
var currentScriptFile = currentScriptChunks[ currentScriptChunks.length - 1 ];
return currentScript.replace( currentScriptFile, '' );
}
这有效地捕获了最后一个外部.js文件,解决了我在使用内联js模板时遇到的一些问题。我编写了一个简单的函数,可以使用try/catch方法获取当前javascript文件的绝对位置
// Get script file location
// doesn't work for older browsers
var getScriptLocation = function() {
var fileName = "fileName";
var stack = "stack";
var stackTrace = "stacktrace";
var loc = null;
var matcher = function(stack, matchedLoc) { return loc = matchedLoc; };
try {
// Invalid code
0();
} catch (ex) {
if(fileName in ex) { // Firefox
loc = ex[fileName];
} else if(stackTrace in ex) { // Opera
ex[stackTrace].replace(/called from line \d+, column \d+ in (.*):/gm, matcher);
} else if(stack in ex) { // WebKit, Blink and IE10
ex[stack].replace(/at.*?\(?(\S+):\d+:\d+\)?$/g, matcher);
}
return loc;
}
};
你可以看到它。根据这里找到的答案,我得出以下结论:
//Thanks to https://stackoverflow.com/a/27369985/5175935
var getCurrentScript = function () {
if ( document.currentScript && ( document.currentScript.src !== '' ) )
return document.currentScript.src;
var scripts = document.getElementsByTagName( 'script' ),
str = scripts[scripts.length - 1].src;
if ( str !== '' )
return src;
//Thanks to https://stackoverflow.com/a/42594856/5175935
return new Error().stack.match(/(https?:[^:]*)/)[0];
};
//Thanks to https://stackoverflow.com/a/27369985/5175935
var getCurrentScriptPath = function () {
var script = getCurrentScript(),
path = script.substring( 0, script.lastIndexOf( '/' ) );
return path;
};
getCurrentScript.js
var getCurrentScript = function () {
if (document.currentScript) {
return document.currentScript.src;
} else {
var scripts = document.getElementsByTagName('script');
return scripts[scripts.length-1].src;
}
};
module.exports = getCurrentScript;
var getCurrentScript = require('./getCurrentScript');
var getCurrentScriptPath = function () {
var script = getCurrentScript();
var path = script.substring(0, script.lastIndexOf('/'));
return path;
};
module.exports = getCurrentScriptPath;
getCurrentScriptPath.js
var getCurrentScript = function () {
if (document.currentScript) {
return document.currentScript.src;
} else {
var scripts = document.getElementsByTagName('script');
return scripts[scripts.length-1].src;
}
};
module.exports = getCurrentScript;
var getCurrentScript = require('./getCurrentScript');
var getCurrentScriptPath = function () {
var script = getCurrentScript();
var path = script.substring(0, script.lastIndexOf('/'));
return path;
};
module.exports = getCurrentScriptPath;
顺便说一句:我正在使用
模块格式和绑定。我刚刚做了一个小把戏:
window.getRunningScript=()=>{
return()=>{
返回新错误()
}
}
✅ 适用于:Chrome、Firefox、Edge、Opera
享受吧根据此处找到的答案进行优化:
我得出了以下结论:
//Thanks to https://stackoverflow.com/a/27369985/5175935
var getCurrentScript = function () {
if ( document.currentScript && ( document.currentScript.src !== '' ) )
return document.currentScript.src;
var scripts = document.getElementsByTagName( 'script' ),
str = scripts[scripts.length - 1].src;
if ( str !== '' )
return src;
//Thanks to https://stackoverflow.com/a/42594856/5175935
return new Error().stack.match(/(https?:[^:]*)/)[0];
};
//Thanks to https://stackoverflow.com/a/27369985/5175935
var getCurrentScriptPath = function () {
var script = getCurrentScript(),
path = script.substring( 0, script.lastIndexOf( '/' ) );
return path;
};
问题是这个javascript库要加载到不同的域上。那么这是一个位于一个域上的js库文件,需要跨多个域拉入吗?或者这是一个驻留在多个域上的js文件,需要拉入与其源相关的其他js文件?你能举一个例子说明你想要完成什么吗?实际上两者都有。js文件将驻留在多个域中(QA vs production),并且它也将包含在多个域中(无论web应用程序需要使用库的是什么)。这可能是您试图解决的问题,但是,您能否将脚本的路径硬编码为一个变量,并使lib的开发版本和生产版本唯一的区别就是这一行?或者更简单地将某个内容作为指定其位置的get参数传递给单个脚本:?devel=truen这正是我试图避免的。我还试图避免使用GET参数,但这是一个非常有效的解决方案。我只是太懒了,不想在我们所有的Java Struts方面花太多时间这是一个很好的建议,只要脚本中的代码是“内联”运行的(即,如您所建议的,在全局上下文或“立即运行匿名方法”中运行,而不是在“稍后调用”函数或设置超时中运行)。您可以用这种方式在每个javascript中为当前文件/路径创建一个var。但是,要小心,“泄漏全局变量”不能通过我所称的立即运行anon方法来解决,(function(){…})()
-上面的示例仍然会创建一个名为src
的全局变量,因为它前面没有var
说明符这里有一个“src”的变量说明符(请参见第一行末尾的逗号)@INIFIENTESLOOP:在一个类似问题的类似答案中,他们建议返回脚本[scripts.length-1].getAttribute('src',1),请看这里的更多内容:@buley请看下面我最近的答案。使用stackinfo模块(github)从stacktrace获取文件名可能会对您有所帮助。如果由于各种原因,您的
标记不是最后一个标记,例如,如果您在
开始时通过JS动态注入该标记,则此操作不起作用。另见。为什么否决投票?考虑添加评论…无论如何,因为根据规则,你应该在答案中解释答案,而不仅仅是链接。如果这个链接消失了,那么你的答案就没有意义了。这太棒了,谢谢分享。此外,您还可以检查document.currentScript
,以防它被定义