Mở cửa sổ bật lên và làm mới trang mẹ khi đóng cửa sổ bật lên


94

Tôi đã mở một cửa sổ bật lên bằng window.open bằng JavaScript, tôi muốn làm mới trang mẹ khi tôi đóng cửa sổ bật lên này. (Sự kiện onclose?) Tôi có thể làm điều đó bằng cách nào?

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

1
Vui lòng kiểm tra điều này: stackoverflow.com/questions/18321323/… có thể giúp ai đó
NoNaMe

Câu trả lời:


231

Bạn có thể truy cập cửa sổ cha bằng cách sử dụng ' window.opener ', vì vậy, hãy viết một cái gì đó như sau trong cửa sổ con:

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

Tôi không biết window.opener, cảm ơn! Tôi luôn đặt cửa sổ người gọi trong một biến trong contentWindow của đứa trẻ. : - /
kay - SE là ác

3
Nếu bạn không kiểm soát JavaScript trên trang con (ví dụ: luồng OAuth) thì bạn sẽ cần kiểm tra popupWindow.closedbằng cách sử dụng setIntervalnhư trong giải pháp của @ Zuul.
jchook

34

Cửa sổ bật lên không có bất kỳ sự kiện đóng nào mà bạn có thể nghe.

Mặt khác, có một thuộc tính đóng được đặt thành true khi cửa sổ được đóng.

Bạn có thể đặt hẹn giờ để kiểm tra thuộc tính đã đóng đó và thực hiện như sau:

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); 

Hãy xem ví dụ Fiddle đang hoạt động này !


1
tôi không muốn sử dụng bộ đếm thời gian! bất kỳ ý tưởng nào khác?
ArMaN

1
Hơi khó hiểu nhưng tôi nghĩ sử dụng bộ đếm thời gian sẽ hoạt động tốt nhất trên tất cả các trình duyệt.
kay - SE is evil

Đây cũng là giải pháp tốt nhất nếu cửa sổ bật lên có một số trang trước khi nó đóng, vì sự kiện onunload chỉ được kích hoạt sau khi người dùng điều hướng khỏi trang đầu tiên.
AntonChanning

14

trên trang con của bạn, hãy đặt những thứ sau:

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

<body onbeforeunload="refreshAndClose();">

nhưng là một thiết kế giao diện người dùng tốt, bạn nên sử dụng Đóng buttonvì nó thân thiện với người dùng hơn. xem mã bên dưới.

<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' />

khi cửa sổ bật lên được đóng, chứ không phải khi người dùng nhấp vào nút để làm mới trang và đóng cửa sổ bật lên
gengkev

@gengkev, tôi biết OP muốn đính kèm sự kiện vào chế độ đóng cửa sổ, nhưng tôi tin rằng sử dụng nút là một thiết kế giao diện người dùng tốt hơn. tuy nhiên, tôi đã bao gồm mã cho cả hai. xin vui lòng tư vấn.
Ray Cheng

Tôi đã sử dụng <body onbeforeunload = "refreshAndClose ();"> <script type = "text / javascript"> function refreshAndClose () {window.opener.location.reload (true); } self.close (); </script>
steve0nz

3

Tôi sử dụng cái này:

<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()''>

khi cửa sổ đóng lại thì làm mới cửa sổ mẹ.


2

window.open sẽ trả về một tham chiếu đến cửa sổ mới được tạo, miễn là URL được mở tuân thủ Chính sách Nguồn gốc Giống nhau .

Điều này sẽ hoạt động:

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

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

Sẽ không hoạt động nếu người dùng có thể theo các liên kết trong cửa sổ đã mở. Và tôi khá chắc chắn rằng một sự kiện không tải sẽ được đưa ra trước khi URL đích được tải lần đầu tiên, vì bạn hoàn toàn để trống about:. (+1 vì đã đề cập đến SOP)
kay - SE is evil

2

Trong trường hợp của tôi, tôi đã mở một cửa sổ bật lên khi nhấp vào nút liên kết trong trang mẹ. Để làm mới cha mẹ khi đóng con bằng

window.opener.location.reload();

trong cửa sổ con gây ra mở lại cửa sổ con (Có thể là do Chế độ xem, tôi đoán. Hãy sửa cho tôi Nếu tôi sai). Vì vậy, tôi quyết định không tải lại trang trong trang gốc và tải lại trang chỉ định cùng một url cho nó.

Để tránh cửa sổ bật lên mở lại sau khi đóng cửa sổ bật lên, điều này có thể hữu ích,

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

1

Nếu ứng dụng của bạn chạy trên trình duyệt hỗ trợ HTML5. Bạn có thể sử dụng postMessage . Ví dụ được đưa ra ở đó khá giống với của bạn.


"Nếu không, bạn không thể giao tiếp giữa các cửa sổ khác nhau." sai. Kỹ thuật này vẫn có thể thực hiện được, mặc dù tôi muốn giới thiệu câu trả lời từ @Moses
gengkev 29/05

-1 đã bị xóa. Nếu bạn đưa ra một ví dụ nhỏ, bạn thậm chí sẽ nhận được +1 ;-)
kay - SE là ác

Đừng bận tâm. Nhưng tôi không nghĩ rằng window.opener là OK cho IE. Tôi sẽ thử.
Chris Li

1
@kay, hoạt động tuyệt vời trong IE7, 8. Rất hay, tôi không biết nó trước đây. +1 cho Moses.
Chris Li

1
@ArMaN: jsfiddle.net/8c2e4/10 , sử dụng window.opener. Bạn có thể sử dụng điều này để kiểm tra môi trường của mình.
Chris Li

1

Thử cái này

        self.opener.location.reload(); 

Mở cửa sổ gốc của cửa sổ hiện tại và tải lại vị trí.


0

Bạn có thể truy cập trang chính bằng lệnh cha (cha là cửa sổ) sau bước bạn có thể thực hiện mọi thứ ...

    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

Bạn có thể sử dụng mã dưới đây trong trang mẹ.

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

0

Mã sau sẽ quản lý để làm mới bài đăng đóng cửa sổ mẹ:

function ManageQB_PopUp() {
            $(document).ready(function () {
                window.close();
            });
            window.onunload = function () {
                var win = window.opener;
                if (!win.closed) {
                    window.opener.location.reload();
                }
            };
        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.