IE9 window.open问题

时间:2014-11-03 22:08:24

标签: javascript internet-explorer internet-explorer-8 internet-explorer-9

我不确定发生了什么,但是IE的窗口。开启可怕
我有一段javascript代码,从角度控制器调用,打开第二个窗口(在同一个域内,弹出窗口被阻止关闭)并尝试在第二个窗口调用javascript方法。

我的代码:

var newWindow = $window.open('somefile.html?' + Math.random(1000));                    
var fn = function () {                        
  //alert('I got called');
  newWindow.display($scope.mymsg);
}

if (newWindow.addEventListener)
  newWindow.addEventListener("load", fn, false);
else if (newWindow.attachEvent)
  newWindow.attachEvent("onload", fn);
else
  newWindow.onload = fn;

我需要支持IE8和IE9。我摆弄了代码,并在IE8上运行,但我不能让它在IE9上工作。
如果我取消注释警报,在IE9中,我永远不会看到这个。我不知道为什么,因为我正确地附加了onload处理程序。我怀疑存在某种竞争条件,但如果是这种情况,我会在新窗口的display()中遇到问题,但它甚至没有到达那里因为onload没有被调用。

更新 因此,使用jQuery包装新创建的窗口有很多帮助:

var newWindow = $window.open('somefile.html?z=' + Math.random(1000));
$(newWindow).load(function () { this.display($scope.mymsg); });

我还添加了假人" z"我之前错过的帕拉姆。我几乎让它工作了。 现在看来,当你第一次打开这个页面时,快速点击按钮打开第二个窗口,第二个窗口在IE8中打开空白(它应该有一些传递给它的消息)。但是,如果您打开页面并等待几秒钟,第二个窗口将正确打开,显示传入的消息。
我还在第二个窗口的display()方法中添加了$(document).ready()。
我之前没有提到的另一件事,但我认为可能与此有关,是打开这个窗口的整个机制都包含在$ q.all()中。这是因为在我打开第二个窗口之前,我打电话来保存数据并返回验证消息。我想知道q是否有什么事情发生,这导致了这种竞争状态。

UPDATE2: 将代码移动到$ q中的promise链中的最后一个promise。所以现在它看起来像这样:

$q.all([
   //load data and put validate errors into $scope.mymsg
]).then(
   function () 
   {
     $(document).ready(function () {
       var newWindow = $window.open('somefile.html?z=' + Math.random(1000));
       $(newWindow).load(function () { this.display($scope.mymsg); });
     });        
   }, 
   function () 
   { 

   }
);

问题仍在发生,但却少了很多。这绝对是一种竞争条件,但我无法弄明白。如果您打开某些页面并单击按钮打开第二个窗口而不等待页面完全加载,则仍可能在某些随机情况下发生。

1 个答案:

答案 0 :(得分:3)

看起来当fn附加到newWindow的脚本沙箱时,父进程中的newWindow 变量超出了范围fn 1}}实际上是在孩子那里执行的。

您是否在父母中尝试过类似的内容:

popupParameters = {
    foo: 'bar'
};

这是在孩子的script标签中:

popupParameters = window.opener.popupParameters;
alert(popupParameters.foo);

window.opener应该在IE 8和9中工作......我想。