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


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.