2010-08-02 24 views
14

Tôi đang phát triển tiện ích cho Google Chrome. Kịch bản nền của tôi, mọi lúc, cho phép trên máy chủ sử dụng API XMPP và đăng ký một nút PubSub. Tôi cần phải hủy đăng ký trên lối ra, nếu không đăng ký giả sẽ vẫn còn trên máy chủ. Có bất kỳ sự kiện onBrowserClose nào trong API tiện ích mở rộng của Google Chrome không?Sự kiện onBrowserĐóng góp cho tiện ích mở rộng của Google Chrome?

+1

Hãy nhớ rằng có nhiều cách khác để trình duyệt thoát, bao gồm cả tắt nguồn và lỗi. Ngay cả khi có một cách đáng tin cậy 100% để kiểm tra trình duyệt thoát bình thường, bạn vẫn có lỗ hổng. –

Trả lời

9

Không có sự kiện như vậy trong API tiện ích của Chrome.

Tuy nhiên, sự kiện chrome.windows.onRemoved kích hoạt mỗi khi cửa sổ đóng. Tôi cho rằng bạn có thể kiểm tra sự kiện này nếu bạn đóng cửa sổ cuối cùng, nhưng không may là do bản chất không đồng bộ của Chrome này không hoạt động.

Tôi đã thử chạy một yêu cầu AJAX đơn giản trong trình xử lý sự kiện onRemoved. Yêu cầu AJAX không bao giờ đến máy chủ, vì Chrome đã đóng trước khi chạy sự kiện (hoặc chỉ bỏ qua nó).

Đặt câu trả lời cuối cùng là: Không, hiện tại bạn không thể, theo như tôi biết. Bạn có thể muốn sao báo cáo lỗi sau tại số http://crbug.com/30885 để được chú ý khi cập nhật.

+0

Cảm ơn bạn đã trả lời, thực sự tôi quyết định theo học trường cũ, chỉ cần lưu thông tin đăng ký trước đó vào localstorage và hủy đăng ký khi kịch bản nền được tải lại =) – simple

0

Thêm sự kiện đóng trình duyệt là một yêu cầu khá thường xuyên. Star http://crbug.com/30885 để cập nhật. Và đọc báo cáo lỗi cho một thông minh hack để phát hiện khi trình duyệt được tắt thông qua một phím bấm.

4

Nếu bạn gặp trường hợp khi số lượng tab đang mở bằng 0, bạn có thể coi đó là sự kiện Chrome onClose. Trong trường hợp của tôi, tôi phải hủy thông báo trên màn hình trước khi Chrome đóng vì nó đã bị lỗi. Đây là cách tôi đã làm nó:

1. Khởi tạo một NUM_TABS biến bằng cách sử dụng như sau:
chrome.tabs.getAllInWindow(null, function(tabs){ 
    console.log("Initial tab count: " + tabs.length); 
    num_tabs = tabs.length; 
}); 
2. NUM_TABS Tăng khi một tab được tạo ra:
chrome.tabs.onCreated.addListener(function(tab){ 
    num_tabs++; 
    console.log("Tab created event caught. Open tabs #: " + num_tabs); 
}); 
3. Decrement num_tabs khi tab bị xóa và chạy trình duyệt của bạn trên trình xử lý sự kiện nếu num_tabs = 0
chrome.tabs.onRemoved.addListener(function(tabId){ 
    num_tabs--; 
    console.log("Tab removed event caught. Open tabs #: " + num_tabs); 
    if(num_tabs == 0) 
     notification.cancel(); 
}); 
+0

Điều này có làm việc ngay cả khi tính chất không đồng bộ của chrome không? –

+0

Nếu trình duyệt của bạn có tiện ích mở rộng có quyền "nền", hãy tham khảo phần này -> https://developer.chrome.com/extensions/declare_permissions, chrome sẽ không bị thoát ngay cả khi bạn cho rằng nó có. Bạn phải dứt khoát chấm dứt quá trình hoặc buộc bỏ hoặc một cái gì đó. – ankitG

3

một này làm việc cho tôi:

chrome.windows.onRemoved.addListener(function(windowId){ 
    alert("!! Exiting the Browser !!"); 
}); 

Phải mất chrome.windows hơn chrome.tabs.

+2

Bạn có thể có nhiều cửa sổ Chrome và thao tác này sẽ kích hoạt mỗi khi một số cửa sổ đóng, không chỉ trên cửa sổ cuối cùng đóng. – s3m3n

1

TL; DR: Hãy thử sự kiện window.onunload, nó hoạt động trong một số trường hợp.

Như đã đề cập trước đây, chúng tôi thường không thể xử lý một sự kiện như sự kiện onBrowserClose và ngăn trình duyệt đóng lại. Nhưng đối với một số trường hợp, chúng tôi có thể sử dụng sự kiện window.onunload để làm điều gì đó đồng bộ và nó hoạt động nếu thực sự đồng bộ.

Từ kinh nghiệm của tôi, bạn có thể ít nhất là:

  • Lưu một số thông tin trong (ví dụ bản ghi) trong HTML5 localStorage (đó là đồng bộ).
  • Gọi một số không đồng bộ chức năng API mở rộng chrome nhưng bạn không thể nhận được kết quả. (Nó hoạt động cho tôi! Yay!)
  • Thực hiện đồng bộ XMLHTTPRequest (vâng, đôi khi nó hoạt động).
Các vấn đề liên quan