在IE中无法将功能从一个窗口传递到另一个窗口

Ole*_*gas 9 javascript internet-explorer function window.opener

我有一个两个窗口,一个是从另一个打开的,所以,我opener在"子"窗口中有一个属性.

父窗口在全局范围内具有一些功能,必须使用函数作为第一个参数调用它(它将用作回调).

这两个页面都是从同一个域打开的,因此,我没有任何同源策略限制(我希望如此)......

在子窗口中,我有这样的代码

if(window.opener) {
    window.opener.myFunction(function() { ... });
}
Run Code Online (Sandbox Code Playgroud)

一切正常,直到我尝试在IE中运行它.在这个浏览器中,收到的参数myFunction总是类型Object(选中typeof).代码myFunction是这样的:

window.myFunction = function(cb) {
    alert('Callback type is ' + (typeof cb));
    if(typeof cb == 'function') 
        cb();
    else
        alert('Not a function!');
}
Run Code Online (Sandbox Code Playgroud)

现场演示:http://elifantiev.ru/ie-opener-issue/first.html

问题是:

  1. 这是一个符合标准的行为吗?
  2. 这个问题有一些解决方法吗?

Dre*_*ner 6

即使typeof返回"object",该函数仍然按预期工作.调用cb()将执行该功能.

typeof用于确定参数是否为函数的替代方法是测试所有函数应具有的call属性:

if (cb && cb.call) { cb(); }
Run Code Online (Sandbox Code Playgroud)

如果你传递的东西需要一个函数,它可以像这样包装:

function newCb() {
    return cb.apply(object, arguments);
}
Run Code Online (Sandbox Code Playgroud)

另请注意,将函数从父级传递给子级时,typeof也是对象.将原始函数与函数作为对象进行比较(往返之后)返回true.如果由于某种原因需要引用原始函数(例如取消订阅时),这一点很重要.