2016-02-09 2 views
0

открыть новое окно, как это:обнаруживая, когда всплывающее окно закрывается в Firefox

var newWindow = window.open('myPage.aspx', null, 'height=650,width=900,status=yes,toolbar=no,scrollbars=yes,menubar=no,location=no,top=0, left=0'); 

И я жду его закрыть:

var windowTimer = window.setInterval(function() { 
    if (win.closed !== false) { 
     //If window is closed ... 
     window.clearInterval(windowTimer); 
    } 
}, 100); 

Это делает работу в Chrome и IE9 и Краю , но не в Firefox, почему?

Firefox не попадает внутрь функции, но он никогда не попадает на win.closed if, даже если есть else, он не входит в него ... есть альтернативы?

Решение, которое работало для меня:

На всплывающем окне:

//Fires an event on the window that opened it 
    window.onbeforeunload = function() { 
     window.opener.myEvent(); 
    }; 

В главном окне:

window.myEvent= function() { 
//This fires only when the popup gets closed on beforeunload 
} 

Примечание: событие, чтобы стрелять в главное окно должно быть объявлено общедоступным, чтобы оно было доступно, например window.myEvent= function()

Другая ссылка:cross-window javascript events

+1

Не было бы лучше выполнить функцию 'onBeforeUnload' в недавно открывшемся окне, которое сообщит вашему старому окну, что оно было закрыто? (также, где определяется 'win'?). Вы можете легко создать логическое в родительском окне, к которому вы можете получить доступ, используя' window.opener [key] 'и записать в него значение, которое может занять ваш интервал, и которые должны работать в FF. – somethinghere

ответ

1

В принципе, я думаю, что самый простой способ сделать это состоит в следующем:

function hasClosed(){ 
 
    document.getElementById('open').textContent = 'window has been closed'; 
 
} 
 
window.addEventListener('beforeunload', function(){ 
 
    if(window.opener) window.opener.hasClosed(); 
 
}); 
 
document.getElementById('open').addEventListener('click', function(e){ 
 
    e.preventDefault(); 
 
    window.open('test.html'); 
 
});
<a href="#" id="open">open window</a>

Пожалуйста, имейте в виду, что SO сниппеты являются не разрешено открывать окна, поэтому код не работает внутри фрагмента. Просто скопируйте код и сохраните его как файл с именем test.html.

Вам не нужно продолжать проверку, ребенок просто вызовет функцию родителя. Это имеет то преимущество, что вы не используете ресурсы, чтобы продолжать проверять его. Также имейте в виду, что при навигации по этому окну вызывается onbeforeunload, если загружается новая страница, вызывая родительскую функцию, но, возможно, вы можете просто выполнить проверку, которую вы уже делали в функции hasClosed.

Возможно, вы захотите дать вашему окну uuid и передать его в него, чтобы он мог сообщить вам об этом при закрытии, но это все уточнение.

+0

спасибо, он работал так, как я хотел: D – Alpha2k

+0

@ Alpha2k Да, честно говоря, я использовал это однажды около года назад и был удивлен, узнав, насколько это просто :) Удачи! – somethinghere