如何使用Javascript获取当前正在运行的脚本的路径?

6
我们有一个作为浏览器帮助对象(BHO)实现的IE扩展。我们编写了一个实用函数,将其添加到页面的窗口对象中,以便页面中的其他脚本可以使用它动态加载本地脚本文件。然而,为了解决这些本地脚本文件的相对路径,我们需要确定调用我们的函数的JavaScript文件的路径:
  • myfunc() 由C++编写并向页面的JavaScript公开
  • file:///path/to/some/javascript.js
  • (其他堆栈帧)
从顶层框架中,我想获取调用myfunc()的脚本位于file:///path/to/some/javascript.js的信息。
起初,我认为我们可以简单地使用IActiveScriptDebug接口从我们的实用函数中获取堆栈跟踪。然而,似乎不可能从IWebBrowser2接口或相关文档中获取IActiveScript接口(请参见Full callstack for multiple frames JS on IE8)。
我所能想到的唯一方法是注册我们自己的脚本调试器实现,并让myfunc()进入调试器。然而,我对此是否有效并不乐观,因为这可能会在没有征得用户同意的情况下进行调试。

在对这种方法进行更彻底的测试之前,我想确认是否有人有确切的信息表明这可能有效,或者能够提出一种替代方法,使得用C++编写的函数能够从调用它的脚本引擎中获取堆栈跟踪信息。

2个回答

1

每个加载的脚本可能都有一个ID,调用myfunc()的脚本中的每个方法都可以将该ID传递给myfunc()。这意味着首先您需要修改myfunc(),最后再修改您的脚本和调用。


我应该更清楚地表达:myfunc() 无法从调用者那里获取任何可用于确定路径的信息。(如果有人感兴趣,我们正在按照 CommonJS 规范实现 require() 函数,因此必须遵循规范。) - Matthew Gertner
这完全不同。你能做的最好办法是看一下当前的实现,并可能得到一个想法(如果你还没有)。一个例子就是“Smart Platform”需要在 https://github.com/joyent/smart-platform/blob/master/share/internal_js/require.js 上进行实现。 - user1088520
那有什么帮助呢?我们已经有了一个针对IE的require()实现(用C++编写),但为了使其按照规范工作,它需要知道调用它的JS文件的路径。 - Matthew Gertner

-1

这篇答案描述了我如何解决原问题。由于我对如何解决问题的假设是错误的,所以问题描述并不好。实际上,我真正想做的是确定当前运行脚本的路径。我已经更改了问题的标题,以更准确地反映这一点。

这实际上相当容易实现,因为脚本在加载时作为 HTML 文档执行。因此,如果我当前正在执行由 script 标签加载的某些 JavaScript,则该 script 标签将始终是文档中最后一个脚本标签(因为文档的其余部分尚未加载)。要解决这个问题,只需要获取最后一个脚本标签的 src 属性的 URL,并根据它解析任何相对路径。

当然,这对于直接嵌入 HTML 页面的脚本无效,但这是不良实践(在我看来),因此这似乎不是非常重要的限制。


如果脚本是延迟加载或异步加载,或者其他脚本插入了DOM,则此方法将无法正常工作。请参见https://dev59.com/fm3Xa4cB1Zd3GeqPeGbR我认为这是一个非常重要的限制,特别是当不同的团队在同一页上工作时。不可避免地会有人(通常是SEO实施人员)使用某种技巧来破坏您的代码。请参见http://fractallambda.com/2014/11/15/Get-current-script-element-in-javascript.html以比较一些不同的方法。 - Xun Yang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接