96 votes

Attendre le curseur sur toute la page html

Est-il possible de mettre le curseur en attente sur toute la page html de manière simple ? L'idée est de montrer à l'utilisateur que quelque chose se passe pendant qu'un appel ajax est en cours. Le code ci-dessous montre une version simplifiée de ce que j'ai essayé et démontre également les problèmes que je rencontre :

  1. Si un élément (#id1) a un style de curseur défini, il ignorera celui défini sur le corps (évidemment).
  2. certains éléments ont un style de curseur par défaut (a) et n'afficheront pas le curseur d'attente au survol de l'élément.
  3. l'élément body a une certaine hauteur qui dépend du contenu et si la page est courte, le curseur ne s'affichera pas sous le pied de page

Le test :

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

Montage ultérieur...
Il a fonctionné dans firefox et IE avec :

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>

Le problème avec (ou la caractéristique de) cette solution est qu'elle empêchera les clics à cause de la div qui se chevauche (merci Kibbee).

Plus tard, le montage...
Une solution plus simple de la part de Dorward :

.wait, .wait * { cursor: wait !important; }

et ensuite

<a href="#" onclick="document.body.className = 'wait'; return false">Do something</a>

Cette solution ne montre que le curseur d'attente mais permet les clics.

0 votes

Il semble que je ne sois pas en mesure de changer le curseur pour les éléments de sélection. Existe-t-il un moyen de changer le curseur pour l'élément de sélection également ?

114voto

Dani Points 608

Si vous utilisez cette version légèrement modifiée du CSS que vous avez posté de Dorward,

html.wait, html.wait * { cursor: wait !important; }

vous pouvez alors ajouter quelques jQuery pour fonctionner pour tous les appels ajax :

$(document).ready(function () {
    $(document).ajaxStart(function () { $("html").addClass("wait"); });
    $(document).ajaxStop(function () { $("html").removeClass("wait"); });
});

ou, pour les anciennes versions de jQuery (avant 1.9) :

$(document).ready(function () {
    $("html").ajaxStart(function () { $(this).addClass("wait"); });
    $("html").ajaxStop(function () { $(this).removeClass("wait"); });
});

4 votes

Je veux vraiment utiliser cette réponse... pourquoi n'est-elle pas acceptée ?

1 votes

@gloomy.penguin Cette question était active plus de 3 ans avant ma réponse, mais je suis tombé dessus lors de ma propre recherche de solution, et j'ai décidé de partager la solution que j'ai fini par utiliser : un mélange de la réponse de Dorward, de jQuery, et du bon sens de Kyle. C'est un peu différent de ce que l'OP recherchait, mais si cela fonctionne pour vous, alors utilisez-le ! :)

0 votes

Je suis d'accord. Cela fonctionne très bien et, à mon avis, cela devrait être la réponse acceptée.

35voto

Eric Wendelin Points 13805

Je comprends que vous n'ayez pas le contrôle sur ce point, mais vous pourriez plutôt opter pour une div de "masquage" qui couvre l'ensemble du corps avec un z-index supérieur à 1. La partie centrale de la div pourrait contenir un message de chargement si vous le souhaitez.

Vous pouvez alors configurer le curseur pour qu'il attende sur la div et ne pas avoir à vous soucier des liens, car ils se trouvent "sous" votre div de masquage. Voici quelques exemples de CSS pour la "div de masquage" :

body { height: 100%; }
div#mask { cursor: wait; z-index: 999; height: 100%; width: 100%; }

3 votes

Cela peut souvent causer des problèmes. Dans Firefox, le fait de placer un div fixe sur l'ensemble de la page rend la page entière impossible à cliquer, c'est-à-dire que vous ne pouvez pas cliquer sur les liens, car vous ne cliquez pas sur le lien, mais sur le div situé devant le lien.

1 votes

Fonctionne bien dans firefox. Pas de chance dans IE :(. Dans IE, il se comporte exactement comme si le div n'était pas là. La seule façon d'obtenir le comportement souhaité est de définir une couleur sur le fond de la division.

2 votes

Ok, après avoir joué un peu plus, cela a finalement fonctionné avec : div#mask { display : none ; cursor : wait ; z-index : 9999 ; position : absolute ; top : 0 ; left : 0 ; height : 100% ; width : 100% ; background-color : #fff ; opacité : 0 ; filtre : alpha(opacité = 0);}

12voto

Kibbee Points 36474

Cela semble fonctionner dans firefox

<style>
*{ cursor: inherit;}
body{ cursor: wait;}
</style>

La partie * garantit que le curseur ne change pas lorsque vous survolez un lien. Les liens restent néanmoins cliquables.

0 votes

*{ cursor : wait !important ; } serait plus simple et aurait plus de chances de fonctionner dans IE (qui présente de nombreux bogues avec le mot-clé inherit).

1 votes

Peut-on appliquer * { cursor : wait } à partir de javascript ? - sauf en itérant tous les éléments dans le DOM entier :)

0 votes

Vous pourriez peut-être ajouter un élément de style et définir le innerHTML. Ce ne serait pas très élégant, mais cela pourrait fonctionner.

7voto

pasx Points 141

Je me suis débattu avec ce problème pendant des heures aujourd'hui. En fait, tout fonctionnait parfaitement dans FireFox mais (bien sûr) pas dans IE. Dans IE, le curseur d'attente s'affiche APRÈS l'exécution de la fonction qui prend du temps.

J'ai finalement trouvé le truc sur ce site : http://www.codingforums.com/archive/index.php/t-37185.html

Code :

//...
document.body.style.cursor = 'wait';
setTimeout(this.SomeLongFunction, 1);

//setTimeout syntax when calling a function with parameters
//setTimeout(function() {MyClass.SomeLongFunction(someParam);}, 1);

//no () after function name this is a function ref not a function call
setTimeout(this.SetDefaultCursor, 1);
...

function SetDefaultCursor() {document.body.style.cursor = 'default';}

function SomeLongFunction(someParam) {...}

Mon code s'exécute dans une classe JavaScript, d'où les termes this et MyClass (MyClass est un singleton).

J'ai eu les mêmes problèmes en essayant d'afficher un div comme décrit sur cette page. Dans IE, il s'affichait après l'exécution de la fonction. Je suppose donc que cette astuce résoudrait également ce problème.

Merci mille fois à glenngv l'auteur du post. Vous avez vraiment fait ma journée !!!

4voto

redbmk Points 934

Css : .waiting * { cursor: 'wait' }

jQuery : $('body').toggleClass('waiting');

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X