Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.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_Include_Absolute Path_Src - Fatal编程技术网

如何获取当前正在执行的javascript代码的文件路径

如何获取当前正在执行的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

我正在尝试做一些类似于C
#include“filename.C”
,或者PHP
include(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
,以防它被定义