2009-07-10 43 views
9

Tôi đã hỏi câu hỏi này trước đây và vấn đề đã được giải quyết một nửa theo nghĩa tôi đã được giúp đỡ để tìm ra rằng Javascript có một số bảo mật khó khăn tại chỗ.Làm thế nào để chạy chức năng của cửa sổ cha khi cửa sổ con đóng?

Điều tôi đã học được: Cửa sổ chính sẽ mở cửa sổ con. Cửa sổ con chuyển hướng đến một tên miền khác và được chuyển hướng trở lại. Nó cố gắng để tắt một chức năng của cửa sổ cha mẹ khi đóng cửa chính nó.

window.opener.startLoad(); 

Điều này dẫn đến sự cố (bảo mật) và sẽ không hoạt động.

(một nửa) Vấn đề mới: Làm cách nào để có cửa sổ mở cửa sổ con và khi nào đóng một chức năng trong cửa sổ chính?

Tôi cần một cách rất hiệu quả để làm điều này vì điều này sẽ xảy ra rất nhiều!

Cảm ơn bạn đã được trợ giúp.

+0

Để trả lời nhận xét mới nhất của bạn về câu trả lời của tôi, tôi sợ tôi không thể nghĩ ra lý do nó sẽ không gọi chức năng khi cửa sổ đóng. Bạn có thể đăng mã của bạn, nơi bạn mở cửa sổ, và chức năng mà bạn đang cố gắng gọi khi nó đóng? Tôi có thể giúp bạn nhiều hơn, nhưng ngay bây giờ tôi đã hết ý tưởng. – Sean

Trả lời

19

Hãy thử điều này:

var win = window.open(url, name); 
win.onunload = afterChildClose; // afterChildClose() is the function. 
win.close(); // afterChildClose() should fire now. 

Tất cả các mã này sẽ được bố trí và thực hiện trong javascript cửa sổ của cha mẹ (kể cả afterChildClose()). Bạn đang tạo cửa sổ và gán hàm cho sự kiện unload.

Ồ, một điều tôi vừa nghĩ đến. Nếu cửa sổ con làm mới hoặc điều hướng đến một url khác, sự kiện onunload cũng sẽ kích hoạt. Nếu bạn chỉ muốn sự kiện kích hoạt khi cửa sổ đóng, bạn nên bao gồm một kiểm tra trong afterChildClose() trên win.closed.

CHỈNH SỬA: Đây là mã cho hai trang mẫu tôi đặt lại với nhau để dùng thử.

cửa sổ phụ huynh:

<html> 
<body> 
<script type="text/javascript"> 
    var win = window.open("secondwindow.html", "woo"); 
    win.onunload =onun; 

    function onun() { 
     if(win.location != "about:blank") // This is so that the function 
              // doesn't do anything when the 
              // window is first opened. 
     { 
      alert("closed"); 
     } 
    } 
</script> 
</body> 
</html> 

cửa sổ con ("secondwindow.html"):

<html> 
<body> 
<script type="text/javascript"> 
    setTimeout('window.close();', 5000); 
</script> 
</body> 
</html> 

Khi tôi cố gắng mở tài liệu đầu tiên trong firefox, nó sẽ mở ra cửa sổ, cửa sổ chờ đợi 5 giây và thoát, và tài liệu đầu tiên cho thấy cảnh báo(), do đó, nó đang làm việc ngay cả khi cửa sổ phụ đóng cửa chính nó.

+0

Chức năng afterChildClose nằm ở đâu? – Abs

+0

Vì vậy, bạn có đóng cửa sổ Con từ cửa sổ chính không? – Abs

+0

Có, 'win.close()' là chỉ để chứng minh điều gì sẽ xảy ra khi cửa sổ con bị đóng. Mã trong câu trả lời của tôi không phải là giải pháp đầy đủ của bạn, nó chỉ cho thấy kỹ thuật mà sẽ cho phép bạn làm những gì bạn cần.Kỹ thuật đó là chụp đối tượng cửa sổ con sau khi bạn mở nó, và sau đó gán các sự kiện cho đối tượng đó (chẳng hạn như onunload). – Sean

2

Tôi đã hạ cánh ở đây tìm kiếm chức năng tương tự, nhưng không bao giờ có thể làm cho nó hoạt động với khả năng tương thích giữa các trình duyệt. Vì vậy, đây là một cách khác để thực thi mã khi cửa sổ con đóng:

var win = window.open("http://www.google.com"); 

var winClosed = setInterval(function() { 

    if (win.closed) { 
     clearInterval(winClosed); 
     location.assign("http://www.bing.com/"); //Execute your code here 
    } 

}, 250); 

Nó không sử dụng bất kỳ trình xử lý sự kiện nào từ cửa sổ con và không cần sửa đổi nội dung của cửa sổ con.

Các vấn đề liên quan