É possível definir o cursor para 'esperar' em toda a página html de uma forma simples? A ideia é mostrar ao usuário que algo está acontecendo enquanto uma chamada ajax está sendo completada. O código abaixo mostra uma versão simplificada do que tentei e também demonstra os problemas que encontro:
- se um elemento (# id1) tiver um estilo de cursor definido, ele irá ignorar o definido no corpo (obviamente)
- alguns elementos têm um estilo de cursor padrão (a) e não mostrarão o cursor de espera ao passar o mouse
- o elemento do corpo tem uma certa altura dependendo do conteúdo e se a página for curta, o cursor não aparecerá abaixo do rodapé
O teste:
<html>
<head>
<style type="text/css">
#id1 {
background-color: #06f;
cursor: pointer;
}
#id2 {
background-color: #f60;
}
</style>
</head>
<body>
<div id="id1">cursor: pointer</div>
<div id="id2">no cursor</div>
<a href="#" onclick="document.body.style.cursor = 'wait'; return false">Do something</a>
</body>
</html>
Editar mais tarde ...
Funcionou no firefox e no IE com:
div#mask { display: none; cursor: wait; z-index: 9999;
position: absolute; top: 0; left: 0; height: 100%;
width: 100%; background-color: #fff; opacity: 0; filter: alpha(opacity = 0);}
<a href="#" onclick="document.getElementById('mask').style.display = 'block'; return false">
Do something</a>
O problema (ou recurso) dessa solução é que ela evitará cliques devido à div sobreposição (obrigado, Kibbee)
Mais tarde, edite mais tarde ...
Uma solução mais simples de Dorward:
.wait, .wait * { cursor: wait !important; }
e depois
<a href="#" onclick="document.body.className = 'wait'; return false">Do something</a>
Esta solução mostra apenas o cursor de espera, mas permite cliques.
javascript
html
css
dynamic-css
Aleris
fonte
fonte
Respostas:
Eu entendo que você pode não ter controle sobre isso, mas você pode ir para um div "mascarado" que cubra todo o corpo com um índice z superior a 1. A parte central do div pode conter uma mensagem de carregamento, se desejar.
Em seguida, você pode definir o cursor para aguardar o div e não precisa se preocupar com links, pois eles estão "sob" seu div de mascaramento. Aqui está um exemplo de CSS para o "div de máscara":
fonte
Se você usar esta versão ligeiramente modificada do CSS que postou de Dorward,
você pode adicionar um jQuery realmente simples para funcionar em todas as chamadas de Ajax:
ou, para versões mais antigas do jQuery (antes de 1.9):
fonte
$(document).ajaxStart(function () { $("html").addClass("wait"); });
$.active
é 0, caso várias solicitações tenham sido feitas e todas ainda não foram concluídas.Isso parece funcionar no firefox
A parte * garante que o cursor não mude quando você passa o mouse sobre um link. Embora os links ainda sejam clicáveis.
fonte
Tenho lutado com esse problema por horas hoje. Basicamente, tudo estava funcionando bem no FireFox, mas (é claro) não no IE. No IE, o cursor de espera era mostrado APÓS a execução da função demorada.
Finalmente encontrei o truque neste site: http://www.codingforums.com/archive/index.php/t-37185.html
Código:
Meu código é executado em uma classe JavaScript, portanto, o this e MyClass (MyClass é um singleton).
Tive os mesmos problemas ao tentar exibir um div, conforme descrito nesta página. No IE, ela era exibida após a execução da função. Portanto, acho que esse truque resolveria esse problema também.
Agradeço um zilhão de vezes a Glenngv, o autor do post. Você realmente fez o meu dia!!!
fonte
css:
.waiting * { cursor: 'wait' }
jQuery:
$('body').toggleClass('waiting');
fonte
Por que você simplesmente não usa um desses gráficos de carregamento sofisticados (por exemplo: http://ajaxload.info/ )? O cursor de espera é para o próprio navegador - portanto, sempre que aparece, tem algo a ver com o navegador e não com a página.
fonte
cursor: progress
não estácursor: wait
. Usar esse cursor seria muito mais coerente com a experiência do usuário do navegador. Mas eu realmente gosto da ideia de mudar o cursor para indicar que o navegador está funcionando exatamente como quando carrega uma página.A maneira mais fácil que conheço é usando JQuery assim:
fonte
Experimente o css:
Parece que, se a propriedade
body
for usada em oposição ahtml
ela, não mostra o cursor de espera sobre a página inteira. Além disso, se você usar uma classe css, poderá controlar facilmente quando ela realmente será exibida.fonte
Aqui está uma solução mais elaborada que não requer CSS externo:
com isso você pode fazer:
fonte
Usei uma adaptação da solução de Eric Wendelin . Ele mostrará uma div de espera de sobreposição transparente e animada sobre todo o corpo, o clique será bloqueado pela div de espera enquanto estiver visível:
css:
js:
html:
fonte
Meus dois pence:
Etapa 1: declare uma matriz. Isso será usado para armazenar os cursores originais que foram atribuídos:
Etapa 2: implemente a função cursorModifyEntirePage
O que faz: obtém todos os elementos da página. Armazena os cursores originais atribuídos a eles na matriz declarada na etapa 1. Modifica os cursores para o cursor desejado conforme passado pelo parâmetro CursorType
Etapa 3: restaurar os cursores na página
Eu executei isso em um aplicativo e funciona bem. A única ressalva é que eu não testei quando você está adicionando os elementos dinamicamente.
fonte
Para definir o cursor do JavaScript para a janela inteira, use:
De CSS:
Adicione mais lógica conforme necessário.
fonte
BlockUI é a resposta para tudo. De uma chance.
http://www.malsup.com/jquery/block/
fonte
Este JavaScript puro parece funcionar muito bem ... testado em navegadores FireFox, Chrome e Edge.
Não tenho certeza sobre o desempenho disso se você tiver uma superabundância de elementos em sua página e um computador lento ... experimente e veja.
Defina o cursor para que todos os elementos aguardem:
Defina o cursor para todos os elementos de volta ao padrão:
Uma versão alternativa (e talvez um pouco mais legível) seria criar uma função setCursor da seguinte maneira:
e então ligar
e
para definir o cursor de espera e o cursor padrão, respectivamente.
fonte