O problema é que quando eu invoco window.close()
ou self.close()
ele não fecha a janela. Agora, parece haver uma crença de que no Chrome você não pode fechar por script qualquer janela que não seja criada. Isso é evidentemente falso, mas independentemente disso ainda deve ser feito, mesmo que seja necessário exibir um alerta para confirmar. Isso não está acontecendo.
Então, alguém tem um método real, funcional e comprovado de fechar uma janela usando algo como javascript:window.close()
ou javascript:self.close()
que realmente faz o que é esperado e algo que acontece muito bem em todos os navegadores que NÃO são baseados no Chrome? Qualquer sugestão seria muito apreciada e estou procurando uma solução específica para Javascript, nada de JQuery ou implementação de terceiros.
Atualização: Embora muito do que foi sugerido tenha sérias limitações e problemas de usabilidade, a sugestão mais recente (específica para o TamperMonkey) usada // @grant window.close
no cabeçalho do script geralmente faz o truque mesmo nas guias que normalmente não conseguem lidar com o método close. Embora não seja inteiramente ideal e não generalize para todos os casos, é uma boa solução no meu caso.
fonte
window.close()
funciona para mim no chrome.window.close
não está funcionando da maneira que deveria, acho que pode ser mais útil do que dizer "não funciona".<a href="javascript:window.close">CLOSE</a>
Respostas:
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 para
window.close()
: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 :
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, oChrome estava vulnerável à exploração de "redirecionamento automático". Portanto, códigos como este costumavam funcionar em geral: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 simpleswindow.close()
. POR EXEMPLO: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 configurarallow_scripts_to_close_windows
comotrue
.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.
fonte
dom.allow_scripts_to_close_windows;false
quetrue
, mas acho que nada no Chrome sem cortar a fonte / reconstrução que é como eu comecei em torno dele por agora. Eu sei e conversei com o desenvolvedor da TM e, no recente alpha / beta, colocamos como uma opção de compatibilidade (configuração do script) para executar no estilo man-in-the-middle, funciona. Acho que, além dos hacks, não temos solução limpa, pena.window.close()
funcionará em Tampermonkey se você definir@grant
um valor diferente denone
. Veja este tópico .Chrome Corrigido os problemas de segurança na versão 36.0.1985.125
Chrome 36.0.1985.125 QUARTA-FEIRA, 16 DE JULHO DE 2014 Nota da versão
Pela minha observação, esta atualização corrigiu o problema de usar
window.close()
para fechar a janela pop-up. Você verá isso no console quando falhar: "Os scripts podem fechar apenas as janelas que foram abertas por ele". Isso significa que as soluções alternativas hacky (resposta de Brock Adams) podem não funcionar na versão mais recente.Portanto, nas versões lançadas anteriormente do Chrome, o bloco de códigos abaixo pode funcionar, mas não com esta atualização.
Para esta atualização, você deve atualizar seu código de acordo para fechar a janela pop-up. Uma das soluções é pegar o ID da janela pop-up e usar
método para removê-lo. A API do Windows para extensão do Chrome pode ser encontrada em chrome.windows .
Na verdade, minha extensão do Chrome MarkView estava enfrentando esse problema e tive que atualizar meu código para fazê-lo funcionar nesta atualização do Chrome. A propósito, o MarkView é uma ferramenta para ler e gravar arquivos impressionantes do Markdown, fornece recursos que incluem estrutura de tópicos de conteúdo, tabelas classificáveis e destaque da sintaxe do bloco de código com o número da linha.
Eu também criei este post , todos os comentários são bem-vindos.
fonte
open(location, '_self').close();
- observe o uso do valor de retorno deopen()
. Isso ainda funciona no Chrome36.0.1985.125 m
open(location, '_self').close();
erro "Não autorizado". Este erro é diferente com 'window.close ()(warning on this"Scripts may close only the windows that were opened by it."). It looked like
open (location,' _self '). Close (); `avançou um pouco, mas não pode ser concluído no meu caso. Obrigado @ brock-adams pelo comentário.chrome.windows.remove
diz que não foi possível encontrar o símbolo chrome. Como posso resolver isto? preciso adicionar algum tipo de referência?No tampermonkey agora você pode usar
E então simplesmente chame
fonte
Estou usando o método postado por Brock Adams e até funciona no Firefox, se for iniciado pelo usuário.
Chamo-o pressionando o botão para que ele seja iniciado pelo usuário e ainda funcione bem usando o Chrome 35-40, o Internet Explorer 11, o Safari 7-8 e o Firefox 29-35. Testei usando a versão 8.1 do Windows e Mac OS X 10.6, 10.9 e 10.10, se isso for diferente.
Código da janela de fechamento automático (na página que se fecha)
O código completo a ser usado na janela aberta pelo usuário que pode se fechar:
window_to_close.htm
JavaScript:
HTML:
Experimente esta página de teste: (Agora testado no Chrome 40 e Firefox 35)
http://browserstrangeness.bitbucket.io/window_close_tester.htm
Código do abridor de janelas (em uma página que abre a página acima)
Para fazer isso funcionar, a compatibilidade entre navegadores imposta pela segurança exige que a janela a ser fechada já tenha sido aberta pelo usuário clicando em um botão no mesmo domínio do site.
Por exemplo, a janela que usa o método acima para se fechar pode ser aberta em uma página usando este código (código fornecido na minha página de exemplo vinculada acima):
window_close_tester.htm
JavaScript:
HTML:
fonte
<button onclick="open(location,'_self').close()" >Close Window</button>
. Estou fazendo algo obviamente errado? Parece-me que isso também é iniciado pelo usuário. Observe que eu obtenho o mesmo resultado se eu usar um<button>
ou um<input type="button">
.window.open('', '_self', ''); window.close();
mas ele trabalhou comopen(location, '_self').close();
Muitas pessoas ainda estão tentando encontrar uma maneira de fechar o navegador Chrome usando javascript. O método a seguir só funciona quando você usa o Chrome como iniciador de aplicativos - quiosque por exemplo!
Eu testei o seguinte:
Estou usando a seguinte extensão: Close Kiosk
Estou seguindo as instruções de uso e parece que funciona muito bem (limpe o cache durante os testes). O javascript que eu uso é (anexado ao evento click):
Espero que ajude alguém, pois é a única solução de trabalho que encontrei.
Nota: parece que a extensão é executada em segundo plano e adiciona um ícone da bandeja do Chrome. Ele tem a seguinte opção marcada: "Deixe o Chrome executar em segundo plano" (ou texto semelhante). Você pode precisar brincar com ele, até que funcione para você. Eu desmarquei e agora funciona muito bem!
fonte
Apesar de pensar que é "patentemente falso", o que você diz "parece ser uma crença" está realmente correto. A documentação do Mozilla para window.close diz
Você diz que "ainda deve fazê-lo", mas acho que não encontrará nenhuma referência que suporte isso, talvez você tenha se lembrado de algo errado?
fonte
Eu encontrei uma nova maneira que funciona perfeitamente para mim
fonte
O código abaixo funcionou para mim -
Testado no Chrome 43.0.2357.81
fonte
Isso pode ser antigo, mas vamos responder.
Eu uso top.close () para fechar uma guia. window.close () ou outro open ... close não funcionou para mim.
fonte
"Scripts may not close windows that were not opened by script."
problema mencionado em outras respostas.No meu caso, a página precisava fechar, mas pode ter sido aberta por um link e, portanto
window.close
, falharia.A solução que escolhi é emitir o
window.close
, seguido por umwindow.setTimeout
que redireciona para uma página diferente.Dessa forma, se
window.close
for bem-sucedida, a execução nessa página será interrompida, mas se falhar, em um segundo, será redirecionada para uma página diferente.fonte
Esta resposta de Brock fez funcionar para mim. O javascript não deve ter permissão para fechar uma janela que não foi aberta pelo mesmo javascript.
Só posso fechar a janela filho se estiver a fechar a partir do javascript principal. então, em meus pais, eu posso fazer algo assim.
fonte
Você também pode tentar usar meu código abaixo. Isso também ajudará você a redirecionar sua janela principal:
Pai:
Aparecer:
fonte
Para o TamperMonkey:
Ref: https://www.tampermonkey.net/documentation.php#_grant
fonte
Somente se você abrir uma nova janela usando window.open (), a nova janela poderá fechar usando o código conforme mencionado acima. Isso funciona perfeitamente para mim :) Nota: Nunca use href para abrir a página em uma nova guia. Window.close () não funciona com "href". Use window.open ().
fonte
Eu queria compartilhar minha "solução" com esse problema. Parece que a maioria de nós está tentando fechar uma janela do navegador em uma sessão padrão, em que um usuário está visitando um site ou outro, depois de visitar outros sites e antes de visitar mais.
No entanto, minha situação é que estou criando um aplicativo Web para um dispositivo que será essencialmente a única coisa que o dispositivo faz. Você inicializa, inicia o Chrome e navega para o nosso aplicativo. Nem sequer está conectado à Internet, os servidores com os quais ele fala estão em nossos contêineres Docker locais. O usuário precisa de uma maneira de fechar o aplicativo (também conhecido como Chrome) para acessar o terminal para realizar atualizações do sistema.
Portanto, ele inicializa e lança o Chrome no modo quiosque, no endereço correto. Isso acontece para satisfazer facilmente a segunda opção na especificação:
Então, simplesmente ligar
window.close()
do meu aplicativo de quiosque funciona !fonte
Tente algo como isto onclick = "return self.close ()"
fonte