23

Sto provando a creare un'estensione Chrome che sostituisce il bookmarklet Delicious. So che c'è già un'estensione che lo fa, ma il problema con tale estensione è che dopo aver aggiunto un segnalibro a un sito, la finestra popup rimane aperta (invece di usare il bookmarklet, dove il popup si chiude dopo aver inviato il modulo. estensione e corse nello stesso problemaChiusura finestra popup creata da Google Estensione Chrome

Ecco il mio codice:.

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

quando clicco sul pulsante di Delicious, il popup viene sull'indennità e posso salvare il preferito ma dopo faccio clic su "Salva", il pop-up non chiude. Entrambi gli avvisi vengono visualizzati, ma l'self.close() non sembra fare nulla. Quando rimuovo il controllo dell'URL in contentscript.js, il pop-up appare normalmente, il primo avviso si attiva subito e quindi il popup si chiude (come dovrebbe).

Perché non funziona? Non sembra che Chrome mi impedisca di eseguire self.close(). Delicious sta facendo qualcosa? È qualcos'altro?

I file sono qui se li volete: [link rimosso perché drop.io cessato l'attività]

+0

La finestra si chiude automaticamente. Sto eseguendo una versione abbastanza predefinita di Chrome se questo fa alcuna differenza. –

risposta

18

Prova window.close(), ma che probabilmente non avrebbe funzionato neanche.

Mentre si crea una finestra normale (anziché un popup di azione del browser), è possibile chiuderla utilizzando chrome.tabs.remove() da una pagina di sfondo. È inoltre possibile rilevare questa finestra da una pagina di sfondo. Qualcosa di simile:

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

Non sono sicuro di come Chrome tratti le finestre anche se - come schede o finestre. Se come Windows allora il codice sopra sarà un po 'diverso.

+0

Funziona perfettamente, grazie. –

+8

window.close() funziona. Se si desidera chiudere il popup dopo aver inviato una richiesta a un'altra scheda, assicurarsi di chiudere il popup nella richiamata e la scheda deve essere inviata almeno una risposta vuota. –

9

Ho trovato un lavoro molto semplice a questo. Basta impostare la scheda selezionata True e il popup scompare, come questo ...

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

Non funziona per me. – Nakilon

+4

'chrome.tabs.getSelected' è obsoleto ora. –

0

ho trovato questa soluzione: chrome.tabs.update({ active: true }); Questa singola riga di codice chiude la finestra pop-up dell'azione browser. Non c'è nemmeno bisogno di passare a tab.id lì perché per impostazione predefinita è impostato su id della scheda corrente. Lo eseguo in background ma sembra che possa essere eseguito ovunque nell'estensione.

+0

Questo purtroppo non ha funzionato per me. Sto aggiornando da codice simile getSelected() pubblicato su questa pagina e ho scritto questo codice esattamente aspettandomi che funzioni, da quello che dicono i documenti. – offthat

+0

Può dipendere da molte circostanze. Dove metti la chiamata di questo metodo? Forse all'interno di un gestore di callback che non ha chiamato e così via ... –

+0

Ho finito per memorizzare solo un riferimento al popup, in modo che potessi semplicemente chiamare popupRef.Close() e questo ha fatto il trucco. – offthat

Problemi correlati