Zmiana kursora na czekanie w javascript / jquery


120

wprowadź opis obrazu tutaj

Jak zmienić kursor na tę ikonę ładowania, gdy wywoływana jest funkcja i jak zmienić ją z powrotem na normalny kursor w javascript / jquery


7
jeśli chcesz dokładnie ten kursor, musisz podać adres URL, w przeciwnym razie (z rozwiązaniem Roberts) każdy użytkownik zobaczy kursor ładowania w zależności od swojego systemu operacyjnego.
Christoph

1
Christoph, co by
`` czekało

2
cóż, w Vista pokazałby ten sam kursor co w Windows 7, ale z jego zepsutą animacją, w starszym systemie Windows pokazywałby starą dobrą klepsydrę, a na Linuksie lub Mac OS pokazywałby odpowiadający im kursor „oczekujący”. Sugerowałbym również, aby nie manipulować kursorem użytkownika, ponieważ jest to zwykle kojarzone z operacjami systemu operacyjnego, ale raczej zapewnij małą animację oczekiwania, taką jak te, bezpośrednio na stronie internetowej, która pomaga użytkownikowi na pierwszy rzut oka zobaczyć, że operacja oczekująca jest spowodowane przez Twoją witrynę, a nie system operacyjny.
Christoph


1
Dobry pomysł na komputer, ZŁY pomysł na telefon komórkowy ...
Please_Dont_Bully_Me_SO_Lords

Odpowiedzi:


196

W swoim jQuery użyj:

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

a potem z powrotem do normalności

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

8
Użyłem, $("html,body")ponieważ treść mojej strony mieści się tylko w połowie okna, więc kursor nadal był domyślny po najechaniu na dolną połowę.
Keith

Inne elementy na stronie (np. Przyciski Bootstrap), które przesłaniają kursor do wyświetlania innego niż domyślny, blokują to podejście, gdy kursor jest nadal nad elementem. W takich przypadkach uważam, że lepiej jest używać !importantz rozwiązaniem @ hrabinowitz poniżej
Addison Klinke

83

Kolega zaproponował podejście, które uważam za lepsze od wybranego tutaj rozwiązania. Najpierw w CSS dodaj tę regułę:

body.waiting * {
    cursor: progress;
}

Następnie, aby włączyć kursor postępu, powiedz:

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

Aby wyłączyć kursor postępu, powiedz:

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

Zaletą tego podejścia jest to, że gdy wyłączysz kursor postępu, wszystkie inne kursory, które mogły zostać zdefiniowane w twoim CSS, zostaną przywrócone. Jeśli reguła CSS nie ma wystarczającego pierwszeństwa, aby zastąpić inne reguły CSS, możesz dodać identyfikator do treści i reguły lub użyć !important.


Doskonałe rozwiązanie!
Kenton de Jong

31

Nie używaj do tego jQuery w 2018 roku! Nie ma powodu, aby włączać całą bibliotekę zewnętrzną tylko po to, aby wykonać tę jedną czynność, którą można wykonać za pomocą jednej linii:

Zmień kursor na spinner: document.body.style.cursor = 'wait';

Przywróć kursor do normalnego: document.body.style.cursor = 'default';


3
Najprawdopodobniej na tej stronie jest coś, co dodaje potrzebę niestandardowego kursora przetwarzania, nie sądzisz? Oczywiście niezła sprawa, ale zmiana jQuery już ładowanego na coś innego byłaby ... ehm ... 100%?
patrick

Ponieważ @ahmet prosi o rozwiązanie javascript / jquery, myślę, że twoja również powinna być odpowiedzią. +1
Javier

8

Poniższy sposób jest moim preferowanym sposobem i spowoduje zmianę kursora za każdym razem, gdy strona ma się zmienić, tj beforeunload

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

1
jest to zdecydowanie najłatwiejsza i najprostsza implementacja, jaką możesz zrobić. Wielkie dzięki.
JC203,

7

Korzystanie z jquery i css:

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

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

CSS: .wait {cursor:wait}​

Demo tutaj


To pokazuje, że kursor oczekiwania można wyświetlić nad kontenerem, który jest mniejszy niż cała strona - może to mieć sens, jeśli nadal można wchodzić w interakcję z innymi częściami strony. Tutaj tylko po najechaniu kursorem na div. W praktyce wybrany element do wyświetlenia kursora oczekiwania powinien być większy niż element kliknięty. Często najlepiej pokazać się na całej stronie, tak jak w zaakceptowanej odpowiedzi.
ToolmakerSteve

6

Zastąp wszystkie pojedyncze elementy

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

6
Problem z tym podejściem polega na tym, że stracisz styl CSS dla selektorów takich jak: active /: hover, gdy czekanie się skończy
Ahmad

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

Spowoduje to utworzenie kursora ładowania, dopóki wywołanie AJAX nie powiedzie się.


1
@ Christoph, dlaczego nie dostarczysz nam odpowiedzi z lepszym kodem, proszę? Zdecydowanie wolałbym zawsze lepszy kod.
Bobort

@Bobort to pytanie ma już wiele przyzwoitych odpowiedzi. Także to jest 4 lat, a tymczasem successi completesą usuwane w jQ3, więc trzeba iść z $.ajax(...).always(...);Kursor progess może być ustawiony w beforeSendfunkcji.
Christoph

6

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

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

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

z powrotem
document.body.style.cursor = 'default';


5

Nie potrzebujesz do tego JavaScript. Możesz zmienić kursor na cokolwiek chcesz za pomocą CSS:

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

Zobacz tutaj, aby uzyskać informacje o obsłudze przeglądarek, ponieważ w zależności od przeglądarki występują pewne subtelne różnice


1
Czy nie potrzebujesz javascript, aby wywołać zmianę na inny kursor?
ToolmakerSteve

@ToolmakerSteve nope - możesz używać tylko CSS - po prostu zmień selektor, aby określić, gdzie ma być używany kursor
Manse

3

Oto coś, co możesz zrobić. Zdefiniuj funkcję do wywołania tuż przed każdym wywołaniem AJAX. Przypisz także funkcję do wywołania po zakończeniu każdego wywołania ajax. Pierwsza funkcja ustawi kursor oczekiwania, a druga wyczyści go. Wyglądają następująco:

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

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

1

Jeśli oszczędza zbyt szybko, spróbuj tego:

<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

Ustawienie kursora na „treść” zmieni kursor na tło strony, ale nie na elementy sterujące na nim. Na przykład przyciski nadal będą miały zwykły kursor po najechaniu na nie kursorem. Oto, czego używam:

Aby ustawić kursor 'czekaj', stwórz element stylu i wstaw w nagłówku:

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

Następnie, aby przywrócić kursor, usuń element stylu:

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

0

Odkryłem, że jedynym sposobem na to, aby kursor skutecznie zresetował swój styl z powrotem do tego, jaki miał przed zmianą na styl oczekiwania, było ustawienie oryginalnego stylu w arkuszu stylów lub w tagach stylów na początku strony, ustaw klasę danego obiektu do nazwy stylu. Następnie, po okresie oczekiwania, ustawiasz styl kursora z powrotem na pusty ciąg, a nie na „domyślny”, i przywraca on pierwotną wartość ustawioną w znacznikach stylów lub arkuszu stylów. Ustawienie go na „domyślny” po okresie oczekiwania zmienia tylko styl kursora dla każdego elementu na styl o nazwie „domyślny”, którym jest wskaźnik. Nie przywraca jej pierwotnej wartości.

Istnieją dwa warunki, aby to zadziałało. Najpierw musisz ustawić styl w arkuszu stylów lub w nagłówku strony za pomocą tagów stylów, NIE jako styl wbudowany, a po drugie należy zresetować jego styl, ustawiając styl oczekiwania z powrotem na pusty ciąg.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.