2009-11-13 3 views
1

Я хочу связать функцию с событием beforeunload дочернего окна в Javascript. У меня есть следующий код:window.onbeforeunload не запускается в дочернем окне

newWind = window.open(settings.url, "Dialog", "width=" + settings.width + ",height=" + settings.height + ",resizable=" + settings.resizable + ",scrollbars=" + true); 

newWind.onunload = function() { alert('test'); } 

отлично работает в Firefox, но терпит неудачу в IE7. Может ли кто-нибудь увидеть, что я делаю неправильно?

+0

основано на вашем названии, вы имели в виду установить newWind.onbeforeunload? Я также считаю, что определение onbeforeunload на странице "settings.url" не является опцией? – scunliffe

ответ

4
newWind.onunload = function() { alert('test'); } 

IE не позволит назначить функцию из контекста одного окна, чтобы на [перед] разгрузкой другого окна, по какой-то причине. Вы можете назначить внешнюю функцию другим обработчикам событий, включая newWind.document.body.onunload, но это не очень хорошая идея.

Во-первых, поскольку сборщик мусора IE основан на оконном режиме, поэтому, если вы закрываете или перемещаете открывающееся окно, всплывающее окно будет пытаться выполнить мертвую функцию или работать с мертвыми переменными в области видимости, что приведет к странным ошибкам JavaScript.

И, во-вторых, потому что вы не знаете, с какого носителя, когда всплывающий документ загружен достаточно, чтобы установить обработчик. В момент сразу после вызова open всплывающий документ, возможно, вообще не загружал загрузку, и в этом случае вы не можете безопасно установить на нем какие-либо обработчики событий. Поэтому вам потребуется небольшая задержка перед установкой обработчика onunload, и пользователь может закрыть окно за это время. И новичок не знает, как долго задерживаться; вместо этого дочерний диалог должен был вызвать родителя обратно, чтобы сказать, что он готов. Лучше, чтобы ребенок всплыл, берут на себя ответственность за получение своих собственных событий и вызов новичка, чтобы сообщить о них.

Скрипты с несколькими окнами имеют бесконечные подводные камни. Старайтесь избегать его, где это возможно. Для диалогов всегда используются элементы внутри страницы, которые намного надежнее и менее раздражают, чем всплывающие окна.

0

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

function checkChildWindow(win, onclose) { 
    var w = win; 
    var cb = onclose; 
    var t = setTimeout(function() { checkChildWindow(w, cb); }, 500); 
    var closing = false; 
    try { 
     if (win.closed || win.top == null) //happens when window is closed in FF/Chrome/Safari 
     closing = true;   
    } catch (e) { //happens when window is closed in IE   
     closing = true; 
    } 
    if (closing) { 
     clearTimeout(t); 
     onclose(); 
    } 
} 

function openWindow(url) { 
    ... 
    var wnd = window.open(url, "window_name", "[...flags...]"); 
    checkChildWindow(wnd, function() { alert('child was closed!'); }); 
    ... 
} 
Смежные вопросы