覆盖外部对象's函数在Internet Explorer中使用JavaScript

Overriding external object's function using JavaScript in Internet Explorer

本文关键字:Explorer Internet JavaScript 函数 对象 外部 覆盖      更新时间:2024-01-29

我目前正在处理一个仅IE的项目,该项目利用了主机应用程序提供的外部对象模型。Internet Explorer允许通过浏览器组件访问此外部对象:http://msdn.microsoft.com/en-us/library/ie/ms535246(v=vs.85).aspx

对对象的访问采用JavaScript函数调用的形式,类似于:

external.MethodName(arg1, arg2);

应用程序流最近的一个变化将在这些JavaScript调用周围引入数百甚至数千个if语句条件,例如:

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

与其修改潜在的数千个HTML文件,不如重写外部对象的函数,使if条件只出现在一个地方。通常,这可以在JavaScript中使用来完成

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

但是,这会导致"无效的过程调用或参数"脚本错误,因为不能以这种方式引用外部宿主方法。

我没有访问主机应用程序的专有代码来直接更改外部方法。

有没有什么方法可以使用JavaScript覆盖外部对象的函数,或者我需要用if语句包装(潜在的)数千次调用(这是一种非常糟糕的做法)?

更新:在与客户反复讨论之后,我们设法联系了第三方供应商来更新外部主机方法,这比我们在前端包装方法要好得多。在此期间,我已经接受了保罗的回答。

使用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)
  }