Changer le curseur en attente dans javascript / jquery

120

entrez la description de l'image ici

Comment puis-je faire changer mon curseur en cette icône de chargement lorsqu'une fonction est appelée et comment le changer en un curseur normal dans javascript / jquery

Ahmet
la source
7
si vous voulez exactement ce curseur, vous devez spécifier une url, sinon (avec la solution Roberts) chaque utilisateur verra le curseur de chargement en fonction de son OS.
Christoph
1
Christoph, qu'est-ce qui `` attendrait '' les autres systèmes d'exploitation Je suis actuellement sous Windows 7, car pour le moment ça a l'air bien
ahmet
2
eh bien, dans Vista, il afficherait le même curseur que dans Windows 7, mais avec son animation cassée, sur les anciens systèmes d'exploitation Windows, il afficherait le bon vieux sablier et sur Linux ou Mac OS, il afficherait leur curseur "d'attente" respectif. De plus, je suggérerais de ne pas manipuler le curseur des utilisateurs, car cela est généralement associé aux opérations OS, mais plutôt de fournir une petite animation d'attente comme celle-ci directement sur votre page Web, ce qui aide l'utilisateur à voir au premier coup d'œil que l'opération d'attente est causé par votre site et non par le système d'exploitation.
Christoph
1
voir aussi stackoverflow.com/questions/192900/…
Brian Burns
1
Bonne idée pour le bureau, mauvaise idée pour le mobile ...
Please_Dont_Bully_Me_SO_Lords

Réponses:

196

Dans votre utilisation jQuery:

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

puis de nouveau à la normale

$("body").css("cursor", "default");
Robert Stanley
la source
8
J'ai utilisé $("html,body")parce que le corps de ma page ne correspondait qu'à la moitié de la fenêtre, donc le curseur était toujours par défaut lors du survol de la moitié inférieure.
Keith
D'autres éléments de la page (par exemple les boutons Bootstrap) qui remplacent le curseur vers un affichage autre que celui par défaut bloqueront cette approche tant que le curseur est toujours sur l'élément. Dans ces cas, j'ai trouvé préférable d'utiliser !importantla solution de @ hrabinowitz ci
Addison Klinke
83

Un collègue a suggéré une approche que je trouve préférable à la solution choisie ici. Tout d'abord, en CSS, ajoutez cette règle:

body.waiting * {
    cursor: progress;
}

Ensuite, pour activer le curseur de progression, dites:

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

et pour désactiver le curseur de progression, dites:

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

L'avantage de cette approche est que lorsque vous désactivez le curseur de progression, tous les autres curseurs définis dans votre CSS seront restaurés. Si la règle CSS n'est pas suffisamment puissante pour remplacer les autres règles CSS, vous pouvez ajouter un identifiant au corps et à la règle, ou utiliser !important.

Hrabinowitz
la source
Excellente solution!
Kenton de Jong
31

Veuillez ne pas utiliser jQuery pour cela en 2018! Il n'y a aucune raison d'inclure une bibliothèque externe entière juste pour effectuer cette action qui peut être réalisée avec une seule ligne:

Changer le curseur en double flèche: document.body.style.cursor = 'wait';

Ramener le curseur à la normale: document.body.style.cursor = 'default';

kchuang7
la source
3
Il y a très probablement quelque chose sur cette page qui ajoute la nécessité d'un curseur de traitement personnalisé, ne pensez-vous pas? Pas un mauvais point bien sûr, mais le changement de jQuery déjà chargé pour autre chose serait ... ehm ... 100%?
patrick
Comme @ahmet demande une solution javascript / jquery, je pense que la vôtre devrait également être la réponse. +1
Javier
8

Ce qui suit est ma méthode préférée, et changera le curseur chaque fois qu'une page est sur le point de changer ie beforeunload

$(window).on('beforeunload', function(){
   $('*').css("cursor", "progress");
});
shaneparsons
la source
1
c'est de loin l'implémentation la plus simple et la plus simple que vous puissiez faire. Merci beaucoup.
JC203 le
Pas moyen de le reculer!
Ωmega il y a
@ Ωmega puisque la page est chargée après ces changements, il n'est pas nécessaire de la remettre en place.
shaneparsons
Eh bien, mais la question du PO demande autre chose, je suppose ...
Ωmega
7

Utilisation de jquery et css:

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

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

CSS: .wait {cursor:wait}​

Démo ici

Tusar
la source
Cela démontre que le curseur d'attente peut être affiché sur un conteneur qui est inférieur à la page entière - peut avoir du sens si d'autres parties de la page peuvent encore être interagies avec. Ici, seulement en survolant le div. En pratique, l'élément choisi pour afficher le curseur d'attente doit être plus grand que l'élément sur lequel vous avez cliqué. Souvent, il est préférable d'afficher sur toute la page, comme dans la réponse acceptée.
ToolmakerSteve
6

Remplacer tous les éléments uniques

$("*").css("cursor", "progress");
สุด เขต นะ จ๊ะ
la source
6
Le problème avec cette approche est que vous perdriez le style CSS pour les sélecteurs tels que: active /: hover, une fois que l'attente est terminée
Ahmad
6
$('#some_id').click(function() {
  $("body").css("cursor", "progress");
  $.ajax({
    url: "test.html",
    context: document.body,
    success: function() {
      $("body").css("cursor", "default");
    }
  });
});

Cela créera un curseur de chargement jusqu'à ce que votre appel ajax réussisse.

Kanishka Panamaldeniya
la source
1
@Christoph, pourquoi ne nous fournissez-vous pas une réponse avec le meilleur code, s'il vous plaît? Je préférerais toujours un meilleur code.
Bobort
@Bobort cette question a déjà beaucoup de réponses décentes. De plus, il a 4 ans et entre-temps successet completeest supprimé dans jQ3, vous devez donc utiliser $.ajax(...).always(...);Le curseur de progression peut être défini dans la beforeSendfonction.
Christoph
6

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

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

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

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

xoxn - 1'w3k4n
la source
5

Vous n'avez pas besoin de JavaScript pour cela. Vous pouvez changer le curseur en tout ce que vous voulez en utilisant CSS:

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

Voir ici pour la prise en charge du navigateur car il existe des différences subtiles selon le navigateur

Presbytère
la source
1
N'avez-vous pas besoin de javascript pour déclencher le changement vers un autre curseur?
ToolmakerSteve
@ToolmakerSteve non - vous ne pouvez utiliser que CSS - il suffit de changer le sélecteur pour définir où vous voulez que le curseur soit utilisé
Manse
3

Voici quelque chose d'intéressant que vous pouvez faire. Définissez une fonction à appeler juste avant chaque appel ajax. Attribuez également une fonction à appeler après la fin de chaque appel ajax. La première fonction définira le curseur d'attente et la seconde l'effacera. Ils ressemblent à ceci:

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

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

S'il enregistre trop rapidement, essayez ceci:

<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
la source
1

Le réglage du curseur pour «corps» changera le curseur pour l'arrière-plan de la page mais pas pour les contrôles sur celle-ci. Par exemple, les boutons auront toujours le curseur normal lorsqu'ils seront survolés. Voici ce que j'utilise:

Pour définir le curseur 'wait', créez un élément de style et insérez dans la tête:

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

Ensuite, pour restaurer le curseur, supprimez l'élément de style:

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

J'ai trouvé que le seul moyen pour que le curseur réinitialise efficacement son style à ce qu'il avait avant d'être changé en style d'attente était de définir le style d'origine dans une feuille de style ou dans des balises de style au début de la page, définissez la classe de l'objet en question au nom du style. Ensuite, après votre période d'attente, vous définissez le style du curseur sur une chaîne vide, PAS "par défaut" et il revient à sa valeur d'origine telle que définie dans vos balises de style ou feuille de style. Le paramétrer sur "par défaut" après la période d'attente ne change que le style du curseur pour chaque élément par le style appelé "par défaut" qui est un pointeur. Cela ne le ramène pas à sa valeur d'origine.

Il y a deux conditions pour que cela fonctionne. Vous devez d'abord définir le style dans une feuille de style ou dans l'en-tête de la page avec des balises de style, PAS en tant que style en ligne et en second lieu, réinitialiser son style en redéfinissant le style d'attente sur une chaîne vide.

David Crawford
la source