如何获取当前正在执行的JavaScript代码的文件path

我试图做一些像C #include "filename.c" ,或PHP include(dirname(__FILE__)."filename.php")但在JavaScript中。 我知道我可以做到这一点,如果我可以得到一个JS文件加载的URL(例如标签的src属性中给出的URL)。 有什么办法可以让javascript知道吗?

或者,有没有什么好的方法来从同一个域dynamic加载JavaScript(不知道该域名)? 例如,假设我们有两个相同的服务器(质量保证和生产),但他们显然有不同的URL域。 有没有办法做像include("myLib.js"); myLib.js将从文件的加载域中加载?

对不起,如果这有点混乱。

在脚本中:

 var scripts = document.getElementsByTagName("script"), src = scripts[scripts.length-1].src; 

这是有效的,因为浏览器按顺序加载和执行脚本,所以当你的脚本执行时,它所包含的文档肯定有你的脚本元素作为页面上的最后一个脚本元素。 这段代码当然必须是脚本的“全局”,所以将“src”保存在稍后可以使用的地方。 避免泄漏全局variables:

 (function() { ... })(); 

这些天,有document.currentScript ,始终工作(不pipe如何包括文件(asynchronous,书签等)),但只在less数浏览器。

如果你想知道你现在正在使用的JS文件的完整URL:

 var script = document.currentScript; var fullUrl = script.src; 

Tadaa。

就像我说的,没有很大的支持。 目前(2015年11月):

 Chrome 29 Firefox (Gecko) 4.0 (2.0) Internet Explorer - Opera 16 Safari 8 

如果您在文档中使用内联脚本,则此处接受的答案不起作用。 为了避免这种情况,您可以使用以下命令来仅使用[src]属性来定位<script>标签。

 /** * 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模板中遇到的一些问题。

我最近发现了一个更简洁的方法,可以在任何时候执行,而不是在脚本加载时被迫同步执行。

使用stackinfo在当前位置获取堆栈info.file ,并从堆栈顶部获取info.file名称。

 info = stackinfo() console.log('This is the url of the script '+info[0].file) 

细化在这里find的答案,我想出了以下几点:

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; 

getCurrentScriptPath.js

 var getCurrentScript = require('./getCurrentScript'); var getCurrentScriptPath = function () { var script = getCurrentScript(); var path = script.substring(0, script.lastIndexOf('/')); return path; }; module.exports = getCurrentScriptPath; 

顺便说一句:我正在使用CommonJS模块格式并捆绑webpack 。

我编写了一个简单的函数,它允许通过使用try / catch方法来获取当前JavaScript文件的绝对位置。

你可以在这里看到它。

我可能会误解你的问题,但只要生产和开发服务器使用相同的path结构,似乎你应该能够使用相对path。

 <script language =“javascript”src =“js / myLib.js”/>

我只是做了这个小窍门:

 window.getRunningScript = () => { return () => { let err = new Error() let link = err.stack.split('(') link = link[1] link = link.split(')')[0] link = link.split(':') link.splice(-2, 2) link = link.join(':') return link } } console.log('%c Currently running script:', 'color: blue', getRunningScript()()) 

截图

工作:Chrome,Firefox,Edge

请享用 !

无论它是一个脚本,一个HTML文件(例如框架),CSS文件,图像,无论如何,如果你指定一个服务器/域HTML文件的path将是默认的,所以你可以做,例如,

<script type=text/javascript src='/dir/jsfile.js'></script>

要么

<script type=text/javascript src='../../scripts/jsfile.js'></script>

如果您不提供服务器/域,path将相对于页面的path或主文档path的脚本