【发布时间】:2010-12-24 08:49:29
【问题描述】:
我正在尝试在 javascript 中构建某种记录器功能。是否有任何 API 可以让脚本获取自己的文件名?
【问题讨论】:
-
不,我只是想有一个记录器,我可以在其中包含时间戳、一些字符串、行号和 js 文件名等。让我试试给出的解决方案。
标签: javascript html ajax
我正在尝试在 javascript 中构建某种记录器功能。是否有任何 API 可以让脚本获取自己的文件名?
【问题讨论】:
标签: javascript html ajax
我看到了两种方式:
var filename = 'script.js';
<script>标签名获取文件名JS 无法像 bash/perl/c 脚本一样获取文件名。
【讨论】:
var filename = 'script.js';" 但不是在全局范围内,因为最后加载的会赢。所以如果你有a.js 和b.js 并加载它们,并在a 中调用一个函数,它会被欺骗认为它是b。
很遗憾,这是不可能的。
如果您更改方法,获取函数名称可能会对您有所帮助,这有时是可能的。您最好的机会是从“arguments.callee”中提取函数名称。这仅适用于函数定义为
function FN() { ... }
并且不工作的时候
var FN = function() { ... }
【讨论】:
这应该有效:
(new Error).fileName
或者你可以试试这个:
var filepath;
(function(){
var scripts = document.getElementsByTagName('script');
filepath = scripts[ scripts.length-1 ].src;
}());
第二个选项为您提供脚本文件的路径。
【讨论】:
[scripts.length-1] 位置。您假设您的脚本是scripts 中的last。当某些服务之后添加一些脚本时,情况并非如此。然后,您不会得到脚本的 src,而是添加脚本的 src,这通常为空。
(function(){}()) 构造意味着它立即执行,此时正在执行的脚本是 DOM 中的最后一个,因为它还没有被解析之后什么都没有。但是,也许我应该编辑我的答案以反映这一点,这将无法使用延迟/异步加载的<script> 元素。
这是我的修改,修复了一些可能的问题,但增加了一个要求。
它需要您以某种方式命名文件,例如,如果您有一个 .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+'}';
【讨论】:
如果我们可以得到当前脚本的标签,那么我们就可以读取它的src 属性。摘自以下https://stackoverflow.com/a/22745553/4396817:
document.currentScript 将返回当前正在处理其脚本的元素。
<script>
var me = document.currentScript;
</script>
...所以从那里,我们可以简单地读取src 属性!
<script src="http://website.com/js/script.js">
alert(document.currentScript.src);
</script>
// Alerts "http://website.com/js/script.js"
【讨论】:
您可以尝试将其放在 JavaScript 文件的顶部:
window.myJSFilename = "";
window.onerror = function(message, url, line) {
if (window.myJSFilename != "") return;
window.myJSFilename = url;
}
throw 1;
确保您只有以下功能。 myJSFilename 全局变量将包含 JavaScript 文件的完整路径,并且可以从中解析文件名。在 IE11 中测试,但它应该可以在其他地方工作。
【讨论】: