javascript - make - Ventana emergente de cierre creada por la extensión de Google Chrome.
how to do a chrome extension (4)
Estoy intentando crear una extensión de Chrome que reemplaza al bookmarklet de Delicious. Sé que ya existe una extensión que lo hace, pero el problema con esa extensión es que después de marcar un sitio, la ventana emergente permanece abierta (en lugar de usar el bookmarklet, donde la ventana emergente se cierra después de enviar el formulario. Recreé el extensión y se topó con el mismo problema.
Aquí está mi código:
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'');
}
Cuando hago clic en el botón Delicioso, la ventana emergente aparece bien y puedo guardar el marcador, pero después de hacer clic en "Guardar", la ventana emergente no se cierra. Ambas alertas aparecen, pero self.close()
no parece hacer nada. Cuando elimino la comprobación de la URL en contentscript.js, aparece la ventana emergente con normalidad, la primera alerta se activa de inmediato y, a continuación, la ventana emergente se cierra (como debería).
¿Por qué no funciona esto? No parece que Chrome me esté impidiendo hacer self.close (). ¿Delicious está haciendo algo? ¿Es algo más?
Los archivos están aquí si los desea: [enlace eliminado porque drop.io salió del negocio]
Encontré un trabajo muy fácil alrededor de esto. Simplemente configura la pestaña seleccionada en Verdadero y la ventana emergente desaparece, de esta forma ...
// remove popup by selecting the tab
chrome.tabs.getSelected(null, function(tab) {
chrome.tabs.update(tab.id, { selected: true } )
});
He encontrado esta solución: chrome.tabs.update({ active: true });
Esta única línea de código cierra la ventana emergente de la acción del navegador. Incluso no es necesario pasar tab.id allí porque, de forma predeterminada, está configurado en id de la pestaña actual. Lo ejecuto en la página de fondo, pero parece que puede ejecutarse en cualquier parte de la extensión.
Intente window.close()
, pero probablemente tampoco funcione.
A medida que creas una ventana normal (en lugar de una ventana emergente de acción del navegador), puedes cerrarla usando chrome.tabs.remove()
desde una página de fondo. También puede detectar esta ventana desde una página de fondo. Algo como:
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if(changeInfo.status == "loading") {
if(tab.url == "http://www.delicious.com/save") {
chrome.tabs.remove(tabId);
}
}
});
Sin embargo, no estoy seguro de cómo trata Chrome las ventanas creadas, como pestañas o ventanas. Si como ventanas entonces el código anterior será un poco diferente.
getSelected no funciona para mí, así que encontré esta solución
chrome.tabs.create({url: ''https://www.google.com'', active: false});
en background.js necesitas solo
window.close();