ti-enxame.com

window.close e self.close não fecha a janela no Chrome

O problema é que quando 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 script criado. Isso é patentemente falso, mas independentemente disso, ainda é necessário, 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 em Chrome? Qualquer sugestão seria muito apreciada e estou procurando solução específica de JavaScript, nada 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 do TamperMonkey) usando// @grant window.closeno cabeçalho do script, muitas vezes, funciona mesmo nas guias que normalmente manipule o método de fechamento. Embora não seja totalmente ideal e não seja generalizado para todos os casos, é uma boa solução no meu caso.

141
GµårÐïåñ

O javascript comum não pode fechar as janelas a sério. Este é um recurso de segurança, introduzido há um tempo atrás, para impedir várias explorações e aborrecimentos maliciosos.

De a mais recente especificação de trabalho para window.close() :

O método close() em objetos Window deve, se todas as condições a seguir forem atendidas, fechar o contexto de navegação A:

  • O contexto de navegação correspondente A é script-closable.
  • O contexto de navegação do script incumbente está familiarizado com o contexto de navegação A.
  • O contexto de navegação do script incumbente tem permissão para navegar no contexto de navegação A.

Um contexto de navegação é script-closable se for um contexto de navegação auxiliar que foi criado por um script (em oposição a uma ação do usuário), ou se for um contexto de navegação cuja O histórico da sessão contém apenas um documento.

Isso significa que, com uma pequena exceção, o javascript não deve ter permissão para fechar uma janela que não tenha sido aberta pelo mesmo javascript.

O Chrome permite essa exceção - que não se aplica a scripts de usuários - no entanto, o Firefox não. A implementação do Firefox flat out states

Este método só pode ser chamado para janelas que foram abertas por um script usando o método window.open.


Se você tentar usar window.close de um Greasemonkey/Tampermonkey/userscript, você obterá:
Firefox: A mensagem de erro "Scripts may not close windows that were not opened by script."
Chrome: apenas falha silenciosamente.



A solução a longo prazo:

A melhor maneira de lidar com isso é criar uma extensão do Chrome e/ou um complemento do Firefox. Eles podem fechar a janela atual com segurança.

No entanto, como os riscos de segurança, colocados por window.close, são muito menores para um script Greasemonkey/Tampermonkey; O Greasemonkey e o Tampermonkey poderiam razoavelmente fornecer 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:

Cromada está atualmente era vulnerável à exploração do "redirecionamento automático". Então, um código como este costumava funcionar em geral:

open(location, '_self').close();

Este é o comportamento de buggy, IMO, e é agora (a partir de abril de 2015) principalmente bloqueado. Ele ainda funcionará de injetado código somente se a guia for aberta de novo e não tiver páginas no histórico de navegação. Então, é útil apenas em um conjunto muito pequeno de circunstâncias.

No entanto, a variação a ainda funciona no Chrome (v43 e v44) mais o Tampermonkey (v3.11 ou posterior). Use um @grant explícito e window.close() simples. POR EXEMPLO:

// ==UserScript==
// @name        window.close demo
// @include     http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant       GM_addStyle
// ==/UserScript==

setTimeout (window.close, 5000);

Obrigado ao zanetu pela atualização. Observe que isso não funcionará se houver apenas uma guia aberta. Apenas fecha guias adicionais.


Firefox é seguro contra essa exploração. Assim, a única forma de javascript é enfraquecer as configurações de segurança, um navegador por vez.

Você pode abrir about:config e definir
allow_scripts_to_close_windows para true

Se o seu script é para uso pessoal, vá em frente e faça isso. Se você pedir a alguém para ativar essa configuração, ela será inteligente e justificada, para recusar com preconceito. 

Atualmente, não há configuração equivalente para o Chrome.

158
Brock Adams

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 de lançamento

Pela minha observação, esta atualização corrigiu o problema ao usar window.close() para fechar a janela pop-up. Você verá isso no console quando falhar, "Scripts podem fechar apenas as janelas que foram abertas por ele". Isso significa As soluções alternativas de hacky (resposta de Brock Adams) podem não funcionar na última versão.

Assim, nas versões anteriores do Chrome, o bloco de código abaixo pode funcionar, mas não com essa atualização.

window.open('', '_self', '');
window.close();

Para esta atualização, você precisa 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 

chrome.windows.remove(integer windowId, function callback)

método para removê-lo. A API de extensões do Chrome pode ser encontrada em chrome.windows

Na verdade, minha extensão do Google Chrome MarkView estava enfrentando esse problema e tive que atualizar meu código para que funcionasse nesta atualização do Chrome. A propósito, o MarkView é uma ferramenta para ler e escrever arquivos impressionantes de Markdown, ele fornece recursos como Contorno de Conteúdo, Tabelas Classificáveis ​​e realce de sintaxe de bloco de código com o número da linha.

Eu também criei este post , quaisquer comentários são bem vindos.

27
swcool

No tampermonkey agora você pode usar

// @grant        window.close

E então basta ligar

window.close();
16
balping

Eu estou usando o método postado por Brock Adams e ele ainda funciona no Firefox, se é iniciado pelo usuário.

open(location, '_self').close();

Eu estou chamando de um botão pressionado, por isso é user started, e ainda está funcionando bem usando o Chrome 35-40, o Internet Explorer 11, o Safari 7-8 e também o Firefox 29-35. Eu testei usando a versão 8.1 do Windows e Mac OS X 10.6, 10.9 e 10.10, se isso é diferente. 


O código completo:

HTML:

<input type="button" name="Quit" id="Quit" value="Quit" onclick="return quitBox('quit');" />

JavaScript:

function quitBox(cmd)
{   
    if (cmd=='quit')
    {
        open(location, '_self').close();
    }   
    return false;   
}

Experimente esta página de teste: (agora testada no Chrome 40 e no Firefox 35) 

http://browserstrangeness.bitbucket.io/window_close_tester.htm

13
Jeff Clayton

Muitas pessoas ainda estão tentando encontrar uma maneira de fechar o navegador Chrome usando o javascript. O seguinte método só funciona quando você usa o Chrome como lançador de APP - quiosque por exemplo!

Eu testei o seguinte:

Estou usando a seguinte extensão: Close Kiosk

Estou seguindo as instruções de uso e parece funcionar muito bem (certifique-se de limpar o cache durante os testes). O javascript que eu uso é (anexado ao evento click):

window.location.href = '/closekiosk';

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: "Permitir que o Chrome seja executado em segundo plano" (ou texto semelhante). Você pode precisar brincar com isso, até que funcione para você. Eu desmarcada e agora funciona muito bem!

9
Minister

Apesar de pensar que é "patentemente falso", o que você diz "parece ser uma crença" está correto. A documentação do Mozilla para window.close diz

Esse método só pode ser chamado para janelas que foram abertas por um script usando o método window.open. Se a janela não foi aberta por um script, o seguinte erro aparece no Console JavaScript: Os scripts não podem fechar as janelas que não foram abertas pelo script

Você diz que é "deveria continuar fazendo isso", mas eu não acho que você encontrará qualquer referência que suporte isso, talvez você tenha se lembrado de algo errado?

5
Gareth

Eu encontrei uma nova maneira que funciona para mim perfeitamente

var win = window.open("about:blank", "_self");
win.close();
5
Gerardo Abdo

O código abaixo funcionou para mim -

window.open('location', '_self', '');
window.close();

Testado em Chrome 43.0.2357.81

4
DfrDkn

Isso pode ser antigo, mas vamos responder. 

Eu uso top.close () para fechar uma aba. window.close () ou outro open ... close não funcionou para mim.

2
Soley

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 um window.setTimeout que redireciona para uma página diferente.

Dessa forma, se window.close for bem-sucedido, a execução nessa página será interrompida, mas se falhar, em um segundo, ele será redirecionado para uma página diferente.

window.close();
window.setTimeout(function(){location.href = '/some-page.php';},1000);
0
user2182349