【发布时间】:2011-03-02 10:31:19
【问题描述】:
大家好,我一直在尝试组合一个通用函数,用于检索网页上正在执行的 JavaScript 文件的绝对 URL:
基本上你可以这样称呼:
getScriptName(function(url) {
console.log(url);
// http://www.example.com/myExternalJsFile.js
});
在页面上的外部 JavaScript 文件中,然后可以对其执行某些操作(例如,找到加载它的 <script> 标记)。
它在我测试过的几乎所有浏览器(Firefox、Chrome、Safari、至少 Opera v10 和 IE 8)中都运行良好。
但是,在 IE 6 和 7 中似乎失败了。回调函数被执行,但检索到的名称是主 HTML 页面的 URL,而不是 JavaScript 文件。继续示例,getScriptName 使用参数调用回调:http://www.example.com/index.html
所以我真正要问的是是否有其他方法可以获取当前 JavaScript 文件的 URL(可能是 IE 6 和 7 特定的hackery)?提前致谢!
编辑:另外,这并不适用于所有情况,所以请不要推荐它:
var scripts = document.getElementsByTagName("script");
return scripts[scripts.length-1].src;
我希望它适用于动态创建的脚本标签(可能没有放在页面的最后),也就是延迟加载。
【问题讨论】:
-
不错的代码和问题。虽然我不知道这个问题的答案,但我只想给你一些优化:你可以将每个
obj['prop']更改为obj.prop并且作为typeof总是返回一个字符串,你不必测试用于身份(===);测试平等(==)就足够了。它们的性能比你代码中的要好一些。 -
谢谢。是的,我知道我可以将 obj['prop'] 替换为 obj.prop,我只是这样准备将函数发送到 Google Closure Compiler,这会破坏这些变量名。不过,我会将 === 更改为 ==,谢谢!
-
我刚刚测试了访问
obj['prop']和obj.prop,但与我的想法相反,在 Firefox 中差异可以忽略不计,而在 Chrome 中,前者实际上更快 i> 比后者。我对此感到非常惊讶,这可能与 V8 对 JavaScript 的“编译”有关。 -
这可能是我的缺点,但有什么意义呢?如果您知道将脚本嵌入到 html 中的位置,那么您就知道从哪里调用它...
-
我同意约翰的观点。让我们从大局来看,找出为什么需要脚本的文件名。对我来说,这听起来像是脆弱的编程。
标签: javascript html internet-explorer cross-browser absolute