2011-01-24 3 views
12

Я видел способы увидеть, открыт ли какой-либо конкретный скрипт, но что, если это не так?Как определить, существует ли окно в Javascript?

У меня есть маленькое окно, в котором есть кнопка для загрузки большого окна. Когда я закрываю большой, я хочу, чтобы конкретный onUnload или onBeforeUnload стрелял, если маленький закрыт; если он все еще открыт, эти процедуры не будут срабатывать. У меня может быть просто массивный мозговой пердит, но я не могу понять, как проверить, открыто ли другое окно. Большой не открывает его, поэтому я не могу просто записать ручку с ее открытия.

В более короткие сроки: если окно A открыло окно B, как я могу проверить в окне B, если окно A все еще существует?

ответ

19
if(window.opener && !window.opener.closed) 
    alert('Yup, still there.'); 
+0

Ох. Ну, это было просто. Вот следующий вопрос, хотя ... если B был открыт независимо от A, есть ли способ увидеть, существует ли A? Имея конкретное имя/цель и все, не похоже, что он пытается угадать, что я имею в виду под A, он знает, что я имею в виду под A. – Andrew

+0

window.parent? То есть для фреймов, а не для всплывающих окон –

+0

О, джоз. Спасибо, Хуан. Да, я имел в виду «открыватель», а не «родитель». Эндрю: соответствующий ключ был бы аргументом windowName для 'window.open', но я не знаю, как использовать его иначе, чем другим вызовом' window.open', что довольно разрушительно. – chaos

17

window.closed будет установлен верно, если вы совал окно и оно было закрыто (скриптом или пользователем).

var win = window.open('...')'; 
if (win.closed) 

Ваше дело, как представляется, следующее:

Из всплывающего окна, вы можете проверить, если окно, которое открыло еще открыто с помощью window.opener.closed

Получить дескриптор окна по названию

Я упомянул, что в комментариях нет способа просто получить дескриптор окна по имени. Тем не менее, я сделал некоторые исследования и обнаружил, что в FF/IE/Chrome работает следующее: это хак, я не видел, чтобы он упоминался где-то как ожидаемое поведение, поэтому я не стал бы слишком полагаться на него, но было здорово найти его! В моем коде я бы все равно просто обошел нужные ручки.

//opened a window without storing a handle, but gave it a name 
window.open('/some/url', 'xxx'); 

// now I need to get a reference to that window 
// Calling open without setting a url gets you 
// a reference and doesn't reload the window 
var win = window.open('', 'xxx') 
+0

Спасибо. Что делать, если он может быть открыт иначе, чем через оригинальный javascript? (т. е. если C открыт B, может ли B увидеть, открыт ли A?) – Andrew

+0

Нет, вы не можете «божественным» дескриптором окна. Глобального реестра окон по имени нет. В вашем примере C создал A? если это так, вы должны сохранить этот дескриптор 'A = window.open(); B = window.open(); B.A = A''. Тогда B может проверить 'if (! A.closed)'; –

+0

Спасибо за взломать. Я мог бы подумать об использовании этого, на самом деле, но сейчас я пытаюсь сделать его более чистым и сформулировать полностью комплексное решение. – Andrew

1

Использовать try {} и catch (err) {}.

try{ 
window.opener.document.body.getElementById('#elementId'); // do some action with window. opener 
} 
catch(err){ 
// if we are here then probably there is no window.opener 
window.close(); // closing this window or whatever you want 
} 
+0

Ну, «возможно, нет окна.opener» - не точное решение.Этот вопрос составляет два года и имеет принятый ответ. В будущем, пожалуйста, приложите свои усилия к новым вопросам или к тем, у кого нет принятого ответа;) – Mifeet

+1

@ Mifeet этот ответ меня не удовлетворил. Я просто хотел добавить альтернативу и, возможно, лучшее решение, если бы кто-то вроде меня пришел сюда. И нет ничего смешного в том, что «возможно». Поскольку catch может быть вызван не только, если window.opener не существует, но когда ваш код, связанный с window.opener, недействителен. – Audrius

+1

Хорошо, спасибо за разъяснение. Использование try-catch не рекомендуется, но исключения должны использоваться для исключительных состояний, а не для нормального потока выполнения. Тестирование, если установлено 'window.opener', является лучшим решением. – Mifeet