Alterando o cursor para espera em javascript / jquery

119

insira a descrição da imagem aqui

Como eu faria meu cursor mudar para este ícone de carregamento quando uma função fosse chamada e como eu mudaria de volta para um cursor normal em javascript / jquery

ahmet
fonte
7
se você quiser exatamente este cursor, você precisa especificar uma url, caso contrário (com a solução Roberts) cada usuário verá o cursor de carregamento dependendo do seu sistema operacional.
Christoph
1
Christoph, o que 'esperar' mostraria para outros sistemas operacionais, estou no Windows 7, porque no momento parece bom
ahmet
2
bem, no Vista mostraria o mesmo cursor que no windows 7, mas com sua animação quebrada, em sistemas operacionais Windows mais antigos mostraria a boa e velha ampulheta e no Linux ou Mac OS mostraria seus respectivos cursores de "espera". Também sugiro não manipular o cursor do usuário, já que isso é comumente associado às operações do sistema operacional, mas sim fornecer uma pequena animação de espera como essas diretamente em sua página da web, o que ajuda o usuário a ver à primeira vista, que a operação de espera é causado pelo seu site e não pelo sistema operacional.
Christoph
1
consulte também stackoverflow.com/questions/192900/…
Brian Burns
1
Boa ideia para desktop, ideia RUIM para celular ...
Please_Dont_Bully_Me_SO_Lords

Respostas:

195

Em seu uso jQuery:

$("body").css("cursor", "progress");

e depois voltar ao normal novamente

$("body").css("cursor", "default");
Robert Stanley
fonte
8
Usei $("html,body")porque o corpo da minha página cabia apenas na metade da janela, então o cursor ainda era o padrão ao passar o mouse sobre a metade inferior.
Keith
Outros elementos na página (ou seja, botões de bootstrap) que substituem o cursor para uma exibição não padrão irão bloquear esta abordagem enquanto o cursor ainda estiver sobre o elemento. Nesses casos, achei preferível usar !importanta solução de @hrabinowitz abaixo
Addison Klinke
82

Um colega sugeriu uma abordagem que considero preferível à solução escolhida aqui. Primeiro, em CSS, adicione esta regra:

body.waiting * {
    cursor: progress;
}

Em seguida, para ativar o cursor de progresso, diga:

$('body').addClass('waiting');

e para desligar o cursor de progresso, diga:

$('body').removeClass('waiting');

A vantagem dessa abordagem é que, quando você desativa o cursor de progresso, quaisquer outros cursores que possam ter sido definidos em seu CSS serão restaurados. Se a regra CSS não for poderosa o suficiente em precedência para anular outras regras CSS, você pode adicionar um id ao corpo e à regra, ou usar !important.

Hrabinowitz
fonte
Excelente solução!
Kenton de Jong
31

Por favor, não use jQuery para isso em 2018! Não há razão para incluir uma biblioteca externa inteira apenas para realizar esta ação que pode ser alcançada com uma linha:

Mude o cursor para girador: document.body.style.cursor = 'wait';

Reverter o cursor para o normal: document.body.style.cursor = 'default';

kchuang7
fonte
3
Provavelmente, há algo nessa página que adiciona a necessidade de um cursor de processamento personalizado, você não acha? Não é um ponto ruim claro, mas a mudança do jQuery já sendo carregado para outra coisa seria ... ehm ... 100%?
patrick
Como @ahmet pede uma solução javascript / jquery, acho que a sua também deve ser a resposta. +1
Javier
8

O seguinte é o meu método preferido, e mudarei o cursor sempre que uma página estiver prestes a mudar, ou seja beforeunload

$(window).on('beforeunload', function(){
   $('*').css("cursor", "progress");
});
Shaneparsons
fonte
1
esta é de longe a implementação mais fácil e simples que você pode fazer. Muito obrigado.
JC203
7

Usando jquery e css:

$("#element").click(function(){ 
    $(this).addClass("wait");
});​

HTML: <div id="element">Click and wait</div>​

CSS: .wait {cursor:wait}​

Demo aqui

Tusar
fonte
Isso demonstra que o cursor de espera pode ser mostrado sobre um contêiner que é menor que a página inteira - pode fazer sentido se outras partes da página ainda puderem interagir. Aqui, apenas enquanto pairava sobre o div. Na prática, o item escolhido para mostrar o cursor de espera deve ser maior do que o item clicado. Freqüentemente, é melhor mostrar na página inteira, como na resposta aceita.
ToolmakerSteve
6

Substituir todos os elementos únicos

$("*").css("cursor", "progress");
สุด เขต นะ จ๊ะ
fonte
6
O problema com essa abordagem é que você perderia o estilo CSS para seletores como: active /: hover, uma vez que a espera acabasse
Ahmad
6
$('#some_id').click(function() {
  $("body").css("cursor", "progress");
  $.ajax({
    url: "test.html",
    context: document.body,
    success: function() {
      $("body").css("cursor", "default");
    }
  });
});

Isso criará um cursor de carregamento até que sua chamada ajax seja bem-sucedida.

Kanishka Panamaldeniya
fonte
1
@Christoph, por que você não nos responde com o melhor código, por favor? Eu definitivamente preferiria um código melhor sempre.
Bobort
@Bobort esta pergunta já tem muitas respostas decentes. Também tem 4 anos e, entretanto, successe completesão removidos em jQ3, então você tem que ir com $.ajax(...).always(...);o cursor progess poderia ser definido na beforeSendfunção.
Christoph
6

jQuery:
$("body").css("cursor", "progress");

de volta
$("body").css("cursor", "default");

Puro:
document.body.style.cursor = 'progress';

de volta
document.body.style.cursor = 'default';

xoxn-- 1'w3k4n
fonte
5

Você não precisa de JavaScript para isso. Você pode alterar o cursor para o que quiser usando CSS:

selector {
    cursor: url(myimage.jpg), auto;
}

Veja aqui o suporte do navegador, pois existem algumas diferenças sutis dependendo do navegador

Manse
fonte
1
Você não precisa de javascript para acionar a mudança para um cursor diferente?
Toolmaker Steve
@ToolmakerSteve nope - você pode usar CSS apenas - apenas mude o seletor para definir onde você deseja que o cursor seja usado
Manse
3

Aqui está outra coisa interessante que você pode fazer. Defina uma função para chamar antes de cada chamada de ajax. Também atribua uma função a ser chamada após a conclusão de cada chamada ajax. A primeira função definirá o cursor de espera e a segunda o limpará. Eles se parecem com o seguinte:

$(document).ajaxComplete(function(event, request, settings) {
    $('*').css('cursor', 'default');
  });

function waitCursor() {
    $('*').css('cursor', 'progress');
  }
Shawn Vincent
fonte
1

Se salvar muito rápido, tente o seguinte:

<style media="screen" type="text/css">
    .autosave {display: inline; padding: 0 10px; color:green; font-weight: 400; font-style: italic;}
</style>

<input type="button" value="Save" onclick="save();" />&nbsp;
<span class="autosave" style="display: none;">Saved Successfully</span>


$('span.autosave').fadeIn("80");
$('span.autosave').delay("400");
$('span.autosave').fadeOut("80");
Mark Eilenberger
fonte
1

Definir o cursor como 'corpo' mudará o cursor para o fundo da página, mas não para os controles nela. Por exemplo, os botões ainda terão o cursor regular ao passar o mouse sobre eles. O seguinte é o que estou usando:

Para definir o cursor de 'espera', crie um elemento de estilo e insira no cabeçalho:

var css = "* { cursor: wait; !important}";
var style = document.createElement("style");
style.type = "text/css";
style.id = "mywaitcursorstyle";
style.appendChild(document.createTextNode(css));
document.head.appendChild(style);

Em seguida, para restaurar o cursor, exclua o elemento de estilo:

var style = document.getElementById("mywaitcursorstyle");
if (style) {
  style.parentNode.removeChild(style);
}
cat_in_hat
fonte
0

Descobri que a única maneira de fazer com que o cursor efetivamente redefina seu estilo de volta ao que tinha antes de ser alterado para o estilo de espera era definir o estilo original em uma folha de estilo ou em tags de estilo no início da página, definir a classe do objeto em questão ao nome do estilo. Então, após o período de espera, você define o estilo do cursor de volta para uma string vazia, NÃO "padrão" e ele retorna ao seu valor original conforme definido nas suas tags de estilo ou folha de estilo. Definir como "padrão" após o período de espera apenas altera o estilo do cursor para cada elemento para o estilo chamado "padrão", que é um ponteiro. Não o altera de volta ao seu valor anterior.

Existem duas condições para fazer este trabalho. Primeiro você deve definir o estilo em uma folha de estilo ou no cabeçalho da página com tags de estilo, NÃO como um estilo embutido e, em segundo lugar, deve redefinir seu estilo, definindo o estilo de espera de volta para uma string vazia.

David Crawford
fonte