Fazer ação ao fechar browser

5,769 views
Skip to first unread message

Renan Bandeira

unread,
Sep 20, 2011, 3:31:54 PM9/20/11
to list...@googlegroups.com
Olá,

Algm já fez um sistema que forçasse algo ao usuário no momento que ele fechasse o browser/aba?

Pq assim, tenho um sistema que só é possível um usuário logar por vez e cada um tem 45min. Então to guardando esses dados no BD (tempo inicial, tempo final e usuario - no momento do login, o tempofinal do usuário fica NULL. Qd ele faz logoff, o tempo final é atualizado). Porém, essa ação só é feita quando o usuário clica em sair (dou session_destroy() e faço essa atualização), ou seja, se o usuário fechar a página e abrir novamente, o sistema vai tratar ele como um novo usuário e não vai permitir que ele entre no sistema.

O problema disso é que a pessoa esquece de fazer logoff e fechar a página, os outros usuários deverão esperar que o tempo dele acabe, mesmo se ele não estiver lá.

Então, vos pergunto: tem alguma maneira de executar uma ação quando o usuário fechar a página?

--
Renan Bandeira
Computação UFC
6º Semestre

Douglas Bezerra Possas

unread,
Sep 21, 2011, 2:17:55 PM9/21/11
to list...@googlegroups.com
Da uma olhada no Jquery na Opção onUnload dele... Talvez vc consiga fazer uma requisição fazendo o logoff automaticamente para o usuário ou algo alerta.
Aconselharia que fizesse isso numa "FRAME" separada do sistema, para que ela faça essa verficação somente quando a frame pai for fechada, assim n corre o risco de ativar a função a cada unload de pagina se o usuario clicar num link qualquer...

--
============================================================
LEIAM SEMPRE AS REGRAS DA LISTA:
http://groups.google.com.br/group/listaphp/web/regras-da-lista-php
--
JQUERY MAGAZINE > http://www.jquerymagazine.com.br
--
PHP MAGAZINE > http://www.phpmagazine.com.br
--
LISTA NODE.JS > https://groups.google.com/group/lista-nodejs?hl=pt-br
--
AJAX-BRASIL > http://groups.google.com/group/ajax-brasil
--
PYTHON-GOOGLE > http://groups.google.com.br/group/python-google
--
DOTNET-BRASIL > http://groups.google.com.br/group/dotnet_br
============================================================



--
Douglas Bezerra Possas
Programador PHP
Cuiabá – MT – Brasil
Cel.: (65) 8124-4363
Curriculum: http://cvu.vg/dpossas
MSN: dougla...@gmail.com
Skype: douglas.possas
Twitter: dpossas

Tiago Pastorello

unread,
Sep 21, 2011, 2:24:52 PM9/21/11
to list...@googlegroups.com
http://api.jquery.com/unload/

;)

2011/9/21 Douglas Bezerra Possas <dougla...@gmail.com>



--
Tiago Pastorello
Vinteum Desenvolvimento

47 3028 5431
http://vinteum.com

Cassiano Ricardo Mourão

unread,
Sep 21, 2011, 3:08:18 PM9/21/11
to list...@googlegroups.com
Tinha um problema semelhante ao seu e discutimos isso há uns meses aqui na lista. Dá uma garimpada.

@Tiago
Bem massa o unload do jQuery! Os que eu tinha testado na época (JS puro) só dava pra perguntar pro usuário se ele queria sair ou não!

Eduardo souza

unread,
Sep 21, 2011, 2:17:43 PM9/21/11
to list...@googlegroups.com
metodo onUnload do body

<body onunload="alert('saiu');">

Igor Escobar

unread,
Sep 21, 2011, 4:44:02 PM9/21/11
to list...@googlegroups.com

Javascript: OnUnload VS OnBeforeUnload

Fico pensando em um caso mais familiar possível para ilustrar a utilidade das duas funções, e a melhor que me vem à cabeça é o Gmail. Já pensou em fazer algo parecido com o Gmail? Quando o usuário fechar a janela e alguma requisição estiver em processamento, ele dá um aviso sobre ela, para evitar que você perca alguma alteração.

Muita gente pensa que o evento utilizado para fazer tal proeza é o evento “onunload” mas não é. Existe uma pequena diferença entre os dois eventos.

O evento OnUnload

O evento OnUnload em sua tradução quer dizer: “quando descarregar”. Ele é responsável por executar uma instrução quando a página for fechada, mas CUIDADO!. A utilização deste evento não é muito confiável quando se trata de navegadores como Internet Explorer e AJAX ao mesmo tempo. Quando o IE está de mal humor e simplesmente ignora o evento, não executando a instrução que você programou para ele fazer. Se a instrução envolver AJAX, ela está ainda mais fadada ao fracasso e o seu usuário provavelmente vai ficar muito triste.

Exemplo

1
2
3
4
5
6
7
<script language="JavaScript">
window.onunload = Sair;
function Sair()
{
    return "A página foi fechada";
}
</script>

O evento OnBeforeUnload

Traduzindo OnBeforeUnload para o português, quer dizer: Antes de descarregar. O evento OnBeforeUnloadfunciona um pouco diferente do OnUnload. O evento OnBeforeUnload é chamado ANTES da janela ser fechada. É mais eficiente, pois ele não é executado em concorrência (junto/ao mesmo tempo) com o fechamento da janela, o que pode fazer com que algo seja carregado pela metade (de forma interminada).

Exemplo

1
2
3
4
5
6
7
8
<script language="JavaScript">
window.onbeforeunload = ConfirmExit;
function ConfirmExit()
{
    //Pode se utilizar um window.confirm aqui também...
    return "Mensagem de fechamento de janela....";
}
</script>

Pesquisando sobre este evento eu notei que o jQuery não da suporte ao eventoOnBeforeUnload. Se alguém descobrir por que, ganha um doce. x)

[]‘s


Texto retirado de:


Regards,
Igor Escobar
Software Engineer

+ http://blog.igorescobar.com
+ http://www.igorescobar.com
+ @igorescobar






2011/9/21 Eduardo souza <eduardos...@gmail.com>
metodo onUnload do body

<body onunload="alert('saiu');">

Marcel Araujo

unread,
Sep 21, 2011, 6:54:11 PM9/21/11
to list...@googlegroups.com

É realmente necessário responder o email desta maneira?

Em 21/09/2011 17:44, "Igor Escobar" <titio...@gmail.com> escreveu:
> Javascript: OnUnload VS OnBeforeUnload
>
> Fico pensando em um caso mais familiar possível para ilustrar a utilidade
> das duas funções, e a melhor que me vem à cabeça é o Gmail. Já pensou em
> fazer algo parecido com o Gmail? Quando o usuário fechar a janela e alguma
> requisição estiver em processamento, ele dá um aviso sobre ela, para evitar
> que você perca alguma alteração.
>
> Muita gente pensa que o evento utilizado para fazer tal proeza é o evento
> “onunload” mas não é. Existe uma pequena diferença entre os dois eventos.
> O evento OnUnload
>
> O evento *OnUnload* em sua tradução quer dizer: “quando descarregar”. Ele é
> responsável por executar uma instrução quando a página for fechada, mas *
> CUIDADO!*. A utilização deste evento não é muito confiável quando se trata
> de navegadores como *Internet Explorer* e *AJAX* ao mesmo tempo. Quando o IE

> está de mal humor e simplesmente ignora o evento, não executando a instrução
> que você programou para ele fazer. Se a instrução envolver AJAX, ela está
> ainda mais fadada ao fracasso e o seu usuário provavelmente vai ficar muito
> triste.
>
> *Exemplo*

> 1
> 2
> 3
> 4
> 5
> 6
> 7
> <script language="JavaScript">
> window.onunload = Sair;
> function Sair()
> {
> return "A página foi fechada";
> }
> </script>
> O evento OnBeforeUnload
>
> Traduzindo *OnBeforeUnload* para o português, quer dizer: *Antes de
> descarregar*. O evento *OnBeforeUnload*funciona um pouco diferente do *
> OnUnload*. O evento *OnBeforeUnload* é chamado ANTES da janela ser fechada.

> É mais eficiente, pois ele não é executado em concorrência (junto/ao mesmo
> tempo) com o fechamento da janela, o que pode fazer com que algo seja
> carregado pela metade (de forma interminada).
>
> *Exemplo*

> 1
> 2
> 3
> 4
> 5
> 6
> 7
> 8
> <script language="JavaScript">
> window.onbeforeunload = ConfirmExit;
> function ConfirmExit()
> {
> //Pode se utilizar um window.confirm aqui também...
> return "Mensagem de fechamento de janela....";
> }
> </script>
>
> Pesquisando sobre este evento eu notei que o *jQuery* não da suporte ao
> evento*OnBeforeUnload*. Se alguém descobrir por que, ganha um doce. x)

>
> []‘s
>
>
> Texto retirado de:
> http://www.igorescobar.com/blog/2010/06/14/javascript-onunload-vs-onbeforeunload/
>
>
> Regards,
> Igor Escobar
> *Software Engineer
> *

Igor Escobar

unread,
Sep 21, 2011, 7:52:21 PM9/21/11
to list...@googlegroups.com
As regras da lista não deixa eu colar somente a URL então eu tive que colar o corpo do artigo........ sugestões?


Regards,
Igor Escobar
Software Engineer

2011/9/21 Marcel Araujo <cece...@gmail.com>

Marcel Araujo

unread,
Sep 21, 2011, 8:06:57 PM9/21/11
to list...@googlegroups.com
Paste.bin ????

Marcel Araujo
Analista de Sistemas
Administrador CodeIgniter.com.br
Desenvolvedor PHP/CodeIgniter/Zend/JavaScript/ExtJS/jQuery
Linux User #490101

http://www.twitter.com/marcelaraujo
http://www.marcelaraujo.com.br
http://br.linkedin.com/in/marcelaraujo


Igor Escobar

unread,
Sep 21, 2011, 8:10:00 PM9/21/11
to list...@googlegroups.com
Novamente... eu não posso colar links de artigos aqui... que diferença faria eu postar o link do artigo ou o link do artigo no paste.bin?

Émerson Eng.

unread,
Sep 21, 2011, 5:17:40 PM9/21/11
to list...@googlegroups.com
A unica opção aceitavei na minha opinião é:
onbeforeunload = function(){
     post('sair.php?forcado=1');
     alert('Nunca feche o sistema no botão fechar.\nSempre clique no botão sair do sistema.');
}

Quando o usuario fechar aba ou navegador vai aparecer o alert, mas antes acontece um post em um PHP que faz modificações no banco. O tempo até o post ser terminado e o usuário dar OK é de na média 4 segundos, o que na maioria dos casos resolve.



2011/9/21 Igor Escobar <titio...@gmail.com>

Ricardo Walter

unread,
Sep 21, 2011, 5:20:15 PM9/21/11
to list...@googlegroups.com
Eu particularmente preferiria fazer um script q a cada x segundos enviasse uma requisição pro servidor, como um ping, pois se o seu sistema não permite mais de um login é complicado depender de uma função assim, vai que cai a conexão do cara, o browser não vai conseguir enviar a requisição de desconexão, por exemplo.

Igor Escobar

unread,
Sep 22, 2011, 6:50:00 AM9/22/11
to list...@googlegroups.com
O OnBeforeUnload é confiável. O OnUnload não é para a finalidade que você quer. No artigo explica certinho a diferença entre os 2 eventos.


 

Regards,

Igor Escobar
Software Engineer

+ http://blog.igorescobar.com
+ http://www.igorescobar.com
+ @igorescobar






2011/9/21 Ricardo Walter <ricardo...@gmail.com>

Igor Escobar

unread,
Sep 22, 2011, 6:51:52 AM9/22/11
to list...@googlegroups.com

window.onbeforeunload = function (e) {
  e = e || window.event;

  // For IE and Firefox prior to version 4
  if (e) {
    e.returnValue = 'Any string';
  }

  // For Safari
  return 'Any string';
};


Regards,
Igor Escobar
Software Engineer

+ http://blog.igorescobar.com
+ http://www.igorescobar.com
+ @igorescobar






2011/9/22 Igor Escobar <titio...@gmail.com>

Cassiano Ricardo Mourão

unread,
Sep 22, 2011, 7:32:03 AM9/22/11
to list...@googlegroups.com
Não consegui utilizar o onUnload (jQuery) pra qnd o cara fechar a página, escrever num arquivo via ajax alguma coisa...
Com o unload no body/js puro não dá mesmo pra fazer.

Não vou testar o onBeforeUnload pq não é oq preciso.

E novamente, ao topic starter: garimpa uma discussão iniciada por mim justamente sobre isso. Ao invés do ping, como eu utilizo atualmente e como Ricardo sugeriu acima, você pode utilizar de push/comet se preferir. Mas sinceramente? O tráfego é ridiculamente ínfimo do ping ("refresher"): a cada 10 segundos de 93 bytes são trafegados (33KB aprox por hora) e o processamento é pontual também, consistindo apenas de um update na tabela de sessões.

Ou seja: se outro usuário tentar logar e o último refresh pro id do usuário foi há menos de 10 segundos, existe outro usuário logado (ou o browser fechou, etc etc... e ele espera 10 segundos). Quando um segundo usuário com mesmo id logar, remove a sessão antiga do banco e destrói ela na aplicação.

Igor Escobar

unread,
Sep 22, 2011, 8:57:21 AM9/22/11
to list...@googlegroups.com
O evento que você procura no jQuery é o $.unload();

Se você fizer o que você está se propondo a fazer utilizando o unload, terá vezes em que o seu request vai falhar. O tudo o que está dentro do unload terá que ser executado em tempo do sistema operacionar do usuário fechar o browser. Tudo o que estiver em meio uma execução será fechado o que executar executou o que não executou não executa mais. Já o beforeunload ele primeiro executa tudo o que você está querendo que ele execute e DEPOIS fecha o browser (ou não se você cancelar). Mas enfim, fique à vontade para usar o evento que preferir ;)

It's up to you.

Regards,
Igor Escobar
Software Engineer

+ http://blog.igorescobar.com
+ http://www.igorescobar.com
+ @igorescobar






2011/9/22 Cassiano Ricardo Mourão <cassian...@gmail.com>

Cassiano Ricardo Mourão

unread,
Sep 22, 2011, 9:07:49 AM9/22/11
to list...@googlegroups.com
Igor, TESTA o onbeforeunload fazendo uma requisição ajax e o script php escrevendo um .txt qualquer, que eu vou colar seu código aqui e testar também.

Em tudo quanto é canto que li, o onbeforeunload APENAS serve para o BROWSER solicitar (inclusive não existe nenhum override no alert exibido) a confirmação do usuário da ação de sair da página.

Igor Escobar

unread,
Sep 22, 2011, 9:10:20 AM9/22/11
to list...@googlegroups.com
Então tabom ;)

Sidney

unread,
Sep 22, 2011, 10:57:42 AM9/22/11
to list...@googlegroups.com
Criei essa rotina pra um sistema onde o cadastro estava distribuído em abas. Ao fechar a janela, ele checa se houve mudanças nos campos e, havendo, emite o alerta permitindo que o usuário desista de sair (semelhante ao gmail). Acredito que já seja auto explicável:

   salvar=0;
   $('form').children().each(function(){
       $(this).change(function(){
            salvar=1;
       });
   });
   $('form').submit(function(){
        salvar=0;
   });
   $(window).bind('beforeunload', function(){
        if(salvar)
            return 'Atenção: Todas as alterações não salvas serão perdidas se sair agora!';
   });

Importante: nem todos os browsers exibirão a mensagem a personalizada acima. Alguns exibem a sua própria + a personalizada, e me lembro que um (acho que o chrome) só exibe a própria e descarta a personalizada. De qualquer forma, as mensagens são bem claras.

Atenciosamente,
Sidney Lins

Cassiano Ricardo Mourão

unread,
Sep 22, 2011, 3:07:58 PM9/22/11
to list...@googlegroups.com
Pois é, o onbeforeunload apenas serve pra confirmar a saída do cara da página, como já disse.
Estou esperando ainda o exemplo do Igor pra ver como fazer...

Ainda estou aguardando um exemplo funcional do

Vitor Amaral

unread,
Sep 22, 2011, 3:24:06 PM9/22/11
to list...@googlegroups.com
Galera da lista, a função "array_key_exists()" não funciona mais no php 5.2 ? Alguem sabe qual função eu posso substituir por ela ?



Valew...

Davi Alexandre

unread,
Sep 22, 2011, 3:26:42 PM9/22/11
to list...@googlegroups.com
Eita! De onde você tirou essa que não funciona mais? O_o

Ela continua la, firme e forte ;)

On Thu, Sep 22, 2011 at 4:24 PM, Vitor Amaral <vitor_...@hotmail.com> wrote:
Galera da lista, a função "array_key_exists()" não funciona mais no php 5.2 ? Alguem sabe qual função eu posso substituir por ela ?



Valew...

--

Davi Alexandre

unread,
Sep 22, 2011, 3:27:47 PM9/22/11
to list...@googlegroups.com
De qualquer forma, você sempre pode usar um isset($array['key'])

Douglas Bezerra Possas

unread,
Sep 22, 2011, 3:28:57 PM9/22/11
to list...@googlegroups.com

array_key_exists

(PHP 4 >= 4.0.7, PHP 5)

array_key_existsCheca se uma chave ou índice existe em um array


Não diz nada no site do PHP que ela n funciona mais. Voce deve estar usando de maneira errada:


http://www.php.net/manual/pt_BR/function.array-key-exists.php



2011/9/22 Davi Alexandre <bastar...@gmail.com>

Vinicius Rezende

unread,
Sep 22, 2011, 3:29:56 PM9/22/11
to list...@googlegroups.com
isset($ar['key'])?

On Thu, Sep 22, 2011 at 4:24 PM, Vitor Amaral <vitor_...@hotmail.com> wrote:
Galera da lista, a função "array_key_exists()" não funciona mais no php 5.2 ? Alguem sabe qual função eu posso substituir por ela ?



Valew...

--

Vitor Amaral

unread,
Sep 22, 2011, 3:36:43 PM9/22/11
to list...@googlegroups.com
ok, sorry, deixa eu passar mais detalhes, é a versão 5.2.17

É um sistema antigo, que até tem algumas coisas do php 4 ainda, e agora foi preciso mudar de hosting, e ele está com essa versão 5.2.17 e está dando problemas nesta função...


@Davi o isset não rolou.... eu tinha tentado




Date: Thu, 22 Sep 2011 15:28:57 -0400
Subject: Re: [ PHP - Google ] Função antiga no PHP 5.2
From: dougla...@gmail.com
To: list...@googlegroups.com

Rubens Takiguti Ribeiro

unread,
Sep 22, 2011, 3:40:23 PM9/22/11
to list...@googlegroups.com
Usar isset tem significado diferente de array_key_exists. O isset considera null como "não setado", embora uma posição do vetor possa existir com valor null.

Veja:

$vetor = array();
$vetor[0] = null;

$r1 = array_key_exists(0, $vetor);
$r2 = isset($vetor[0]);

var_dump($r1, $r2);


Rubens Takiguti Ribeiro
Bacharel em Ciência da Computação - UFLA
Zend Certified Engineer - PHP 5
http://rubsphp.blogspot.com/



2011/9/22 Vinicius Rezende <crazy...@gmail.com>

Vitor Amaral

unread,
Sep 22, 2011, 3:55:43 PM9/22/11
to list...@googlegroups.com
É, vc está certo Rubens...

E agora eu acabei de encontrar uma função semelhante "property_exists()", ela considera o valor Null, junto com ela tbm encontrei alguns fóruns gringos de pessoas dizendo que precisaram alterar "array_key_exists()" para "property_exists()" nessa versão 5.2.17


Aqui parece que resolveu, ainda não consegui rodar o sistema no hosting novo, mas agora depois dessa solução, chegou outros probleminhas de compatibilidade..


Valew..


Vitor Amaral


From: rub...@gmail.com
Date: Thu, 22 Sep 2011 16:40:23 -0300

Subject: Re: [ PHP - Google ] Função antiga no PHP 5.2

Luís Otávio

unread,
Sep 22, 2011, 3:27:03 PM9/22/11
to list...@googlegroups.com
isset($array['key']) ?

On Thu, Sep 22, 2011 at 4:24 PM, Vitor Amaral <vitor_...@hotmail.com> wrote:
Galera da lista, a função "array_key_exists()" não funciona mais no php 5.2 ? Alguem sabe qual função eu posso substituir por ela ?



Valew...

--

Luís Otávio

unread,
Sep 22, 2011, 3:28:16 PM9/22/11
to list...@googlegroups.com
So lembrando que se o valor for NULL não rola....

Mas segundo o manual a função funciona sim.

hnrq

unread,
Sep 22, 2011, 3:40:32 PM9/22/11
to list...@googlegroups.com
Qual erro esta ocorrendo? Pode ser alguma diferença entre versões mesmo, mas sem saber o erro fica complicado :P
Henrique Lauro Bagio de Souza.

Renan Bandeira

unread,
Sep 26, 2011, 7:50:51 PM9/26/11
to list...@googlegroups.com
Obrigado pelas informações. Resolvi meu problema com umas gambiarras...o problema é que o onunload nao funciona no Chrome, só o onbeforeunload. Aí eu queria usar o onbeforeUnload e pegar o retorno do usuario (se ele clicou em sair ou permanecer...a maneira que vi isso foi no onunload, que significa q ele clicou em sair).


--
Renan Bandeira
Computação UFC
6º Semestre

Douglas Bezerra Possas

unread,
Sep 28, 2011, 8:13:59 AM9/28/11
to list...@googlegroups.com
onbeforeUnload + confirm

Cassiano Ricardo Mourão

unread,
Sep 28, 2011, 8:15:30 AM9/28/11
to list...@googlegroups.com
Douglas, ao invés de IVO, leia Douglas e faz oq solicitei por gentileza:

---------- Mensagem encaminhada ----------
De: Cassiano Ricardo Mourão <cassian...@gmail.com>
Data: 22 de setembro de 2011 10:07
Assunto: Re: [ PHP - Google ] Fazer ação ao fechar browser
Para: list...@googlegroups.com



Igor, TESTA o onbeforeunload fazendo uma requisição ajax e o script php escrevendo um .txt qualquer, que eu vou colar seu código aqui e testar também.

Em tudo quanto é canto que li, o onbeforeunload APENAS serve para o BROWSER solicitar (inclusive não existe nenhum override no alert exibido) a confirmação do usuário da ação de sair da página.


Reply all
Reply to author
Forward
0 new messages