Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript;套用;函数不';在window.external扩展对象中不存在_Javascript_Internet Explorer_External - Fatal编程技术网

Javascript;套用;函数不';在window.external扩展对象中不存在

Javascript;套用;函数不';在window.external扩展对象中不存在,javascript,internet-explorer,external,Javascript,Internet Explorer,External,我在IE8(也可能是任何IE版本)上使用javascript扩展(AKA window.external)来公开某些函数。 我试图调用apply函数,它(应该是,根据)本机嵌入在window.external对象的函数上的每个JS函数中,但浏览器不断抛出异常,即该函数不存在apply函数 例如,此代码可以工作: function onDataReceived(url, success, status, data, errorMessage) { alert(onDataReceived)

我在IE8(也可能是任何IE版本)上使用javascript扩展(AKA window.external)来公开某些函数。
我试图调用apply函数,它(应该是,根据)本机嵌入在window.external对象的函数上的每个JS函数中,但浏览器不断抛出异常,即该函数不存在apply函数

例如,此代码可以工作:

function onDataReceived(url, success, status, data, errorMessage) {
    alert(onDataReceived);
}

function innerTest() {
    alert(arguments[0] + ", " + arguments[1]);
}

function outerTest() {
    innerTest.apply(null, arguments);
}

outerTest("hello", "world");

// alerts "hello, world"
但此代码引发异常:

function outerTest() {
    window.external.innerTest.apply(null, arguments); // <-- exception
}

outerTest("hello", "world");
函数outerTest(){

window.external.innerTest.apply(null,参数);//如果
window.external
是一个主机对象,或者来自某个不希望其原型暴露于页面逻辑的扩展机制,那么它可能是一个函数,但可能没有通常的
调用
和应用成员。幸运的是,您可以调用
调用
并应用
应用

Function.prototype.apply.call(window.external, null, [argumentsToExtension])
或者说是真正的meta

Function.prototype.apply.apply(window.external, [null, [argumentsToExtension]])
其中,
null
是作为
this
的值传递的内容,根据通常的调用/应用规则,该值应解释为
窗口

编辑:

如果这不起作用,你总是可以回到黑客的三角

function triangleOfHackery(obj, methodName, args) {
  switch (args.length) {
    case 0: return obj[methodName]();
    case 1: return obj[methodName](args[0]);
    case 2: return obj[methodName](args[0], args[1]);
    case 3: return obj[methodName](args[0], args[1], args[2]);
    ...
  }
}

其实有一个通用的解决方案,一个简单的例子如下:

函数调用(funcName,…args){
var argStr='';
for(让我输入args){
argStr+=',this.args['+i+']';
}
return(新函数('return window.external[\''+funcName+'\']('+argStr.substring(2)+')).bind({args})();
}
//定义不能字符串化的圆形结构:
常数a={};a.a=a;
//打电话:
调用('foo',10',abc',new Date(),function(){},a);
//相当于:
foo(10,'abc',new Date(),function(){},a);
如您所见,没有必要保持参数可序列化

主要思想是正确指定上下文,并将所有参数装载到该上下文上

我在这里使用ES6语法只是为了使代码更容易理解。当然,为了使其在IE8中工作,您可以将其转换为与ES5兼容的语法,您可以首先将ES5 shim包含在polyfill
Function.prototype.bind
。或者,您根本不需要
bind

编辑:ES5兼容版本:

函数调用(funcName){
var argStr='';

for(var i=1;iIs
window.external.innerTest
真的是一个函数吗?
typeof window.external.innerTest
显示了什么?如果使用
window.external.innerTest()
?@duri-
typeof window.external
是“对象”吗,但是
typeof window.external.innerTest
是未知的。当我调用
window.external.innTest(param1,param2)
时,它工作得很好。这是因为函数是本机实现的(C++,通过浏览器的COM对象)@Mike Samuel-谢谢,真的是创造性思维。不幸的是,这不起作用。它在简单的JS函数上起作用,但在
window.external
函数上不起作用。以下是我尝试过的(但失败了):
function.prototype.apply.apply(window.external.innerTest,[null,[param1,param1]];
。如果我用funcSimple替换window.external.innerTest,比如说,它工作得很好。@Omri,如果你用
window.external替换null,它工作得好吗?
?这样它将收到与你正常调用它时相同的
这个
。@Mike Samuel,是的,我试过了(对不起,我忘了早些时候提到它),带有:
Function.prototype.apply.apply(window.external.innerTest,[window.external,[param1,param2]]
,但再次-不走运。我想这是因为window.external是一个扩展对象,所以它不是一个本地JS对象,这是我所经历的根源。@Omri,请查看我的编辑。以上是一种绝对可怕的方式,可以让反射的
应用
样式参数列表为
操作符传递。@Mike Samuel,thanks,但这正是我所做的:)我在寻找一个更优雅的解决方案。