Прикрепление обратного вызова к всплывающему окну в IE 9 - PullRequest
2 голосов
/ 22 апреля 2011

Я создаю всплывающее окно и присоединяю к нему функцию обратного вызова. На странице всплывающего окна есть кнопка, которая вызывает этот обратный вызов при нажатии. Это работает в 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 Ответ

3 голосов
/ 18 октября 2011

window.open() - это неблокирующая операция , что означает, что до открытия нового окна JavaScript перейдет к следующей строке кода. Из-за этого установка свойства может не "прилипать", если это сделано слишком рано. Я сам столкнулся с этой проблемой.

Благодаря большой помощи от Эрик Я обнаружил, что следующее, кажется, работает очень хорошо.

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 мс.

На одной машине с Windows XP под управлением IE 7 Я столкнулся с проблемой, когда браузер зависал при запуске всплывающего окна. Окно будет всплывать, но ничего не будет загружаться, и браузер станет медленно реагировать. Однако я проверил это на нескольких других машинах под управлением Windows XP и IE 7 и не смог воспроизвести проблему.

...