Javascript e onbeforeunload?
-
19-09-2019 - |
Pergunta
Eu tenho
<span class="cssButton"><a href="javascript:void(0);" class="buttonBlue" onclick="swfu.startUpload();"> <img src="http://uber-upload.com/img/icons/up_16.png" alt=""/> Uber-Upload! </a></span>
E eu quero fazê-lo de modo que se você pressionar esse botão, ele também define uma variável que faz com que se você tentar deixar a página, ele irá aparecer um daqueles "Tem certeza de que deseja sair esta página" alertas para evitar que pessoas acidentalmente deixando enquanto houver um upload acontecendo.
Não se preocupe com desarmar a variável após o carregamento termina, eu vou acrescentar que, eu só preciso de um de vocês codificadores inteligentes para me fazer um quadro.
Obrigado!
Solução
Adicione esta declaração à página:
var upcount = 0;
Mude o seu onclick para:
onclick="++upcount; swfu.startUpload();"
Se o swfu
dá-lhe algum tipo de evento quando é feito o upload, colocar isso nele:
--upcount;
E adicionar esse manipulador:
window.onbeforeunload = function() {
if (upcount > 0) {
return "The upload is still in progress, leaving the page will cancel it.";
}
}
Onde navegadores respeitar a onbeforeunload, que vai trabalhar. E a maioria deles fazer, na maioria das vezes. Onde eles não, bem, você tentou. Note-se que, utilizando um contador, você está permitindo múltiplas uploads.
Você pode considerar attachEvent (IE) ou addEventListener (standard) (ou uma biblioteca como protótipo ou jQuery que equilibra as diferenças para você) para a fixação de seus eventos ao invés de usar atributos. Usando atributos (aka manipuladores Dom0) é bastante antiquado e limitação pouco (apenas um manipulador por evento por elemento). Mas ele ainda não funciona.
Outras dicas
function warnUser()
{
if(dataIsDirty)
{
return "You have made changes. They will be lost if you continue.";
}
else
{
// Reset the flag to its default value.
dataIsDirty = false;
}
}
function isDirty()
{
dataIsDirty = true;
}
function isClean()
{
dataIsDirty = false;
}
Em seguida, você usá-lo apenas como sobre o evento onbeforeunload
.
window.onbeforeunload = warnUser;
dataIsDirty = false; //Or true, depending on if you want it to show up even if they dont' make changes)
Depois de usá-lo, basta usar a função 'isClean' para qualquer coisa que você não quer provocá-lo (Save, por exemplo), ou você pode anexar 'IsDirty' para qualquer evento que pretende acioná-lo antes de sair (por exemplo, a edição de um campo de formulário).
Baseando-se em onbeforeunload é impreciso. Porque os spammers têm abusado o comportamento da mesma maneira que você está sugerindo a capacidade das pessoas de fazer isso tem sido basicamente removido.
Você agora só pode responder a onbeforeunload se o evento perto foi demitido de activação de um botão ou algo semelhante.