2012-07-25 52 views
1

我目前正在使用由主機應用程序提供的外部對象模型的僅限IE的項目。 Internet Explorer允許通過瀏覽器組件訪問這個外部對象: http://msdn.microsoft.com/en-us/library/ie/ms535246(v=vs.85).aspx在Internet Explorer中使用JavaScript重寫外部對象的函數

訪問對象採用JavaScript函數調用的形式,類似於:

external.MethodName(arg1, arg2); 

一個最近的更改應用程序流會引進數百,甚至數千if語句這些JavaScript調用周圍條件語句,例如:

if (X) { 
    external.MethodName(arg1, arg2); 
} else { 
    // do something else 
} 

而不是潛在的修改HTML成千上萬的FIL es,如果我們可以重寫或重寫外部對象的函數以使if條件只出現在一個地方,那麼似乎是有道理的。通常情況下,這可能在JavaScript來實現與:

external.OldMethodName = external.MethodName; 
external.MethodName = function(arg1, arg2) { 
    if (X) { 
     external.OldMethodName(arg1, arg2); 
    } else { 
     // do something else 
    } 
}; 

然而,這會導致「無效的過程調用或參數」腳本錯誤,因爲你不能引用外部主機方式這種方式。

我無法訪問主機應用程序專有代碼來直接更改外部方法。我有什麼辦法可以使用JavaScript來重寫外部對象的函數,或者我需要用if語句包裝(潛在的)數千個調用(一個非常糟糕的做法)嗎?

更新:經過與客戶端的大量來回之後,我們設法聯繫第三方供應商更新外部主機方法,這比我們的包裝方法更好前端。與此同時,我接受了保羅的答案。

回答

1

使用的toString()和eval:

var foo = external.MethodName.toString().replace("OldMethodName", "MethodName").replace("bar","baz"); 
eval(foo); 
if(x) 
    { 
    external.OldMethodName(arg1,arg2); 
    } 
else 
    { 
    MethodName(arg1,arg2) 
    } 
相關問題