2010-02-23 45 views
15

Tôi đang viết một tiện ích mở rộng của google chrome với cửa sổ bật lên và trang nền. Cửa sổ bật lên đăng ký các sự kiện nhất định mà nền tạo ra và tôi muốn hủy đăng ký khỏi các sự kiện đó khi cửa sổ bật lên biến mất. Tuy nhiên, tôi không thấy một trong các sự kiện onbeforeunload hoặc onunload được tạo từ cửa sổ bật lên. Những sự kiện này có bị sa thải không? Nếu không, bất kỳ ý tưởng về cách chụp popup gần?Sự kiện onbeforeunload có kích hoạt cho popup.html trong tiện ích mở rộng google chrome không?

+1

Tôi có câu hỏi chính xác này. Bạn đã bao giờ tìm thấy câu trả lời chưa? –

Trả lời

1

Tôi đã gặp phải một vấn đề tương tự. Trong trường hợp của tôi, tôi đã đặt trọng tâm vào một phần tử nằm trong trang bật lên. Vì vậy, khi cửa sổ bật lên bị đóng, yếu tố mất tiêu điểm và tôi có thể bắt sự kiện mờ.

+0

Thủ thuật này không hiệu quả đối với tôi - thực sự hy vọng - nhưng không được. –

30

"beforeunload" là không phải được kích hoạt cho các cửa sổ bật lên hành động của trình duyệt. Tin tôi đi, tôi đã thử. "dỡ bỏ" nên được bắn một cách chính xác, tuy nhiên, vì vậy hãy lắng nghe điều đó.

Thực ra, tôi có một hệ thống tương tự tại chỗ, cho phép bạn đính kèm các sự kiện bằng cách sử dụng addEventListener và chúng được dọn dẹp tự động khi sự kiện dỡ tải cháy.

Dưới đây là một mẹo nhỏ: rõ ràng là bạn không thể sử dụng console.log, bởi vì thời gian xảy ra sự kiện dỡ tải, đã quá muộn. Tuy nhiên, bạn có thể làm điều này:

var background = chrome.extension.getBackgroundPage(); 

addEventListener("unload", function (event) { 
    background.console.log(event.type); 
}, true); 

Bằng cách sử dụng đoạn mã trên, bạn có thể mở giao diện điều khiển trang nền, mà nên cho thấy sự kiện dỡ bỏ là bắn chính xác.

+0

Cảm ơn bạn đã có mẹo điều khiển nền! Khá hữu dụng! –

+0

@AlexStack Tôi đã hoàn nguyên chỉnh sửa của bạn. 'chrome.runtime.getBackgroundPage' không tương đương - nó không đồng bộ. – Xan

+0

Ít nhất với một trang sự kiện và sử dụng 'chrome.runtime.getBackgroundPage()' để thực hiện cuộc gọi đến trang nền để đăng nhập một cái gì đó, tôi không thấy công việc này cho các sự kiện 'unload'. – jdunning

0

Nếu bạn đã chuyển sang sử dụng event pages thay vì trang nền trong tiện ích của mình, cách được khuyến nghị truy cập vào nó là gọi chrome.runtime.getBackgroundPage() với chức năng được gọi trở lại với tham chiếu trang nền.

Tuy nhiên, nếu bạn cố gắng để có được những trang nền trong một handler onbeforeunload, như thế này:

document.addEventListener("beforeunload", function() { 
    chrome.runtime.getBackgroundPage(function(backgroundPage) { 
     backgroundPage.log("unloading"); 
    }); 
}); 

Việc gọi lại dường như không bắn trước khi trang unloads, do đó log() cuộc gọi không bao giờ được thực hiện.

Trong một nhận xét ở trên, Pauan đề xuất sử dụng chrome.extension.getBackgroundPage() để tải trang. Cách duy nhất tôi có thể nhận được rằng để làm việc không phải là để tạo ra các handler với addEventListener(). Thay vào đó, tôi phải đi học cũ và đặt người xử lý trực tiếp trên window:

window.onbeforeunload = function() { 
    chrome.extension.getBackgroundPage().log("unloading"); 
}; 

Điều đó cuối cùng cũng được chuyển đến trang nền.

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