1

我目前正在开发一个仅限 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 语句包装(潜在的)数千次调用(一个非常糟糕的做法)?

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

4

1 回答 1

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)
  }
于 2012-11-06T19:26:17.177 回答