在Internet Explorer中使用JavaScript重写外部对象的函数
问题描述:
我目前正在使用由主机应用程序提供的外部对象模型的仅限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语句包装(潜在的)数千个调用(一个非常糟糕的做法)吗?
更新:经过与客户端的大量来回之后,我们设法联系第三方供应商更新外部主机方法,这比我们的包装方法更好前端。与此同时,我接受了保罗的答案。
答
使用的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)
}