JavaScript ordinario no puede cerrar ventanas willy-nilly. Esta es una característica de seguridad, introducida hace un tiempo, para detener varias hazañas y molestias maliciosas.
De la última especificación de trabajo parawindow.close()
:
El close()
método en los objetos de Windows debería, si se cumplen todas las condiciones siguientes, cerrar el contexto de exploración A :
- El contexto de exploración A correspondiente se puede cerrar mediante script .
- El contexto de navegación del guión titular es familiarizarse con el contexto de navegación A .
- Se deja que el contexto de navegación del guión corresponde a navegar en el contexto de navegación A .
Un contexto de exploración se puede cerrar mediante secuencia de comandos si es un contexto de exploración auxiliar creado por una secuencia de comandos (a diferencia de una acción del usuario), o si se trata de un contexto de exploración cuyo historial de sesión contiene solo un documento.
Esto significa que, con una pequeña excepción, no se debe permitir que javascript cierre una ventana que no fue abierta por ese mismo javascript.
Chrome permite esa excepción, que no se aplica a los scripts de usuario, sin embargo, Firefox no. La implementación de Firefox dice :
Este método solo se puede llamar para ventanas que fueron abiertas por un script usando el window.open
método.
Si intenta utilizar window.close
un Greasemonkey / Tampermonkey / userscript obtendrá:
Firefox: el mensaje de error, " Scripts may not close windows that were not opened by script.
"
Chrome: simplemente falla en silencio.
La solución a largo plazo:
La mejor manera de lidiar con esto es hacer una extensión de Chrome y / o un complemento de Firefox en su lugar. Estos pueden cerrar de manera confiable la ventana actual.
Sin embargo, dado que los riesgos de seguridad, planteados por window.close
, son mucho menores para un script Greasemonkey / Tampermonkey; Greasemonkey y Tampermonkey podrían proporcionar razonablemente esta funcionalidad en su API (esencialmente empaquetando el trabajo de extensión para usted).
Considere hacer una solicitud de función.
Las soluciones hacky:
Chrome es actualmente vulnerable al exploit de "auto redirección". Entonces, un código como este solía funcionar en general:
open(location, '_self').close();
Este es un comportamiento defectuoso, IMO, y ahora (a partir de abril de 2015) está bloqueado en su mayoría. Seguirá funcionando desde el código inyectado solo si la pestaña está recién abierta y no tiene páginas en el historial de navegación. Por lo tanto, solo es útil en un conjunto muy pequeño de circunstancias.
Sin embargo, una variación aún funciona en Chrome (v43 y v44) más Tampermonkey (v3.11 o posterior) . Utilice una explícita @grant
y simple window.close()
. P.EJ:
// ==UserScript==
// @name window.close demo
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
setTimeout (window.close, 5000);
Gracias a zanetu por la actualización. Tenga en cuenta que esto no funcionará si solo hay una pestaña abierta. Solo cierra pestañas adicionales.
Firefox es seguro contra ese exploit. Entonces, la única forma de JavaScript es paralizar la configuración de seguridad, un navegador a la vez.
Puede abrir about:config
y establecer
allow_scripts_to_close_windows
a true
.
Si su guión es para uso personal, continúe y hágalo. Si le pide a alguien más que active esa configuración, sería inteligente y justificado rechazarlo con prejuicios.
Actualmente no hay una configuración equivalente para Chrome.
window.close()
me funciona en cromo.