O javascript comum não pode fechar as janelas à vontade. Esse é um recurso de segurança, introduzido há um tempo atrás, para impedir várias explorações e aborrecimentos maliciosos.
Das especificações de trabalho mais recentes parawindow.close()
:
O close()
método nos objetos Window deve, se todas as seguintes condições forem atendidas, fechar o contexto de navegação A :
- O contexto de navegação correspondente A pode ser fechado por script .
- O contexto de navegação do script titular é familiarizado com o contexto de navegação A .
- O contexto navegar do script titular está autorizado a navegar no contexto de navegação A .
Um contexto de navegação pode ser fechado por script se for um contexto de navegação auxiliar criado por um script (em oposição a uma ação do usuário) ou se for um contexto de navegação cujo histórico da sessão contenha apenas um documento.
Isso significa que, com uma pequena exceção, o javascript não deve fechar uma janela que não foi aberta pelo mesmo javascript.
O Chrome permite essa exceção - que não se aplica aos scripts dos usuários - no entanto, o Firefox não. A implementação do Firefox afirma claramente :
Este método só pode ser chamado para janelas que foram abertas por um script usando o window.open
método
Se você tentar usar window.close
um Greasemonkey / Tampermonkey / userscript, receberá:
Firefox: A mensagem de erro, " Scripts may not close windows that were not opened by script.
"
Chrome: falha silenciosamente.
A solução a longo prazo:
A melhor maneira de lidar com isso é criar uma extensão do Chrome e / ou complemento do Firefox. Eles podem fechar com segurança a janela atual.
No entanto, como os riscos à segurança, representados por window.close
, são muito menores para um script Greasemonkey / Tampermonkey; Greasemonkey e Tampermonkey poderiam fornecer razoavelmente essa funcionalidade em sua API (essencialmente empacotando o trabalho de extensão para você).
Considere fazer uma solicitação de recurso.
As soluções alternativas hacky:
Atualmente, o Chrome estava vulnerável à exploração de "redirecionamento automático". Portanto, códigos como este costumavam funcionar em geral:
open(location, '_self').close();
Esse é um comportamento de buggy, IMO, e está agora (em abril de 2015) bloqueado. Ele ainda funcionará a partir do código injetado apenas se a guia for aberta recentemente e não tiver páginas no histórico de navegação. Portanto, é útil apenas em um conjunto muito pequeno de circunstâncias.
No entanto, uma variação ainda funciona no Chrome (v43 e v44) e no Tampermonkey (v3.11 ou posterior) . Use um explícito @grant
e simples window.close()
. POR EXEMPLO:
// ==UserScript==
// @name window.close demo
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
setTimeout (window.close, 5000);
Obrigado a zanetu pela atualização. Observe que isso não funcionará se houver apenas uma guia aberta. Ele fecha apenas guias adicionais.
O Firefox é seguro contra essa exploração. Portanto, a única maneira de javascript é prejudicar as configurações de segurança, um navegador de cada vez.
Você pode abrir about:config
e configurar
allow_scripts_to_close_windows
como true
.
Se seu script é para uso pessoal, vá em frente e faça isso. Se você pedir a alguém para ativar essa configuração, eles seriam inteligentes e justificados, recusando-se com preconceito.
No momento, não há configurações equivalentes para o Chrome.
window.close()
funciona para mim no chrome.