Відкрийте спливаюче вікно та оновіть батьківську сторінку у закритому спливаючому вікні


94

Я відкрив спливаюче вікно за window.open у JavaScript, я хочу оновити батьківську сторінку, коли закрию це спливаюче вікно. (Подія onclose?) Як я можу це зробити?

window.open("foo.html","windowName", "width=200,height=200,scrollbars=no");

1
Перевірте це: stackoverflow.com/questions/18321323/… може допомогти комусь
NoNaMe

Відповіді:


231

Ви можете отримати доступ до батьківського вікна, використовуючи ' window.opener ', отже, напишіть щось на зразок наступного у дочірньому вікні:

<script>
    window.onunload = refreshParent;
    function refreshParent() {
        window.opener.location.reload();
    }
</script>

Я не знав window.opener, дякую! Я завжди поміщаю вікно абонента у змінну у contentWindow дитини. : - /
kay - SE is evil

3
Якщо ви не контролюєте JavaScript на дочірній сторінці (наприклад, потік OAuth), вам потрібно буде перевірити, popupWindow.closedвикористовуючи setIntervalяк у рішенні @ Zuul.
jchook

34

У спливаючому вікні немає жодної близької події, яку ви можете прослухати.

З іншого боку, є властивість closed, яка встановлюється на true, коли вікно закривається.

Ви можете встановити таймер для перевірки цього закритого властивості і зробити це так:

var win = window.open('foo.html', 'windowName',"width=200,height=200,scrollbars=no");   
var timer = setInterval(function() {   
    if(win.closed) {  
        clearInterval(timer);  
        alert('closed');  
    }  
}, 1000); 

Дивіться цей робочий приклад скрипки !


1
я не хочу використовувати таймер! будь-яка інша ідея?
ArMaN

1
Дещо хакі, але я думаю, що використання таймера буде працювати найкраще в усіх браузерах.
kay - SE є злим

Це також найкраще рішення, якщо спливаюче вікно має кілька сторінок до його закриття, оскільки подія onunload запускається лише після того, як користувач відходить від першої сторінки.
Антон Ченнінг

14

на своїй дочірній сторінці розмістіть такі:

<script type="text/javascript">
    function refreshAndClose() {
        window.opener.location.reload(true);
        window.close();
    }
</script>

і

<body onbeforeunload="refreshAndClose();">

але як хороший дизайн інтерфейсу користувача, ви повинні використовувати Close, buttonоскільки він більш зручний для користувачів. дивіться код нижче.

<script type="text/javascript">
    $(document).ready(function () {
        $('#btn').click(function () {
            window.opener.location.reload(true);
            window.close();
        });
    });
</script>

<input type='button' id='btn' value='Close' />

коли спливаюче вікно закрито, а не коли користувач натискає кнопку, щоб оновити сторінку та закрити спливаюче вікно
gengkev

@gengkev, я знав, що OP хоче прикріпити подію до закриття вікна, але я вважаю, що використання кнопки є кращим дизайном інтерфейсу. однак я включив код для обох. Порадьте, будь ласка.
Рей Ченг,

Я використовував <body onbeforeunload = "refreshAndClose ();"> <script type = "text / javascript"> функцію refreshAndClose () {window.opener.location.reload (true); } self.close (); </script>
steve0nz

3

Я використовую це:

<script language='javascript'>
var t;
function doLoad() {
t = setTimeout("window.close()",1000);
}

</script>
<script type="text/javascript">
function refreshAndClose() {
    window.opener.location.reload(true);
    window.close();
}
</script>
<body onbeforeunload="refreshAndClose();" onLoad='doLoad()''>

коли вікно закривається, воно оновлює батьківське вікно.


2

window.open поверне посилання на новостворене вікно за умови, що відкрита URL-адреса відповідає Політиці того самого походження .

Це має працювати:

function windowClose() {
    window.location.reload();
}

var foo = window.open("foo.html","windowName", "width=200,height=200,scrollbars=no");
foo.onbeforeunload= windowClose;​

Не буде працювати, якщо користувач зможе переходити за посиланнями у відкритому вікні. І я впевнений, що подія вивантаження відбувається перед першим завантаженням цільової URL-адреси, оскільки ви неявно залишаєте about: blank. (+1 за згадку про SOP)
kay - SE is evil

2

У моєму випадку я відкрив спливаюче вікно, натиснувши кнопку посилання на батьківській сторінці. Оновити батьків після закриття дитини

window.opener.location.reload();

у дочірньому вікні призвело до повторного відкриття дочірнього вікна (можливо, це пов'язано зі станом перегляду. Виправте мене, якщо я помиляюся). Тому я вирішив не перезавантажувати сторінку у батьківському режимі і завантажувати сторінку знову, призначаючи їй ту саму URL-адресу.

Щоб уникнути повторного відкриття спливаючого вікна після закриття спливаючого вікна, це може допомогти,

window.onunload = function(){
    window.opener.location = window.opener.location;};

1

Якщо ваша програма працює у браузері з підтримкою HTML5. Ви можете використовувати postMessage . Наведений там приклад досить схожий на ваш.


"В іншому випадку ви не можете спілкуватися між різними вікнами." неправильно. Техніка все ще можлива, хоча я б рекомендував відповідь від @Moses
gengkev

-1 видалено. Якщо ви наведете невеликий приклад, ви навіть отримаєте +1 ;-)
kay - SE is evil

Не звертай уваги. Але я не думаю, що window.opener - це нормально для IE. Я спробую.
Chris Li

1
@ добре, чудово працює в IE7, 8. Дуже приємно, я раніше цього не знав. +1 для Мойсея.
Chris Li

1
@ArMaN: jsfiddle.net/8c2e4/10 , використовуйте window.opener. Ви можете використовувати це для перевірки навколишнього середовища.
Chris Li

1

Спробуйте це

        self.opener.location.reload(); 

Відкрийте батьківське вікно поточного вікна та перезавантажте розташування.


0

Ви можете перейти на головну сторінку за допомогою батьківської команди (батьківською є вікно), після кроку ви можете зробити все ...

    function funcx() {
        var result = confirm('bla bla bla.!');
        if(result)
            //parent.location.assign("http://localhost:58250/Ekocc/" + document.getElementById('hdnLink').value + "");
            parent.location.assign("http://blabla.com/" + document.getElementById('hdnLink').value + "");
    } 

0

Ви можете використовувати наведений нижче код на батьківській сторінці.

<script>
    window.onunload = refreshParent;
    function refreshParent() {
      window.opener.location.reload();
    }
</script>

0

Наступний код зможе оновити закриття повідомлення батьківського вікна:

function ManageQB_PopUp() {
            $(document).ready(function () {
                window.close();
            });
            window.onunload = function () {
                var win = window.opener;
                if (!win.closed) {
                    window.opener.location.reload();
                }
            };
        }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.