【问题标题】:Getting URL of executing JavaScript file (IE6-7 problem mostly)获取执行 JavaScript 文件的 URL(主要是 IE6-7 问题)
【发布时间】:2011-03-02 10:31:19
【问题描述】:

大家好,我一直在尝试组合一个通用函数,用于检索网页上正在执行的 JavaScript 文件的绝对 URL:

http://gist.github.com/433486

基本上你可以这样称呼:

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


【解决方案1】:

这在很大程度上取决于您可以访问的内容。如果看起来,您试图完全在 JS 代码中执行此操作,我不相信您能够这样做,原因如上所示。你可能会得到 90% 的结果,但不是绝对的。

如果您在 dotnet 环境中工作(这是我所知道的唯一环境),我建议使用一个模块来拦截所有 JS 请求并将请求位置或类似性质的东西添加到其中。

我认为您需要从服务器端解决这个问题,而不是客户端。我认为您不会从客户端获得明确的答案。我认为您也很难从服务器端获得答案,但您可能会更成功。

【讨论】:

    【解决方案2】:

    抱歉,我怀疑您可能会为此感到困惑。早于版本 8 的 IE 通常会从以下形式的 javascript 错误中给出错误消息:

    line: 342
    char: 3
    error: expected identifier, string or number
    code: 0
    url: http://example.com/path/to/resource
    

    其中 url 是 window.location.href,而不是包含问题的外部 Javascript 资源的 URL。我建议 IE 提供无用的 URL 值,因为脚本 URL 在那时对 IE 不可用,而且它也不适用于您可能编写的任何 Javascript 来尝试显示它。

    我希望能够链接到 IE8 发行说明,其中说明此错误/功能已得到修复,因此我将其创建为社区 wiki。我的 MSDN foo 很弱!

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      相关资源
      最近更新 更多