Cambiar el cursor a esperar en javascript / jquery

119

ingrese la descripción de la imagen aquí

¿Cómo puedo hacer que mi cursor cambie a este ícono de carga cuando se llama a una función y cómo lo volvería a cambiar a un cursor normal en javascript / jquery?

ahmet
fuente
7
si desea exactamente este cursor, debe especificar una URL; de lo contrario (con la solución de Roberts), cada usuario verá el cursor de carga según su sistema operativo.
Christoph
1
Christoph, ¿qué mostraría 'esperar' para otros sistemas operativos? Estoy actualmente en Windows 7, porque en este momento se ve bien
ahmet
2
bueno, en Vista mostraría el mismo cursor que en Windows 7, pero con su animación rota, en un sistema operativo Windows más antiguo mostraría el viejo reloj de arena y en Linux o Mac OS mostraría su respectivo cursor "en espera". También sugeriría no manipular el cursor del usuario, ya que esto se asocia comúnmente con OS-Operations, sino que proporcione una pequeña animación de espera como estas directamente en su página web, lo que ayuda al usuario a ver a primera vista que la operación de espera es causado por su sitio y no por el sistema operativo.
Christoph
1
ver también stackoverflow.com/questions/192900/…
Brian Burns
1
Buena idea para la mesa, mala idea para el móvil ...
Please_Dont_Bully_Me_SO_Lords

Respuestas:

195

En su uso de jQuery:

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

y luego de nuevo a la normalidad

$("body").css("cursor", "default");
Robert Stanley
fuente
8
Lo usé $("html,body")porque el cuerpo de mi página solo se ajusta a la mitad de la ventana, por lo que el cursor todavía estaba predeterminado al pasar el cursor sobre la mitad inferior.
Keith
Otros elementos de la página (es decir, botones de Bootstrap) que anulan el cursor a una pantalla no predeterminada bloquearán este enfoque mientras el cursor todavía está sobre el elemento. En esos casos, me pareció preferible usarlo !importantcon la solución de @ hrabinowitz a continuación
Addison Klinke
82

Un colega sugirió un enfoque que considero preferible a la solución elegida aquí. Primero, en CSS, agregue esta regla:

body.waiting * {
    cursor: progress;
}

Luego, para activar el cursor de progreso, diga:

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

y para apagar el cursor de progreso, diga:

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

La ventaja de este enfoque es que cuando apaga el cursor de progreso, se restaurarán los otros cursores que se hayan definido en su CSS. Si la regla CSS no es lo suficientemente poderosa en precedencia para anular otras reglas CSS, puede agregar una identificación al cuerpo y a la regla, o usar !important.

Hrabinowitz
fuente
Excelente solucion!
Kenton de Jong
31

¡No use jQuery para esto en 2018! No hay ninguna razón para incluir una biblioteca externa completa solo para realizar esta acción que se puede lograr con una línea:

Cambiar el cursor a ruleta: document.body.style.cursor = 'wait';

Revertir el cursor a la normalidad: document.body.style.cursor = 'default';

kchuang7
fuente
3
Lo más probable es que haya algo en esa página que agregue la necesidad de un cursor de procesamiento personalizado, ¿no crees? No es un mal punto, por supuesto, pero el cambio de jQuery que ya se está cargando por otra cosa sería ... ehm ... ¿100%?
patrick
Como @ahmet solicita una solución javascript / jquery, creo que la tuya también debería ser la respuesta. +1
Javier
8

La siguiente es mi forma preferida, y cambiará el cursor cada vez que una página esté a punto de cambiar, es decir beforeunload

$(window).on('beforeunload', function(){
   $('*').css("cursor", "progress");
});
shaneparsons
fuente
1
esta es, con mucho, la implementación más fácil y simple que puede hacer. Muchas gracias.
JC203
7

Usando jquery y css:

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

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

CSS: .wait {cursor:wait}​

Demo aquí

tusar
fuente
Esto demuestra que el cursor de espera se puede mostrar sobre un contenedor que es menor que la página completa; puede tener sentido si aún se puede interactuar con otras partes de la página. Aquí, solo mientras se cierne sobre el div. En la práctica, el elemento elegido para mostrar el cursor de espera debe ser más grande que el elemento en el que se hizo clic. A menudo, es mejor mostrarlo en toda la página, como en la respuesta aceptada.
ToolmakerSteve
6

Anular todos los elementos individuales

$("*").css("cursor", "progress");
สุด เขต นะ จ๊ะ
fuente
6
El problema con este enfoque es que perdería el estilo CSS para selectores como: active /: hover, una vez que termine la espera
Ahmad
6
$('#some_id').click(function() {
  $("body").css("cursor", "progress");
  $.ajax({
    url: "test.html",
    context: document.body,
    success: function() {
      $("body").css("cursor", "default");
    }
  });
});

Esto creará un cursor de carga hasta que su llamada ajax tenga éxito.

Kanishka Panamaldeniya
fuente
1
@Christoph, ¿por qué no nos da una respuesta con el mejor código, por favor? Definitivamente preferiría un mejor código siempre.
Bobort
@Bobort, esta pregunta ya tiene muchas respuestas decentes. También es de 4 años y mientras tanto successy completese eliminan en JQ3, así que hay que ir con $.ajax(...).always(...);el cursor progess se podría establecer en la beforeSendfunción.
Christoph
6

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

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

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

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

xoxn-- 1'w3k4n
fuente
5

No necesita JavaScript para esto. Puedes cambiar el cursor a lo que quieras usando CSS:

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

Consulte aquí la compatibilidad con el navegador, ya que existen algunas diferencias sutiles según el navegador.

Casa del pastor
fuente
1
¿No necesita javascript para activar el cambio a un cursor diferente?
ToolmakerSteve
@ToolmakerSteve no, solo puede usar CSS, simplemente cambie el selector para definir dónde desea que se use el cursor
Manse
3

Aquí hay algo más interesante que puedes hacer. Defina una función para llamar justo antes de cada llamada ajax. También asigne una función para llamar después de que se complete cada llamada ajax. La primera función establecerá el cursor de espera y la segunda lo borrará. Tienen el siguiente aspecto:

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

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

Si guarda demasiado rápido, intente esto:

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

Establecer el cursor para 'cuerpo' cambiará el cursor para el fondo de la página pero no para los controles en ella. Por ejemplo, los botones seguirán teniendo el cursor normal al pasar el cursor sobre ellos. Lo siguiente es lo que estoy usando:

Para configurar el cursor de 'espera', cree un elemento de estilo e insértelo en el encabezado:

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

Luego, para restaurar el cursor, elimine el elemento de estilo:

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

Descubrí que la única forma de hacer que el cursor restableciera efectivamente su estilo a lo que tenía antes de ser cambiado al estilo de espera era establecer el estilo original en una hoja de estilo o en etiquetas de estilo al comienzo de la página, establecer la clase del objeto en cuestión al nombre del estilo. Luego, después de su período de espera, vuelve a establecer el estilo del cursor en una cadena vacía, NO "por defecto" y vuelve a su valor original como se estableció en sus etiquetas de estilo o hoja de estilo. Establecerlo en "predeterminado" después del período de espera solo cambia el estilo del cursor para cada elemento al estilo llamado "predeterminado", que es un puntero. No lo vuelve a cambiar a su valor anterior.

Hay dos condiciones para que esto funcione. Primero debe establecer el estilo en una hoja de estilo o en el encabezado de la página con etiquetas de estilo, NO como un estilo en línea y, en segundo lugar, restablecer su estilo estableciendo el estilo de espera de nuevo en una cadena vacía.

David Crawford
fuente