Cambiare il cursore in attesa in javascript / jquery


120

inserisci qui la descrizione dell'immagine

Come faccio a far cambiare il mio cursore a questa icona di caricamento quando viene chiamata una funzione e come dovrei cambiarlo di nuovo in un normale cursore in javascript / jquery


7
se vuoi esattamente questo cursore, devi specificare un URL, altrimenti (con la soluzione Roberts) ogni utente vedrà il cursore di caricamento a seconda del suo sistema operativo.
Christoph

1
Christoph, cosa mostrerebbe 'aspettare' per altri sistemi operativi che sto attualmente su Windows 7, perché al momento sembra a posto
ahmet

2
beh, in Vista mostrerebbe lo stesso cursore di Windows 7, ma con la sua animazione rotta, sul vecchio sistema operativo Windows mostrerebbe la buona vecchia clessidra e su Linux o Mac OS mostrerebbe il rispettivo cursore "in attesa". Inoltre suggerirei di non manipolare il cursore dell'utente, poiché questo è comunemente associato alle operazioni del sistema operativo, ma piuttosto fornire una piccola animazione di attesa come queste direttamente sulla tua pagina web, che aiuta l'utente a vedere a prima vista, che l'operazione di attesa è causato dal tuo sito e non dal sistema operativo.
Christoph


1
Buona idea per desktop, BAD idea per dispositivi mobili ...
Please_Dont_Bully_Me_SO_Lords

Risposte:


195

Nel tuo jQuery usa:

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

e poi di nuovo alla normalità

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

8
Ho usato $("html,body")perché il corpo della mia pagina si adattava solo a metà della finestra, quindi il cursore era ancora predefinito quando si passa con il mouse sulla metà inferiore.
Keith

Altri elementi sulla pagina (ad esempio pulsanti Bootstrap) che sovrascrivono il cursore su una visualizzazione non predefinita bloccheranno questo approccio mentre il cursore si trova ancora sull'elemento. In questi casi, ho trovato preferibile l'uso !importantcon la soluzione di @ hrabinowitz di seguito
Addison Klinke

82

Un collega ha suggerito un approccio che trovo preferibile alla soluzione scelta qui. Innanzitutto, in CSS, aggiungi questa regola:

body.waiting * {
    cursor: progress;
}

Quindi, per attivare il cursore di avanzamento, dì:

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

e per disattivare il cursore di avanzamento, pronuncia:

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

Il vantaggio di questo approccio è che quando si spegne il cursore di avanzamento, tutti gli altri cursori possono essere stati definiti nel CSS verranno ripristinati. Se la regola CSS non è abbastanza potente in precedenza da sovrascrivere altre regole CSS, è possibile aggiungere un id al corpo e alla regola oppure utilizzare !important.


Ottima soluzione!
Kenton de Jong

31

Per favore non usare jQuery per questo nel 2018! Non c'è motivo di includere un'intera libreria esterna solo per eseguire questa azione che può essere ottenuta con una riga:

Cambia cursore in spinner: document.body.style.cursor = 'wait';

Riporta il cursore alla normalità: document.body.style.cursor = 'default';


3
Molto probabilmente c'è qualcosa in quella pagina che aggiunge la necessità di un cursore di elaborazione personalizzato, non credi? Non male ovviamente, ma il cambio di jQuery già caricato per qualcos'altro sarebbe ... ehm ... 100%?
patrick

Dato che @ahmet chiede una soluzione javascript / jquery, penso che anche la tua dovrebbe essere la risposta. +1
Javier

8

Quello che segue è il mio modo preferito e cambierà il cursore ogni volta che una pagina sta per cambiare, es beforeunload

$(window).on('beforeunload', function(){
   $('*').css("cursor", "progress");
});

1
questa è di gran lunga l'implementazione più semplice e semplice che puoi fare. Molte grazie.
JC203

7

Utilizzando jquery e css:

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

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

CSS: .wait {cursor:wait}​

Demo qui


Ciò dimostra che il cursore di attesa può essere visualizzato su un contenitore inferiore all'intera pagina - può avere senso se è ancora possibile interagire con altre parti della pagina. Qui, solo mentre aleggiavo sopra il div. In pratica, l'elemento scelto per mostrare il cursore di attesa dovrebbe essere più grande dell'elemento su cui si è cliccato. Spesso è meglio mostrare su tutta la pagina, come nella risposta accettata.
ToolmakerSteve

6

Sostituisci tutti i singoli elementi

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

6
Il problema con questo approccio è che perderesti lo stile CSS per selettori come: active /: hover, una volta terminata l'attesa
Ahmad

6
$('#some_id').click(function() {
  $("body").css("cursor", "progress");
  $.ajax({
    url: "test.html",
    context: document.body,
    success: function() {
      $("body").css("cursor", "default");
    }
  });
});

Questo creerà un cursore di caricamento fino a quando la chiamata ajax non avrà esito positivo.


1
@Christoph, perché non ci fornisci una risposta con il codice migliore, per favore? Sicuramente preferirei sempre un codice migliore.
Bobort

@Bobort questa domanda ha già molte risposte decenti. Inoltre è di 4 anni e nel frattempo successe completevengono rimossi in jQ3, quindi bisogna andare con $.ajax(...).always(...);il cursore progess potrebbe essere fissato in beforeSendfunzione di.
Christoph

6

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

di nuovo indietro
$("body").css("cursor", "default");

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

di nuovo indietro
document.body.style.cursor = 'default';


5

Non hai bisogno di JavaScript per questo. Puoi cambiare il cursore in qualsiasi cosa tu voglia usando CSS:

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

Vedi qui per il supporto del browser poiché ci sono alcune sottili differenze a seconda del browser


1
Non hai bisogno di JavaScript per attivare la modifica a un cursore diverso?
ToolmakerSteve

@ToolmakerSteve no - puoi usare solo CSS - cambia semplicemente il selettore per definire dove vuoi che venga usato il cursore
Manse

3

Ecco qualcos'altro di interessante che puoi fare. Definisci una funzione da chiamare subito prima di ogni chiamata ajax. Assegna anche una funzione da chiamare al termine di ogni chiamata ajax. La prima funzione imposterà il cursore di attesa e la seconda lo cancellerà. Hanno il seguente aspetto:

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

function waitCursor() {
    $('*').css('cursor', 'progress');
  }

1

Se salva troppo velocemente, prova questo:

<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");

1

L'impostazione del cursore per "corpo" cambierà il cursore per lo sfondo della pagina ma non per i controlli su di essa. Ad esempio, i pulsanti avranno ancora il cursore normale quando ci si passa sopra. Quanto segue è quello che sto usando:

Per impostare il cursore di "attesa", crea un elemento di stile e inserisci nella testa:

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);

Quindi per ripristinare il cursore, elimina l'elemento di stile:

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

0

Ho scoperto che l'unico modo per far sì che il cursore ripristinasse efficacemente il suo stile a quello che aveva prima di essere modificato nello stile di attesa era impostare lo stile originale in un foglio di stile o nei tag di stile all'inizio della pagina, imposta la classe dell'oggetto in questione al nome dello stile. Quindi, dopo il periodo di attesa, reimpostate lo stile del cursore su una stringa vuota, NON "predefinita" e ritorna al suo valore originale come impostato nei tag di stile o nel foglio di stile. Impostandolo su "default" dopo il periodo di attesa cambia solo lo stile del cursore per ogni elemento nello stile chiamato "default" che è un puntatore. Non lo riporta al suo valore precedente.

Ci sono due condizioni per far funzionare questo. Per prima cosa devi impostare lo stile in un foglio di stile o nell'intestazione della pagina con i tag di stile, NON come uno stile in linea e il secondo è reimpostare il suo stile impostando lo stile di attesa su una stringa vuota.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.