我試圖將一個擴展從Firefox移植到IE。所有擴展的代碼都是JS(沒有C++組件),所以我想我會重複使用代碼,並且只能用mozilla的特定部分來自我解決(這無疑也是一種折磨,但我認爲這比重寫它更不痛苦從頭開始)。將FF擴展移植到IE:JS WSC中沒有全局窗口對象
FF擴展包裝在JS對象中,該對象在「加載」事件期間被初始化。然後在「DOMContentLoaded」事件上觸發擴展的「業務」代碼。
我最初的計劃是創建一個WSC(窗口腳本組件)並在那裏偵聽onLoad事件,並且基本上做與原始代碼相同的事情。然而,我發現我的JavaScript腳本組件中沒有隱式的全局窗口對象,我的計劃B是在我的C++ BHO代碼中偵聽「onBeforeNavigate2」事件,並調用處理擴展對象初始化的JS WSC代碼那裏。因此,我決定將瀏覽器窗口對象作爲「window」參數傳遞給onBeforeNavigate JS函數,並將原始擴展代碼重寫爲使用顯式「窗口」變量,而不是依賴隱式全局對象。但是,當我處理「OnDocumentComplete」事件(再次在BHO中偵聽它並將瀏覽器窗口對象作爲參數傳遞給WSC中的JS函數)時,我得到「無法執行代碼從一個釋放的腳本「錯誤。
的WSC代碼如下所示:
<?xml version="1.0"?>
<component>
<registration
...
>
</registration>
<public>
<method name="OnBeforeNavigate">
<parameter name="win" />
</method>
<method name="OnDocumentComplete">
<parameter name="win" />
</method>
</public>
<script src="sharedjs/foo.js" />
<script language="JScript">
<![CDATA[
var window;
function OnBeforeNavigate(win)
{
window = win.document.parentWindow.top;
window.myNS.extObject = initExtensionObject(...);
}
function OnDocumentComplete(win)
{
window = win.document.parentWindow.top;
var obj = window.myNS.extObject;
obj.doTheBusinessStuff();
}
]]>
</script>
</component>
我想那是因爲WSC的處理函數返回後卸載。但是,瀏覽器窗口對象中存在對JS擴展對象的引用,所以我期望瀏覽器保留代碼。
那麼 - 請問我的錯誤是什麼?
乾杯, 湯姆
PS:WSC代表Windows腳本組件
您定位的是哪個版本的IE? – Spudley 2011-02-12 19:52:29
7,8和9,如果可能的話6。 – 2011-02-12 20:07:59