23

Tôi đang cố gắng tạo tiện ích mở rộng của Chrome thay thế cho bookmarklet Delicious. Tôi biết đã có phần mở rộng, nhưng vấn đề với phần mở rộng đó là sau khi bạn đánh dấu một trang, cửa sổ bật lên vẫn mở (trái ngược với việc sử dụng bookmarklet, nơi cửa sổ bật lên tự đóng lại sau khi gửi biểu mẫu. mở rộng và chạy vào cùng một vấn đềĐóng cửa sổ bật lên được tạo bởi tiện ích Google Chrome

Dưới đây là mã của tôi:.

manifest.json:

{ 
    "name": "Delicious", 
    "version": "1.0", 
    "description": "Bookmark a site on Delicious", 
    "background_page": "background.html", 
    "permissions": [ 
    "tabs" 
    ], 
    "browser_action": { 
    "default_icon": "delicious.png" 
    }, 
    "content_scripts": [ 
    { 
     "matches": ["http://www.delicious.com/save*"], 
     "js": ["contentscript.js"] 
    } 
    ] 
} 

background.html:

<html><script> 
chrome.browserAction.onClicked.addListener(function(tab) { 
    chrome.tabs.getSelected(null, function(tab) { 
    w = window.open('http://delicious.com/save?url='+ 
      encodeURIComponent(tab.url)+ 
      '&title='+encodeURIComponent(tab.title)+ 
      '&v=5&noui=1&jump=close', 
     'deliciousuiv5', 
     'location=yes,links=no,scrollbars=no,toolbar=no,width=550,height=550'); 
    }); 
}); 
</script></html> 

contentscript.js:

if (document.URL == 'http://www.delicious.com/save') 
{ 
    alert('closing...'); 
    self.close(); 
    alert('should have closed by now'); 
} 

Khi tôi bấm vào nút Delicious, popup đi lên tốt đẹp và tôi có thể lưu các bookmark nhưng sau khi tôi bấm vào nút "Save", popup không đóng. Cả hai cảnh báo đều xuất hiện, nhưng self.close() dường như không làm gì cả. Khi tôi xóa kiểm tra URL trong contentcript.js, cửa sổ bật lên xuất hiện như bình thường, cảnh báo đầu tiên kích hoạt ngay lập tức và sau đó cửa sổ bật lên đóng lại chính nó (vì nó nên).

Tại sao tính năng này không hoạt động? Có vẻ như Chrome không ngăn tôi làm self.close(). Delicious có làm gì không? Có cái gì khác?

Các tập tin đang ở đây nếu bạn muốn họ: [link loại bỏ vì drop.io đi ra ngoài của doanh nghiệp]

+0

Cửa sổ tự động đóng lại. Tôi đang chạy phiên bản Chrome khá mặc định nếu điều đó tạo ra bất kỳ sự khác biệt nào. –

Trả lời

18

Hãy thử window.close(), nhưng điều đó có lẽ sẽ không làm việc, hoặc.

Vì bạn đang tạo cửa sổ thông thường (chứ không phải là cửa sổ bật lên hành động của trình duyệt), khi đó bạn có thể đóng cửa sổ bằng cách sử dụng chrome.tabs.remove() từ trang nền. Bạn cũng có thể phát hiện cửa sổ này từ một trang nền. Một cái gì đó như:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
    if(changeInfo.status == "loading") { 
     if(tab.url == "http://www.delicious.com/save") { 
      chrome.tabs.remove(tabId); 
     } 
    } 
}); 

Tôi không biết Chrome xử lý cửa sổ được tạo ra như thế nào - dưới dạng tab hoặc cửa sổ. Nếu như các cửa sổ thì mã trên sẽ khác một chút.

+0

Điều đó hoạt động hoàn hảo, cảm ơn. –

+8

window.close() hoạt động. Nếu bạn muốn đóng cửa sổ bật lên sau khi gửi yêu cầu đến một tab khác thì hãy đảm bảo bạn đóng cửa sổ bật lên trong cuộc gọi lại và tab phải được gửi ít nhất một phản hồi trống. –

9

Tôi tìm thấy một công việc rất dễ dàng xung quanh việc này. Bạn chỉ cần đặt tab chọn True và Popup biến mất, như thế này ...

// remove popup by selecting the tab 
chrome.tabs.getSelected(null, function(tab) { 
    chrome.tabs.update(tab.id, { selected: true }) 
}); 
+1

Không hiệu quả với tôi. – Nakilon

+4

'chrome.tabs.getSelected' đã lỗi thời. –

0

tôi đã tìm thấy giải pháp này: chrome.tabs.update({ active: true }); này dòng mã đóng cửa sổ popup hành động trình duyệt. Bạn thậm chí không cần phải chuyển tab.id ở đó vì theo mặc định nó được đặt thành id của tab hiện tại. Tôi chạy nó trong trang nền nhưng dường như nó có thể được chạy khắp mọi nơi trong phần mở rộng.

+0

Rất tiếc, điều này không phù hợp với tôi. Tôi đang cập nhật từ mã getSelected() tương tự được đăng trên trang này và tôi đã viết mã này chính xác mong đợi nó hoạt động, từ những gì các tài liệu nói. – offthat

+0

Nó có thể phụ thuộc vào nhiều trường hợp. Bạn đặt cuộc gọi của phương thức này ở đâu? Có lẽ bên trong một số trình xử lý gọi lại không được gọi và cứ như vậy ... –

+0

Tôi vừa lưu trữ một tham chiếu đến cửa sổ bật lên, để tôi có thể gọi popupRef.Close() và điều đó đã thực hiện thủ thuật. – offthat

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