2011-01-24 17 views
12

Tôi đã nhìn thấy cách nhìn thấy nếu một cửa sổ một kịch bản cụ thể mở vẫn mở, nhưng nếu nó không?Làm cách nào để biết cửa sổ có tồn tại trong Javascript không?

Tôi có một cửa sổ nhỏ có nút để nhấp để tải cửa sổ lớn. Khi tôi đóng một cái lớn, tôi muốn một số onUnload hoặc onBeforeUnload để cháy iff cái nhỏ được đóng; nếu nó vẫn mở, những thủ tục đó sẽ không cháy. Tôi có thể chỉ đơn giản là một rắm não lớn nhưng tôi không thể tìm ra cách kiểm tra xem cửa sổ kia có mở không. Người lớn không mở nó, vì vậy tôi không thể chỉ đơn giản là ghi lại các xử lý từ mở nó.

Trong thuật ngữ ngắn hơn: Nếu cửa sổ A mở cửa sổ B, làm cách nào tôi có thể kiểm tra trong cửa sổ B nếu cửa sổ A vẫn tồn tại?

Trả lời

19
if(window.opener && !window.opener.closed) 
    alert('Yup, still there.'); 
+0

Oh. Vâng, đó là đơn giản. Đây là một câu hỏi tiếp theo, mặc dù ... nếu B được mở độc lập với A, có cách nào để nó xem A tồn tại không? Có một tên/mục tiêu cụ thể và tất cả mọi thứ, nó không giống như nó đang cố gắng để thần thánh những gì tôi có ý nghĩa của A, nó biết những gì tôi có nghĩa là A. – Andrew

+0

window.parent? Đó là dành cho khung, không dành cho cửa sổ bật lên –

+0

Oh, jeez. Cảm ơn, Juan. Vâng, tôi có nghĩa là 'opener', không phải 'cha mẹ'. Andrew: khóa liên quan sẽ là đối số windowName với 'window.open', nhưng tôi không biết bất kỳ cách nào để sử dụng nó ngoài một lệnh gọi khác đến' window.open', điều này khá phá hoại. – chaos

17

window.closed sẽ được đặt thành true nếu bạn bật cửa sổ và đóng cửa (theo tập lệnh hoặc người dùng).

var win = window.open('...')'; 
if (win.closed) 

trường hợp của bạn có vẻ là như sau:

Từ một cửa sổ popup, bạn có thể kiểm tra nếu cửa sổ mở ra nó vẫn còn đang mở bằng window.opener.closed

Nhận xử lý đến một cửa sổ theo tên

Tôi đã đề cập không có cách nào để chỉ xử lý cửa sổ theo tên trong nhận xét. Tuy nhiên, tôi đã làm một số nghiên cứu và thấy rằng các công trình sau đây trong FF/IE/Chrome; Đó là một hack, tôi đã không nhìn thấy nó được đề cập ở bất cứ nơi nào như hành vi mong đợi, vì vậy tôi sẽ không dựa vào nó quá nhiều, nhưng nó là thú vị để tìm thấy nó hoạt động! Trong mã của tôi, tôi vẫn chỉ cần chắc chắn để vượt qua xung quanh các tay cầm cần thiết.

//opened a window without storing a handle, but gave it a name 
window.open('/some/url', 'xxx'); 

// now I need to get a reference to that window 
// Calling open without setting a url gets you 
// a reference and doesn't reload the window 
var win = window.open('', 'xxx') 
+0

Cảm ơn. Điều gì nếu nó có thể được mở ra một cách khác hơn thông qua javascript gốc? (ví dụ: nếu C mở B, B có thể xem liệu A có đang mở không?) – Andrew

+0

Không, bạn không thể 'cầm' tay cầm vào một cửa sổ. Không có đăng ký toàn cầu các cửa sổ theo tên. Trong ví dụ của bạn, C có tạo A không? nếu nó đã làm, bạn nên lưu trữ xử lý đó 'A = window.open(); B = window.open(); B.A = A''. Sau đó B có thể kiểm tra 'if (! A.closed)'; –

+0

Cảm ơn bạn đã hack. Tôi có thể xem xét việc sử dụng điều đó, thực sự, nhưng ngay bây giờ tôi đang cố gắng làm cho nó sạch hơn và xây dựng một giải pháp hoàn toàn back-end. – Andrew

1

Sử dụng try {} and catch (err) {}.

try{ 
window.opener.document.body.getElementById('#elementId'); // do some action with window. opener 
} 
catch(err){ 
// if we are here then probably there is no window.opener 
window.close(); // closing this window or whatever you want 
} 
+0

Vâng, "có lẽ không có window.opener" không phải là một giải pháp chính xác.Câu hỏi này là hai tuổi và có một câu trả lời được chấp nhận. Trong tương lai, hãy đặt nỗ lực của bạn vào các câu hỏi mới hoặc những câu hỏi không có câu trả lời được chấp nhận;) – Mifeet

+1

@ Bỏ qua câu trả lời này không thỏa mãn tôi. Tôi chỉ muốn thêm một giải pháp thay thế và có thể là giải pháp tốt hơn nếu một người như tôi đến đây. Và không có gì buồn cười về "có lẽ". Bởi vì bắt có thể được kích hoạt không chỉ nếu window.opener không tồn tại nhưng khi mã của bạn đối phó với window.opener không hợp lệ. – Audrius

+1

Ok, cảm ơn vì đã làm rõ. Tuy nhiên, việc sử dụng try-catch không phải là một thực hành được khuyến nghị, ngoại lệ nên được sử dụng cho các trạng thái ngoại lệ, không phải là luồng thực thi bình thường. Kiểm tra nếu 'window.opener' được đặt là giải pháp tốt hơn. – Mifeet

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