6

我们有一个作为浏览器帮助对象 (BHO) 实现的 IE 扩展。我们有一个用 C++ 编写的实用函数,我们将它添加到页面的窗口对象中,以便页面中的其他脚本可以使用它来动态加载本地脚本文件。然而,为了解析这些本地脚本文件的相对路径,我们需要确定调用我们函数的 JavaScript 文件的路径:

  • myfunc()用 C++ 编写并暴露给页面的 JavaScript
  • 文件:///path/to/some/javascript.js
  • (额外的堆栈帧)

从顶部框架中,我想获取脚本调用myfunc()位于 file:///path/to/some/javascript.js 中的信息。

我首先期望我们可以简单地使用该IActiveScriptDebug接口从我们的实用程序函数中获取堆栈跟踪。但是,似乎不可能IActiveScriptIWebBrowser2接口或关联文档中获取接口(请参阅IE8 上的多帧 JS 的完整调用堆栈)。

我唯一能想到的就是注册我们自己的脚本调试器实现并myfunc()闯入调试器。但是,我怀疑这是否会在不提示用户是否要闯入调试器的情况下起作用。

在对这种方法进行更彻底的测试之前,我想检查是否有人有关于这是否可能工作的明确信息和/或可以建议一种替代方法,使用 C++ 编写的函数能够从脚本引擎获取堆栈跟踪调用它。

4

2 回答 2

1

您加载的每个脚本都可能有一个 id,并且调用 myfunc() 的脚本的每个方法都可以将此 id 传递给 myfunc()。这意味着首先您必须修改 myfunct(),最后修改您的脚本和调用。

于 2012-06-07T12:03:20.130 回答
-1

这个答案描述了我如何解决我在原始问题中描述的实际问题。问题描述不是很好,因为我在假设如何解决实际上没有根据的问题。我真正想做的是确定当前正在运行的脚本的路径。我已更改问题的标题以更准确地反映这一点。

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

当然,这不适用于直接嵌入在 HTML 页面中的脚本,但无论如何这都是不好的做法(IMO),所以这似乎不是一个非常重要的限制。

于 2012-09-18T14:46:57.867 回答