2008-09-26 33 views
12

Tôi muốn tăng sự kiện khi cửa sổ bật lên bị đóng hoặc tốt hơn là trước khi đóng. Tôi đang lưu trữ đối tượng cửa sổ popup như một đối tượng, nhưng tôi không biết cách nào để liên kết với sự kiện đóng, hoặc một sự kiện ngay trước khi cửa sổ đóng lại.Làm cách nào để tăng sự kiện (jQuery hoặc vanilla Javascript) khi cửa sổ bật lên bị đóng?

var popupWindow = window.open("/popup.aspx", "popupWindow", "height=550,width=780"); 

Có cách nào để đăng ký sự kiện đóng bằng jQuery hay chỉ javascript thô? Tôi đang sử dụng jQuery và không thể thêm một thư viện khác, vì vậy nếu nó không thể được thực hiện trong jQuery tôi sẽ phải cuộn hệ thống sự kiện của riêng tôi bằng cách nào đó để nó sẽ làm việc trên tất cả các trình duyệt.

UPDATE:
Tôi đã cố gắng sử dụng các sự kiện dỡ bỏ trong jQuery và vì một lý do sự kiện này được nâng lên càng sớm càng bật lên tôi mở ra thay vì khi nó được đóng lại. Nếu tôi sử dụng Firebug để thiết lập một điểm ngắt để trì hoãn sự kiện unload được đăng ký, sự kiện dỡ bỏ hoạt động theo cách nó được cho là, nhưng vì lý do nào đó, nó không hoạt động chính xác khi javascript được phép thực thi một cách tự nhiên.

var popupWindow = window.open("/popup.aspx", "popupWindow", "height=550,width=780"); 
$(popupWindow.window).unload(function() { alert('hello'); }); 

Có ai có bất kỳ ý tưởng nào về lý do tại sao sự kiện dỡ hàng có thể tăng lên khi cửa sổ đang tải không?

Một bắt khác là tôi đã nhận thấy rằng "dỡ bỏ" sự kiện của jQuery không ở lại đăng ký vào cửa sổ như nó thường làm nếu tôi chỉ làm:

popupWindow.onunload = function(){alert('hello')}; 

Dường như để bỏ đăng ký từ sự kiện này mỗi thời gian nó được nâng lên. Đây có phải là vụ xảy ra? Nếu nó không được cho lỗi này (hoặc tính năng?) Trong jQuery, nó sẽ là tốt để có sự kiện được nâng lên khi tải kể từ khi tôi có thể kiểm tra các tài sản popupWindow.closed bên trong của sự kiện để đảm bảo cửa sổ đã thực sự đóng cửa.

Trả lời

2

Mã jQuery ví dụ cho trường hợp dỡ bỏ

$(window).unload(function() { alert("Bye now!"); });

Từ jQuery unload documentation

Edit:

Tôi chơi xung quanh và đã không thể có được phụ huynh cửa sổ để có thể thiết lập tải. Cách duy nhất tôi có thể làm cho nó hoạt động, là có kịch bản có trong cửa sổ popup html. Cửa sổ popup cũng cần tải jQuery. Tôi không có gì để dựa trên điều này, nhưng tôi tin rằng unload đang được kích hoạt, bởi vì về cơ bản cửa sổ popup đang được dỡ xuống từ phạm vi của cửa sổ cha. Chỉ cần đoán thôi.

0

Có một bắt nhỏ tôi phải đề cập liên quan đến việc trước đó đề cập đến onunload dựa trên kinh nghiệm trước đây của tôi:

Opera 9.0.x-9.2.x chỉ chạy window.onUnload nếu người dùng điều hướng đi từ một trang. Nếu người dùng thay vì đóng cửa sổ, sự kiện sẽ không bao giờ kích hoạt.Tôi nghi ngờ điều này đã được thực hiện để chống lại các vấn đề popup tự tải lại (nơi một popup có thể mở lại chính nó trên trang đóng).

Điều này rất có thể đã tiếp tục tồn tại với Opera 9.5.x. Các trình duyệt khác cũng có thể thực hiện điều này, nhưng tôi không tin IE hoặc Firefox làm.

0

Từ những gì tôi đã kiểm tra tải trọng jQuery chỉ là một trình bao bọc cho hàm gốc. Tôi có thể sai khi tôi không đào sâu.

Ví dụ này phù hợp với tôi.

$(document).ready(function(){ 
    $(window).unload(function(){ 
     alert('preget'); 
     $.get(
      '/some.php', 
      { request: 'some' } 
     ); 
     alert('postget'); 
    }); 
}); 

Hãy nhớ rằng một số browsers block the window.open requests on unload, IE for example.

18

Tôi tạo ra một sát để kiểm tra nếu cửa sổ đã bị đóng cửa:

var w = window.open("http://www.google.com", "_blank", 'top=442,width=480,height=460,resizable=yes', true); 
var watchClose = setInterval(function() { 
    if (w.closed) { 
    clearTimeout(watchClose); 
    //Do something here... 
    } 
}, 200); 
+0

vĩ đại, điều này giải quyết vấn đề của tôi;) –

7

Tôi đã thử các cách tiếp cận quan sát nhưng chạy vào "cho phép từ chối" vấn đề khi sử dụng này trong IE6. Điều này xảy ra do sự bất động sản khép kín không được truy cập đầy đủ xung quanh trường hợp đóng cửa sổ ... nhưng may mắn thay có một try {} xây dựng bắt nó hoạt động mặc dù: o)

var w = window.open("http://www.google.com", "_blank", 'top=442,width=480,height=460,resizable=yes', true); 

var watchClose = setInterval(function() { 
    try { 
     if (w.closed) { 
      clearTimeout(watchClose); 
      //Do something here... 
     } 
    } catch (e) {} 
}, 200); 

Cảm ơn bạn Magnus

3

Tôi nghĩ rằng tôi đã tìm ra những gì đang xảy ra:

Khi bạn sử dụng window.open nó sẽ mở một cửa sổ mới với vị trí "about: blank" và sau đó thay đổi nó thành url bạn đã cung cấp tại cuộc gọi hàm.

Vì vậy, sự kiện dỡ tải sẽ bị ràng buộc trước khi thay đổi từ "about: blank" thành url phải và được kích hoạt khi thay đổi xảy ra.

Tôi đã làm việc với JQuery làm điều này:

$(function(){ 
    var win = window.open('http://url-at-same-domain.com','Test', 'width=600,height=500'); 
    $(win).unload(function(){ 
     if(this.location == 'about:blank') 
     { 
      $(this).unload(function(){ 
       // do something here 
      }); 
     } 
    }); 
}); 
Các vấn đề liên quan