【问题标题】:Can javascript file get its own name?javascript文件可以自己命名吗?
【发布时间】:2010-12-24 08:49:29
【问题描述】:

我正在尝试在 javascript 中构建某种记录器功能。是否有任何 API 可以让脚本获取自己的文件名?

【问题讨论】:

标签: javascript html ajax


【解决方案1】:

我看到了两种方式:

  • 在每个JS文件中放入一个变量var filename = 'script.js';
  • 使用<script>标签名获取文件名

JS 无法像 bash/perl/c 脚本一样获取文件名。

【讨论】:

  • "在每个 JS 文件中放入一个变量 var filename = 'script.js';" 但不是在全局范围内,因为最后加载的会赢。所以如果你有a.jsb.js 并加载它们,并在a 中调用一个函数,它会被欺骗认为它是b
【解决方案2】:

很遗憾,这是不可能的。

如果您更改方法,获取函数名称可能会对您有所帮助,这有时是可能的。您最好的机会是从“arguments.callee”中提取函数名称。这仅适用于函数定义为

function FN() { ... }

并且不工作的时候

var FN = function() { ... }

【讨论】:

    【解决方案3】:

    这应该有效: (new Error).fileName

    或者你可以试试这个:

    var filepath;
    (function(){ 
        var scripts = document.getElementsByTagName('script'); 
        filepath = scripts[ scripts.length-1 ].src; 
    }());
    

    第二个选项为您提供脚本文件的路径。

    【讨论】:

    • 第二种方法会与某些服务如 Google Analytics 或 New Relic 冲突,因为它们在末尾添加了一个脚本!
    • @sumid,你能解释一下吗?
    • @pawel 问题出在[scripts.length-1] 位置。您假设您的脚本是scripts 中的last。当某些服务之后添加一些脚本时,情况并非如此。然后,您不会得到脚本的 src,而是添加脚本的 src,这通常为空。
    • 我确定这是执行时的最后一个。脚本在文档解析的同时被同步解释,(function(){}()) 构造意味着它立即执行,此时正在执行的脚本是 DOM 中的最后一个,因为它还没有被解析之后什么都没有。但是,也许我应该编辑我的答案以反映这一点,这将无法使用延迟/异步加载的<script> 元素。
    • 好的,对不起,我的错误。可能我在异步方面遇到了一些问题。最后我使用了上面回复中所述的硬编码方式。
    【解决方案4】:

    这是我的修改,修复了一些可能的问题,但增加了一个要求。

    它需要您以某种方式命名文件,例如,如果您有一个 .js 文件,但您想知道加载了哪个版本(例如告诉 php 服务器)。所以你的 js 文件将是“zoom_v34.js”。

        var version;
        (function(){
            var scripts = document.getElementsByTagName('script');
            for (var i=0; i<scripts.length; i++) {
                var start = scripts[i].src.indexOf('zoom_');
                if (start != -1) { var end = scripts[i].src.indexOf('.',start); version = scripts[i].src.substr(start+6,end-start-6); break; }
            }
        }());
        post='login{JS:'+version+'}';
    

    【讨论】:

    • 这可能不是最好的解决方案,尤其是因为there appears to be a better one already
    • 这不是最好的解决方案。当您以不同的方式添加脚本时很好,不假设它是最后一个脚本,更可靠地处理复杂的边缘情况,因为它枚举整个数组而不是假设它是最后一个。
    【解决方案5】:

    如果我们可以得到当前脚本的标签,那么我们就可以读取它的src 属性。摘自以下https://stackoverflow.com/a/22745553/4396817

    document.currentScript 将返回当前正在处理其脚本的元素。

    <script>
      var me = document.currentScript;
    </script>
    

    好处

    • 简单明了。可靠。
    • 不需要修改脚本标签
    • 适用于异步脚本(延迟和异步)
    • 使用动态插入的脚本

    问题

    • 无法在旧版浏览器和 IE 中运行。

    ...所以从那里,我们可以简单地读取src 属性!

    <script src="http://website.com/js/script.js">
      alert(document.currentScript.src);
    </script>
    
    // Alerts "http://website.com/js/script.js"
    

    【讨论】:

    【解决方案6】:

    您可以尝试将其放在 JavaScript 文件的顶部:

    window.myJSFilename = "";
    window.onerror = function(message, url, line) {
        if (window.myJSFilename != "") return;
        window.myJSFilename =  url;
    }
    throw 1;
    

    确保您只有以下功能。 myJSFilename 全局变量将包含 JavaScript 文件的完整路径,并且可以从中解析文件名。在 IE11 中测试,但它应该可以在其他地方工作。

    【讨论】:

      猜你喜欢
      • 2010-09-05
      • 2019-03-12
      • 2016-03-30
      • 2012-02-06
      • 1970-01-01
      • 2011-08-10
      • 2020-07-05
      • 2019-04-02
      • 1970-01-01
      相关资源
      最近更新 更多