El problema es que cuando invoco window.close()
o self.close()
no cierra la ventana. Ahora parece existir la creencia de que en Chrome no se puede cerrar mediante script ninguna ventana que no se haya creado. Eso es evidentemente falso, pero independientemente de lo que se supone que debe seguir haciendo, incluso si se requiere que aparezca una alerta para confirmar. Estos no están sucediendo.
Entonces, ¿alguien tiene un método real, funcional y comprobado para cerrar una ventana usando algo como javascript:window.close()
o javascript:self.close()
que realmente hace lo que se espera y algo que sucede bien en todos los navegadores que NO están basados en Chrome? Cualquier sugerencia sería muy apreciada y estoy buscando una solución específica de Javascript, nada de JQuery o implementación de terceros.
Actualización: Si bien gran parte de lo que se ha sugerido tiene serias limitaciones y problemas de usabilidad, la última sugerencia (específica de TamperMonkey) que se usa // @grant window.close
en el encabezado del script a menudo hará el truco incluso en aquellas pestañas que normalmente no pueden manejar el método de cierre. Si bien no es del todo ideal y no se generaliza en todos los casos, es una buena solución en mi caso.
window.close()
me funciona en cromo.window.close
no funciona como debería, creo que puede ser más útil que decir "no funciona".<a href="javascript:window.close">CLOSE</a>
Respuestas:
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 para
window.close()
: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 :
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 actualmentevulnerable al exploit de "auto redirección". Entonces, un código como este solía funcionar en general: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 simplewindow.close()
. P.EJ: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 establecerallow_scripts_to_close_windows
atrue
.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.
fuente
dom.allow_scripts_to_close_windows;false
a,true
pero supongo que no hay nada en Chrome sin piratear la fuente / reconstrucción, que es como lo solucioné por ahora. Sé y he hablado con el desarrollador de TM y en el reciente alfa / beta lo hemos puesto como una opción de compatibilidad (configuración del script) para que se ejecute en el estilo de hombre en el medio, funciona. Supongo que, salvo los hacks, no tenemos una solución limpia, lástima.window.close()
funcionará en Tampermonkey si establece@grant
un valor distinto denone
. Ver este hilo .Chrome solucionó los problemas de seguridad en la versión 36.0.1985.125
Chrome 36.0.1985.125 MIÉRCOLES, 16 DE JULIO DE 2014 Nota de la versión
Desde mi observación, esta actualización solucionó el problema al usar
window.close()
para cerrar la ventana emergente. Verá esto en la consola cuando falla, "Los scripts pueden cerrar solo las ventanas que abrió". Eso significa que las soluciones alternativas (respuesta de Brock Adams) pueden no funcionar en la última versión.Entonces, en las versiones anteriores de Chrome, el bloque de código a continuación puede funcionar, pero no con esta actualización.
Para esta actualización, debe actualizar su código en consecuencia para cerrar la ventana emergente. Una de las soluciones es tomar la identificación de la ventana emergente y usar
Método para eliminarlo. La extensión de Chrome API de Windows se puede encontrar en chrome.windows .
En realidad, mi extensión de Chrome MarkView estaba enfrentando este problema y tuve que actualizar mi código para que funcione para esta actualización de Chrome. Por cierto, MarkView es una herramienta para leer y escribir Awesome Markdown Files, proporciona características que incluyen el esquema de contenido, tablas clasificables y resaltado de sintaxis de bloque de código con número de línea.
También creé esta publicación , cualquier comentario es bienvenido.
fuente
open(location, '_self').close();
: tenga en cuenta el uso del valor de retorno deopen()
. Esto todavía funciona en Chrome36.0.1985.125 m
open(location, '_self').close();
, recibí un error "No autorizado" en esto. Este error es diferente con 'window.close ()(warning on this"Scripts may close only the windows that were opened by it."). It looked like
open (location,' _self '). Close () ; `avanzó un poco, pero en mi caso no puede completarse. Gracias @ brock-adams por el comentario.chrome.windows.remove
dice que no pude encontrar el símbolo de cromo. ¿Cómo puedo resolver esto? ¿Necesito agregar algún tipo de referencia?En tampermonkey ahora puedes usar
Y luego simplemente llame
fuente
Estoy usando el método publicado por Brock Adams e incluso funciona en Firefox, si es iniciado por el usuario.
Lo llamo presionando un botón para que sea iniciado por el usuario , y todavía funciona bien con Chrome 35-40, Internet Explorer 11, Safari 7-8 y TAMBIÉN Firefox 29-35. Probé usando la versión 8.1 de Windows y Mac OS X 10.6, 10.9 y 10.10 si eso es diferente.
Código de ventana de cierre automático (en la página que se cierra)
El código completo que se utilizará en la ventana abierta por el usuario que puede cerrarse a sí mismo:
window_to_close.htm
JavaScript:
HTML:
Pruebe esta página de prueba: (ahora probado en Chrome 40 y Firefox 35)
http://browserstrangeness.bitbucket.io/window_close_tester.htm
Código de apertura de ventana (en una página que abre la página anterior)
Para que esto funcione, la compatibilidad entre navegadores impuesta por la seguridad requiere que la ventana que se va a cerrar ya debe haber sido abierta por el usuario haciendo clic en un botón dentro del mismo dominio del sitio.
Por ejemplo, la ventana que usa el método anterior para cerrarse, se puede abrir desde una página usando este código (código proporcionado desde mi página de ejemplo vinculada anteriormente):
window_close_tester.htm
JavaScript:
HTML:
fuente
<button onclick="open(location,'_self').close()" >Close Window</button>
. ¿Estoy haciendo algo obviamente mal? Me parece que esto también es iniciado por el usuario. Tenga en cuenta que obtengo el mismo resultado si uso a<button>
o an<input type="button">
.window.open('', '_self', ''); window.close();
pero funcionaba conopen(location, '_self').close();
Muchas personas todavía están tratando de encontrar una manera de cerrar el navegador Chrome con JavaScript. El siguiente método solo funciona cuando usas Chrome como lanzador de aplicaciones: ¡kiosco, por ejemplo!
He probado lo siguiente:
Estoy usando la siguiente extensión: Cerrar Kiosk
Estoy siguiendo las instrucciones de uso y parece funcionar bien (asegúrese de borrar el caché mientras realiza las pruebas). El javascript que uso es (adjunto al evento click):
Espero que eso ayude a alguien, ya que es la única solución de trabajo que he encontrado.
Nota: Parece que la extensión se ejecuta en segundo plano y agrega un icono de bandeja de Chrome. Tiene la siguiente opción marcada: "Dejar que Chrome se ejecute en segundo plano" (o texto similar). Es posible que tengas que jugar con él, hasta que funcione para ti. Lo desmarqué y ahora funciona bien.
fuente
A pesar de pensar que es "evidentemente falso", lo que usted dice "parece ser una creencia" es realmente correcto. La documentación de Mozilla para window.close dice
Dices que se supone que "todavía debe hacerlo", pero no creo que encuentres ninguna referencia que respalde eso, ¿tal vez has recordado algo mal?
fuente
Encontré una nueva forma que me funciona perfectamente
fuente
El siguiente código funcionó para mí:
Probado en Chrome 43.0.2357.81
fuente
Esto puede ser viejo, pero respondamos.
Yo uso top.close () para cerrar una pestaña. window.close () u otro abierto ... cerrar no funcionó para mí.
fuente
"Scripts may not close windows that were not opened by script."
problema mencionado en otras respuestas.En mi caso, la página necesitaba cerrarse, pero puede haber sido abierta por un enlace y, por
window.close
lo tanto, podría fallar.La solución que elegí es emitir el
window.close
, seguido de unwindow.setTimeout
que redirige a una página diferente.De esa manera, si
window.close
tiene éxito, la ejecución en esa página se detiene, pero si falla, en un segundo, redirigirá a una página diferente.fuente
Esta respuesta de Brock me funcionó. No se debe permitir que javascript cierre una ventana que no fue abierta por ese mismo javascript.
Solo puedo cerrar la ventana secundaria si lo voy a cerrar desde el javascript primario. entonces en mi padre puedo hacer algo como esto.
fuente
También puede intentar usar mi código a continuación. Esto también lo ayudará a redirigir su ventana principal:
Padre:
Surgir:
fuente
Para TamperMonkey:
Ref: https://www.tampermonkey.net/documentation.php#_grant
fuente
Solo si abre una nueva ventana usando window.open (), la nueva ventana podrá cerrarse usando el código como he mencionado anteriormente. Esto funciona perfectamente para mí :) Nota: nunca use href para abrir la página en una pestaña nueva. Window.close () no funciona con "href". Use window.open () en su lugar.
fuente
Quería compartir mi "solución" con este problema. Parece que la mayoría de nosotros estamos tratando de cerrar una ventana del navegador en una sesión estándar del navegador, donde un usuario visita un sitio web u otro, después de haber visitado otros sitios web, y antes de visitar más.
Sin embargo, mi situación es que estoy creando una aplicación web para un dispositivo que esencialmente será lo único que hará el dispositivo. Lo inicias, inicia Chrome y navega a nuestra aplicación. Ni siquiera está conectado a Internet, los servidores con los que habla están en nuestros contenedores Docker locales. El usuario necesita una forma de cerrar la aplicación (también conocida como Chrome) para poder acceder al terminal para realizar actualizaciones del sistema.
Entonces se inicia, inicia Chrome en modo quiosco, en la dirección correcta ya. Esto sucede para satisfacer fácilmente la segunda opción en la especificación:
¡Simplemente llamar
window.close()
desde mi aplicación de kiosco simplemente funciona !fuente
Pruebe algo como esto onclick = "return self.close ()"
fuente