jQuery: Чи можу я викликати затримку () між addClass () та подібним?


178

Щось таке просто, як:

$("#div").addClass("error").delay(1000).removeClass("error");

Схоже, не працює. Яка була б найпростіша альтернатива?


10
хотів зробити саме те саме. Було б здорово зателефонувати$("#div").addClassTemporarily("error",1000)
Себастьян Лорбер

Відповіді:


365

Ви можете створити новий елемент черги, щоб видалити клас:

$("#div").addClass("error").delay(1000).queue(function(next){
    $(this).removeClass("error");
    next();
});

Або використовуючи метод dequeue :

$("#div").addClass("error").delay(1000).queue(function(){
    $(this).removeClass("error").dequeue();
});

Причина, по якій потрібно зателефонувати nextабо dequeueповідомити jQuery про те, що ви робите з цим елементом у черзі, і що він повинен перейти до наступного.


3
Мені подобається цей варіант, тому що він дозволяє легко передавати посилання на об'єкт jquery, який використовується у черзі, тому його можна використовувати в більш загальному контексті (без жорстких закодованих імен).
GrandmasterB

5
Для чого нам потрібен «наступний»? Чи можемо ми зробити $ ("# div"). AddClass ("помилка"). Затримка (1000) .queue (функція () {$ (це) .removeClass ("помилка");}); Здається більш елегантним?
Венсох

@Vennsoh Вам не потрібно передавати елемент чергової черги. Ви можете скористатися методом dequeue () замість: api.jquery.com/dequeue
gfullam

49

Метод затримки AFAIK працює лише для числових модифікацій CSS.

Для інших цілей JavaScript поставляється із методом setTimeout:

window.setTimeout(function(){$("#div").removeClass("error");}, 1000);

11
+1: Не використовуйте Jquery заради Jquery. Існують прості рішення JavaScript для багатьох проблем.
Джоель

1
+1: Так само, як перший коментар. Простий JS також працює чудово.
wowpatrick

1
+1 для простоти, але також поставив +1 до прийнятої відповіді - оскільки це вказувало на мене, що .queue () фактично передає об'єкт продовження, який потрібно викликати вручну ("next ()"). Я провів півгодини, цікавлячись, чому мій ланцюг зворотних викликів без параметрів виконує лише перший - багато прикладів на інших сайтах використовують одну затримку ланцюга та зворотний зворотний виклик без параметрів, що трохи вводить в оману спрощення цього механізму
quetzalcoatl

1
Лише педантна примітка: setTimeout надходить з віконного об’єкта браузера (BOM). JavaScript (розуміється як сценарій ECMA) не має цього методу.
corbacho

9

Я знаю, що це дуже стара публікація, але я поєднав кілька відповідей у ​​функцію обгортки jQuery, яка підтримує ланцюжок. Сподіваюся, що це комусь вигідно:

$.fn.queueAddClass = function(className) {
    this.queue('fx', function(next) {
        $(this).addClass(className);
        next();
    });
    return this;
};

І ось обгортка RemoveClass:

$.fn.queueRemoveClass = function(className) {
    this.queue('fx', function(next) {
        $(this).removeClass(className);
        next();
    });
    return this;
};

Тепер ви можете робити такі речі - зачекайте 1 сек, додайте .error, зачекайте 3 секунди, видаліть .error:

$('#div').delay(1000).queueAddClass('error').delay(2000).queueRemoveClass('error');


Дуже корисний! Дякую!
Фабіан Єгер

6

Маніпуляції з CSS jQuery не в черзі, але ви можете зробити його виконаним всередині черги 'fx', виконавши:

$('#div').delay(1000).queue('fx', function() { $(this).removeClass('error'); });

Зовсім те саме, що викликати setTimeout, але замість цього використовується меканізм черги jQuery.


Для мене це краще, ніж прийнята відповідь (дзвінки не повторюються, якщо в класі є перехідна трансформація).
vatavale

4

Звичайно, було б простіше, якби розширити jQuery так:

$.fn.addClassDelay = function(className,delay) {
    var $addClassDelayElement = $(this), $addClassName = className;
    $addClassDelayElement.addClass($addClassName);
    setTimeout(function(){
        $addClassDelayElement.removeClass($addClassName);
    },delay);
};

після цього ви можете використовувати цю функцію, як addClass:

$('div').addClassDelay('clicked',1000);

1
і якщо ви хочете додати ланцюгову підтримку, прочитайте основи створення плагінів або просто додайте return thisдо функції ...
user6322596

2

Затримка працює на черзі. і наскільки я знаю, маніпуляція css (крім анімації) не ставиться в чергу.


2

delayне працює ні в одній функції черги, тому ми повинні використовувати setTimeout().

І вам не потрібно розділяти речі. Все, що вам потрібно зробити, це включити все в setTimeOutметод:

setTimeout(function () {
    $("#div").addClass("error").delay(1000).removeClass("error");
}, 1000);

Вам не потрібно використовувати затримку () з setTimeout ().
MattYao

@MattYao Я не думаю, що ти зрозумієш. Якщо ви не використовуєте setTimeout, то ця затримка не буде працювати
Алекс Джоліг

1
Рішення не потрібно обом працювати разом. Або використання затримки () з чергою () в jQuery, або просто використання setTimeout () може вирішити проблему. Я не кажу, що ваша відповідь неправильна.
MattYao

0

Спробуйте це:

function removeClassDelayed(jqObj, c, to) {    
    setTimeout(function() { jqObj.removeClass(c); }, to);
}
removeClassDelayed($("#div"), "error", 1000);

0

Спробуйте цю просту функцію зі стрілкою:

setTimeout( () => { $("#div").addClass("error") }, 900 );

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