2

我正在创建一个弹出窗口并为其附加一个回调函数。弹出页面中有一个按钮,单击时会调用此回调。这适用于 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);
    });
4

1 回答 1

3

window.open()是一个非阻塞操作,这意味着在新窗口完成打开之前,JavaScript 将移动到下一行代码。因此,如果过早设置属性可能不会“坚持”。我自己也遇到了这个问题。

多亏了Erik的大量帮助,我发现以下内容似乎运行良好。

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 毫秒的间隔运行代码,而是稍高一些,通常为 10 毫秒。Chrome 是一个例外,因为它试图接近 1 或 2 毫秒。

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

于 2011-10-17T22:09:42.040 回答