2012-06-04 51 views
6

我們有一個IE瀏覽器擴展實現爲瀏覽器幫助對象(BHO)。我們有一個用C++編寫的實用函數,我們將其添加到頁面的窗口對象中,以便頁面中的其他腳本可以使用它來動態加載本地腳本文件。爲了解決這些本地腳本文件的相對路徑,但是,我們需要確定JavaScript文件的調用我們的功能的路徑:如何使用Javascript獲取當前正在運行的腳本的路徑?

  • myfunc()用C++編寫,並暴露在頁面的JavaScript
  • 文件: ///path/to/some/javascript.js
  • (額外堆棧幀)

從頂部框架我想腳本調用myfunc()位於文件中的信息:///路徑/to/some/javascript.js。

我首先希望我們可以簡單地使用IActiveScriptDebug接口從我們的效用函數中獲取堆棧跟蹤。但是,從接口IWebBrowser2接口或相關文檔(請參閱Full callstack for multiple frames JS on IE8)似乎不可能獲得接口IActiveScript

我能想到的唯一的事情就是註冊我們自己的腳本調試器實現,並讓myfunc()進入調試器。然而,我懷疑這會在沒有提示用戶是否想要進入調試器的情況下工作。

在對此方法進行更徹底的測試之前,我想檢查是否有人有關於這是否可能工作的明確信息和/或可以建議一種替代方法,以使用C++編寫的函數可以獲取堆棧跟蹤來自調用它的腳本引擎。

回答

0

這個答案描述了我如何解決我在原始問題中描述的實際問題。問題描述並不是很好,因爲我正在假設如何解決實際上沒有根據的問題。我真正想要做的是確定當前正在運行的腳本的路徑。我已經改變了問題的標題,以更準確地反映這一點。

這實際上很容易實現,因爲腳本在加載時在HTML文檔中執行。因此,如果我當前正在執行一個由script標記加載的JavaScript,那麼script標記將始終是文檔中的最後一個腳本標記(因爲文檔的其餘部分尚未加載)。爲了解決這個問題,只需獲取最後一個腳本標記的src屬性的URL並根據它解析任何相對路徑即可。

當然這不適用於直接嵌入HTML頁面的腳本,但無論如何這是不好的做法(IMO),所以這看起來不是一個非常重要的限制。

1

您加載的每個腳本都可能有一個id,調用myfunc()的腳本的每個方法都可能會將此id傳遞給myfunc()。這意味着首先你必須修改myfunct()並最終改變你的腳本和調用。

+0

我應該已經更清楚了:myfunc()不能從調用者那裏獲得任何可用於確定路徑的信息。 (如果有人很好奇,我們按照CommonJS規範實現require()函數,所以我們必須堅持規範說明的內容。) –

+0

這是完全不同的。你可以做的最好的是看看當前的實現,並可能有一個想法(如果你還沒有)。一個例子就是https://github.com/joyent/smart-platform/blob/master/share/internal_js/require.js – 2012-06-13 06:28:08

+0

上的「智能平臺」需求實現。這有什麼幫助?我們已經爲IE(用C++編寫)實現了require(),但爲了使其能夠按照規範工作,它需要知道調用它的JS文件的路徑。 –

相關問題