Зміна курсору на очікування в JavaScript / jquery


120

введіть тут опис зображення

Як я можу змусити мій курсор змінити цю піктограму завантаження, коли викликається функція, і як я поверну її до звичайного курсору у javascript / jquery


7
якщо ви хочете саме цей курсор, вам потрібно вказати URL, інакше (з рішенням Робертса) кожен користувач побачить курсор завантаження залежно від його ОС.
Крістоф

1
Крістофе, що б "чекати" шоу для інших операційних систем, я зараз на Windows 7, тому що на даний момент це добре
ахмет

2
ну, в Vista він показав би той самий курсор, що і в Windows 7, але з його пошкодженою анімацією, на старих ОС Windows він показав би хороший пісочний годинник, а в Linux або Mac OS показав би відповідний курсор "очікування". Також я б запропонував не маніпулювати курсором користувачів, оскільки це зазвичай асоціюється з операціями з ОС, а скоріше надати трохи анімації очікування, як це безпосередньо на вашій веб-сторінці, що допомагає користувачеві побачити на перший погляд, що операція очікування викликано вашим сайтом, а не ОС.
Крістоф


1
Хороша ідея для робочого столу, ідея BAD для мобільних ...
Please_Dont_Bully_Me_SO_Lords

Відповіді:


195

У використанні jQuery:

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

і знову повернутися до норми

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

8
Я використовував, $("html,body")тому що тіло моєї сторінки підходило лише до половини вікна, тому курсор усе ще був за замовчуванням, коли наводити курсор на нижню половину.
Кіт

Інші елементи на сторінці (тобто кнопки Bootstrap), які замінюють курсор на дисплей, що не використовується за замовчуванням, заблокують цей підхід, поки курсор все ще над елементом. У цих випадках я вважав за краще використовувати !importantрішення @ hrabinowitz нижче
Аддісон Клінке

82

Колега запропонував підхід, який я вважаю за краще обране тут рішення. Спочатку в CSS додайте це правило:

body.waiting * {
    cursor: progress;
}

Потім, щоб увімкнути курсор прогресу, скажіть:

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

і щоб вимкнути курсор прогресу, скажіть:

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

Перевага такого підходу полягає в тому, що при відключенні курсору прогресу все, що інші курсори, визначені у вашому CSS, буде відновлено. Якщо правило CSS не є достатньо потужним, щоб перекрити інші правила CSS, ви можете додати ідентифікатор до тіла та правила або використовувати !important.


Відмінне рішення!
Кентон де Йонг

31

Будь ласка, не використовуйте jQuery для цього у 2018 році! Немає підстав включати цілу зовнішню бібліотеку просто для виконання цієї однієї дії, яку можна досягти одним рядком:

Змінення курсору на спінер: document.body.style.cursor = 'wait';

Повернути курсор у звичайне: document.body.style.cursor = 'default';


3
Швидше за все, на цій сторінці є щось, що додає потреби в користувацькому курсорі обробки, чи не думаєте ви? Звичайно, це не погано, але зміна jQuery, що вже завантажується на щось інше, буде ... е-е ... 100%?
патрік

Оскільки @ahmet просить вирішити javascript / jquery, я думаю, що ваша відповідь також повинна бути. +1
Хав'єр

8

Наступний мій бажаний спосіб, і буде змінювати курсор щоразу, коли сторінка збирається змінити, тобто beforeunload

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

1
це, безумовно, найпростіша і найпростіша реалізація, яку ви можете зробити. Дуже дякую.
JC203

7

Використання jquery та css:

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

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

CSS: .wait {cursor:wait}​

Демо тут


Це демонструє, що курсор очікування може бути показаний над контейнером, меншим за всю сторінку - це може мати сенс, якщо з іншими частинами сторінки все ще можна взаємодіяти. Тут, тільки поки нависав над div. На практиці вибраний елемент для показу курсору очікування повинен бути більшим, ніж елемент, на який натиснули. Часто його найкраще показувати на всій сторінці, як у прийнятій відповіді.
ToolmakerSteve

6

Замініть всі єдині елементи

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

6
Проблема такого підходу полягає в тому, що ви втратите стиль CSS для селекторів, таких як: active /: наведіть курсор, як тільки очікування закінчиться
Ахмад

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

Це створить курсор завантаження, поки ваш виклик Ajax не вдасться.


1
@Christoph, чому б ти не надав нам відповіді з кращим кодом? Я б точно вважав за краще кращий код завжди.
Бобборт

@Bobort на це питання вже є багато гідних відповідей. Крім того, 4 -х років , а між тим successі completeвидаляються в СВ3, так що ви повинні піти з $.ajax(...).always(...);ходом процесу курсор може бути встановлений в beforeSendфункції.
Крістоф

6

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

знову
$("body").css("cursor", "default");

Чисто:
document.body.style.cursor = 'progress';

знову
document.body.style.cursor = 'default';


5

Для цього вам не потрібен JavaScript. Ви можете змінити курсор на що завгодно, використовуючи CSS:

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

Дивіться тут про підтримку веб-переглядача, оскільки існують деякі тонкі відмінності залежно від браузера


1
Вам не потрібен JavaScript, щоб викликати зміни до іншого курсору?
ToolmakerSteve

@ToolmakerSteve nope - ви можете використовувати лише CSS - просто змініть селектор, щоб визначити, де ви хочете використовувати курсор
Manse

3

Ось ще щось цікаве ви можете зробити. Визначте функцію для виклику безпосередньо перед кожним викликом ajax. Також призначте функцію для виклику після завершення кожного дзвінка ajax. Перша функція встановить курсор очікування, а друга очистить його. Вони виглядають так:

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

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

1

Якщо це зберігається занадто швидко, спробуйте це:

<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

Якщо встановити курсор на "body", це змінить курсор для фону сторінки, але не для елементів керування на ньому. Наприклад, кнопки все ще матимуть звичайний курсор при наведенні на них. Далі - це те, що я використовую:

Щоб встановити курсор "чекати", створіть елемент стилю та вставте в голову:

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

Потім, щоб відновити курсор, видаліть елемент стилю:

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

0

Я виявив, що єдиний спосіб повернути курсор ефективно скинути стиль до того, що він мав до зміни стилю очікування, - це встановити оригінальний стиль у таблиці стилів або у тегах стилів на початку сторінки, встановити клас відповідного об'єкта до назви стилю. Потім після закінчення періоду очікування ви повертаєте стиль курсору до порожнього рядка, НЕ "за замовчуванням", і він повертається до його початкового значення, встановленого в тегах стилю або аркуші стилів. Якщо встановити його "за замовчуванням" після періоду очікування, лише змінює стиль курсора для кожного елемента на стиль, званий "за замовчуванням", який є вказівником. Це не повертає його до колишнього значення.

Є дві умови, щоб зробити цю роботу. По-перше, ви повинні встановити стиль у таблиці стилів або у заголовку сторінки за допомогою тегів стилів, НЕ як стиль вбудованого, а друге - скинути його стиль, встановивши стиль очікування назад у порожній рядок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.