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
问题是:
即使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.如果由于某种原因需要引用原始函数(例如取消订阅时),这一点很重要.
| 归档时间: |
|
| 查看次数: |
3561 次 |
| 最近记录: |