23

Próbuję utworzyć rozszerzenie Chrome, które zastąpi Delicious bookmarklet. Wiem, że istnieje już rozszerzenie, które to robi, ale problem z tym rozszerzeniem polega na tym, że po dodaniu zakładki do strony, okno podręczne pozostaje otwarte (w przeciwieństwie do używania bookmarkletu, gdzie popup zamyka się po przesłaniu formularza. rozbudowa i wpadł na ten sam problemZamknięcie okna popup utworzonego przez rozszerzenie Google Chrome

Oto mój kod.

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'); 
} 

Kiedy klikam przycisk Delicious, popup pojawia się w porządku i mogę zapisać zakładkę, ale po kliknięciu "Zapisz", popup nie zamyka się. Oba alarmy pojawiają się, ale self.close() nic nie robi. Po usunięciu zaznaczenia adresu URL w pliku contentscript.js wyskakujące okienko pojawia się normalnie, pierwszy alert uruchamia się natychmiast, a okienko zamyka się (tak jak powinno).

Dlaczego to nie działa? Wygląda na to, że Chrome uniemożliwia mi wykonanie self.close(). Czy Delicious robi coś? Czy to coś innego?

Pliki są tutaj jeśli chcesz je: [link usunięty, ponieważ drop.io wyszedł z działalności]

+0

Okno automatycznie zamyka się dla mnie. Używam dość domyślnej wersji Chrome, jeśli to robi jakąkolwiek różnicę. –

Odpowiedz

18

Spróbuj window.close(), ale to prawdopodobnie nie działa.

Podczas tworzenia zwykłego okna (zamiast wyskakującego okna przeglądarki) można je zamknąć za pomocą chrome.tabs.remove() ze strony w tle. Możesz również wykryć to okno ze strony w tle. Coś takiego:

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

Nie jestem pewien, jak Chrome traktuje utworzone okna - jak karty lub okna. Jeśli jako windows, powyższy kod będzie trochę inny.

+0

To działa idealnie, dzięki. –

+8

window.close() działa. Jeśli chcesz zamknąć popup po wysłaniu żądania do innej zakładki, upewnij się, że zamkniesz wyskakujące okienko w wywołaniu zwrotnym, a zakładka musi zostać wysłana co najmniej pustą odpowiedzią. –

9

Znalazłem bardzo łatwą pracę nad tym. Wystarczy ustawić wybraną kartę na True i Popup zniknie, jak to ...

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

Nie działa dla mnie. – Nakilon

+4

'chrome.tabs.getSelected' jest już nieaktualne. –

0

Znalazłem takie rozwiązanie: chrome.tabs.update({ active: true }); Ta pojedyncza linia kodu zamyka okienko działaniem przeglądarki. Nie musisz nawet przekazywać tab.id tam, ponieważ domyślnie jest ustawiony na id bieżącej karty. Uruchamiam go w tle, ale wygląda na to, że można go uruchomić wszędzie w rozszerzeniu.

+0

To niestety nie zadziałało. Aktualizuję z podobnego kodu getSelected() opublikowanego na tej stronie i napisałem ten kod dokładnie spodziewając się, że zadziała, z tego co mówią doktorzy. – offthat

+0

Może to zależeć od wielu okoliczności. Gdzie nazywasz tę metodę? Może wewnątrz jakiegoś programu obsługi wywołania zwrotnego, który nie zadzwonił i tak dalej ... –

+0

Skończyło się na tym, że przechowywałam odnośnik do wyskakującego okienka, dzięki czemu mogłem po prostu wywołać popupRef.Close() i to wystarczyło. – offthat

Powiązane problemy