Наблюдение Javascript window.open, когда окно уже существует с использованием прототипа

Я столкнулся со странным сценарием, в котором window.open() не запускает событие «загрузка», если фактическое окно уже находится на экране.

Краткий обзор
У меня есть кнопка, при нажатии которой запускается некоторый javascript и открывается страница в новом окне. Стандартный код, который видел любой JS-разработчик. Когда вызывается метод (часть большего класса), он проверяет, есть ли ссылка на окно (this.preview_window). Если это так, он запустит this.up и попытается открыть его снова. Как только он открыт, он запускает метод обновления в этом окне.

Проблема
Если окно не существует, все работает как положено. Если окно существует, но у класса нет ссылки на него, то ссылка успешно получена с помощью window.open(), однако функция обновления не вызывается.

Соответствующий код

// This code is run whenever there is no reference to the window
this.preview_window = window.open('/folder/page.php','page_previewer');
Event.observe(this.preview_window, 'load',this.update.bindAsEventListener(this));

Остальной код был тщательно протестирован, поэтому я вполне уверен, что что-то упустил в том, как работает событие загрузки. Функции window.open() и update() работают должным образом во всех случаях, кроме этого.


person Paulo    schedule 12.05.2009    source источник


Ответы (2)


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

var preview_window;

function openPreviewWindow() {
    if (preview_window) {
        preview_window.close(); //Load will not fire unless we close the window first
    }
    preview_window = window.open('/', 'preview_window');
    Event.observe(preview_window, 'load', function () {
        alert('Updating opened window.');
    }.bindAsEventListener(this));
}

<a href="#" onclick="openPreviewWindow()">Open Preview Window</a>

Это может быть не очень поучительно, но, надеюсь, это направит вас на более многообещающий путь.

person Lyudmil    schedule 13.06.2009

Я предполагаю, что либо дочернее окно находится в другом домене, когда происходит привязка, либо оно загружается из кеша до того, как произойдет загрузка. попробуйте поставить привязку на тайм-аут 500 мс. Если вы управляете URL-адресом дочернего окна, было бы проще вызвать родителя из дочернего элемента. В качестве альтернативы закройте и снова откройте.

if (this.preview_window && !this.preview_window.closed)
  this.preview_window.close();
... open window ... 
person Tracker1    schedule 14.05.2009