2011-02-12 39 views
1

我試圖將一個擴展從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腳本組件

+0

您定位的是哪個版本的IE? – Spudley 2011-02-12 19:52:29

+0

7,8和9,如果可能的話6。 – 2011-02-12 20:07:59

回答

2

這聽起來像你的參照窗口對象不再有效時,JS最終執行 - What causes the error "Can't execute code from a freed script"

一對夫婦你可以嘗試的東西:

而不是win.document.parentWindow.top,只是使用win.document.parentWindow應該指向一個有效的窗口引用。由於「頂部」可能指向父框架或窗口,並且最終導致提供的鏈接中存在其中一個原因。

檢查以確保參考myNS.extObject沒有在bho中被破壞。您應該嘗試抓住OnDocumentComplete中的每條語句,因爲任何一個都可能會給您看到的錯誤,並且兩者都有不同的分辨率。

最後,如果可以的話,執行使用上下文菜單中的IE擴展 - http://msdn.microsoft.com/en-us/library/bb735853(v=vs.85).aspx

那麼你就必須通過在JavaScript土地external.menuArguments對象訪問window對象。

相關問題