在IE 9中将回调附加到弹出窗口

时间:2011-04-22 19:52:43

标签: javascript internet-explorer-9 window.open

我正在创建一个弹出窗口并为其附加一个回调函数。弹出窗口中有一个按钮,单击时会调用此回调。这适用于Firefox 4和Chrome 10,但不适用于IE 9." myPopupCallback"我添加到窗口的属性由Firefox和Chrome查找并执行。在IE中,它是未定义的。

是否有关于IE的问题会导致将数据或函数附加到窗口时出现问题?

主窗口代码

var popup = window.open(url, '', 'status=0,menubar=0,toolbar=0,resizable=1,scrollbars=1');
$(popup.document).ready(function()
{
    popup.myPopupCallback = function(rows)
    {
        // ...do stuff with rows...
    };
});

弹出窗口代码

$('#btn-ok').click(
    function()
    {
        var rows = $('#rows');

        // IE 9 throws an error on the next line because window.myPopupCallback is undefined
        window.myPopupCallback(rows);
    });

1 个答案:

答案 0 :(得分:3)

window.open()non-blocking operation,这意味着在新窗口打开之前,JavaScript将转到下一行代码。因此,设置属性可能不会“坚持”,如果它太快完成。我自己也遇到了这个问题。

感谢来自a lot of helpErik我发现以下内容似乎运作良好。

var popup = window.open(
      url, '', 'status=0,menubar=0,toolbar=0,resizable=1,scrollbars=1'
);
$(popup.document).ready(function(){
   var setPopupPropertiesInterval = setInterval(
         function setPopupProperties() {
            popup.myPopupCallback = function(rows)
            {
               // ...do stuff with rows...
            };
            if (popup.closed || popup.myPopupCallback) {
               clearInterval(setPopupPropertiesInterval);
            }
         }, 1
   );
});

这将继续尝试将该功能添加到弹出窗口,直到添加或弹出窗口关闭为止。

在我的极简短的测试中,这适用于浏览器,但我不确定这种快速间隔的性能影响并且没有性能问题。请注意,大多数(所有?)浏览器实际上不会以1 ms的间隔运行代码,而是更高一些,通常为10 ms。 Chrome是一个例外,因为它试图接近1或2毫秒。

在运行IE 7的一台 Windows XP计算机上,我遇到了一个问题,浏览器在启动弹出窗口时会冻结。窗口会弹出,但不会加载任何内容,浏览器的响应速度会变慢。但是,我已在其他几台运行Windows XP和IE 7的计算机上对此进行了测试,但无法重现该问题。