繁体   English   中英

IE9 window.open问题

[英]IE9 window.open problems

我不确定发生了什么,但是IE的window.open太糟糕了
我有一段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 () 
   { 

   }
);

问题仍在发生,但更少。 绝对是比赛条件,但我无法弄清楚。 如果您打开某些页面并单击按钮以打开第二个窗口而不等待页面完全加载,则在某些随机情况下仍然可能会发生这种情况。

看起来当fn附加到newWindow的脚本沙箱时,则当fn实际上在子级中的那里执行时,父级中的newWindow 变量不在范围内。

您是否在父母中尝试过类似的方法:

popupParameters = {
    foo: 'bar'
};

这在子代的script标记中:

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

window.opener应该可以在IE 8和IE 9中运行...我认为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM