Pergunta

Eu tenho uma página que funciona bastante e não quero que o usuário consiga sair dessa página (fechar o navegador, clicar no botão Voltar, etc.) sem receber um aviso.Descobri que o evento onbeforeunload (que acho específico do IE, que funciona bem para mim, pois o projeto usa muito ActiveX) funciona muito bem.

O problema é que quero que o usuário possa clicar em um pequeno ícone de “ajuda” no canto superior direito e abrir uma janela de ajuda a qualquer momento.Isso faz com que onbeforeunload seja acionado, mesmo que a janela principal nunca vá a lugar nenhum e a página nunca seja descarregada.

A função JavaScript executada quando o evento onbeforeunload é executado apenas coloca o texto em event.returnValue.Se eu pudesse verificar, de alguma forma, que o ícone de ajuda é aquele que foi clicado, então não poderia colocar texto em event.returnValue nessa situação.Mas como eu poderia fazer com que a página descobrisse isso?

Foi útil?

Solução

Deixe-me adivinhar:o "ícone" de ajuda é na verdade um link com um javascript: url?Mude-o para um botão real, um link real ou pelo menos coloque a funcionalidade em um manipulador de eventos onclick (que impede o comportamento padrão).Problema resolvido.

<!-- clicking this link will do nothing. No onbeforeunload handler triggered. 
Nothing. 
And you could put something in before the return false bit...
...and the onunload handler would still not get called... -->
<a href="http://www.google.com/" onclick="return false;">blah1</a>
<!-- this should also do nothing, but IE will trigger the onbeforeunload 
handler -->
<a href="javascript:void(0)">blah2</a>

Outras dicas

EDITAR: Minha "solução alternativa" abaixo é um exagero completo, baseada na minha falta de compreensão.Vá com a resposta do Shog9 acima.

OK, enquanto escrevia a pergunta, descobri uma solução alternativa que funcionará por enquanto.

Coloquei uma variável JavaScript global atuando como um booleano para saber se o ícone está ou não passando o mouse.Em seguida, anexei eventos aos eventos onmouseover e onmouseout da imagem e escrevo funções que definirão esse valor.Por fim, apenas codifico a função que lida com onbeforeunload que verificará esse valor antes de definir event.returnValue.

Provavelmente não é uma solução alternativa perfeita, mas funcionará por enquanto.

na internet você encontrará muitas pessoas sugerindo que você use algo como

janela.onbeforeunload=nulo

mas isso não funciona para mim no IE6.lendo os documentos do MSDN para o objeto de evento, encontrei uma referência à propriedade event.cancelBubble, que pensei ser a solução.mas graças a Orso, que apontou que definir "event.cancelBubble = true" é inútil, a maneira de se livrar do prompt de confirmação é excluir completamente a instrução de retorno, optei por usar uma variável booleana como sinalizador para decidir se deve devolver algo ou não.no exemplo abaixo eu adiciono o código javascript programaticamente no código por trás:

Page.ClientScript.RegisterStartupScript(typeof(String), "ConfirmClose", @"  <script>        window.onbeforeunload = confirmExit;        function confirmExit()      {           if(postback == false)               return ""Please don't leave this page without clicking the 'Save Changes' or 'Discard Changes' buttons."";                                                      }       </script>");

então o botão de ajuda contém a seguinte marcação aspx:

OnClientClick="postback=true;return true;

isso define a variável 'postback' como verdadeira, que é selecionada na função confirmExit(), tendo o efeito de cancelar o evento.

espero que você ache isso útil.ele foi testado e funciona no IE6 e FF 1.5.0.2.

Eu tenho um método um pouco desajeitado, mas funcionará na maioria dos casos.

Crie uma página pop-up "Holding" contendo um FRAMESET com um FRAME 100% único e coloque os manipuladores de eventos onUnload e onbeforeUnload normais no HEAD.

<html>
<head>
<script language="Javascript" type="text/javascript">
  window.onbeforeunload = exitCheck;
  window.onunload = onCloseDoSomething;

  function onCloseDoSomething()
  {
  alert("This is executed at unload");
  }

  function exitCheck(evt)
  {
  return "Any string here."}
  </script>
  </head>

    <frameset rows="100%">
    <FRAME name="main" src="http://www.yourDomain.com/yourActualPage.aspx">
    </frameset>
<body>
</body>
</html>

Usando este método, você está livre para usar a página real que deseja ver, postar de volta e clicar em hiperlinks sem que o evento onUnload ou onbeforeUnload do quadro externo seja acionado.

Se o quadro externo for atualizado ou realmente fechado, os eventos serão acionados.

Como eu disse, não é uma prova completa, mas contornará o disparo do evento a cada clique ou postback.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top