jQuery : addClass ()와 delay 사이에 delay ()를 호출 할 수 있습니까?


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또는 dequeuejQuery를 사용하면이 대기중인 항목으로 수행되는 것을 알고는 다음 단계로 이동해야 할 것입니다.


3
큐잉 된 함수에 사용 된 jquery 객체에 대한 참조를 쉽게 전달할 수 있으므로이 옵션이 마음에 듭니다. 따라서보다 일반적인 컨텍스트 (하드 코딩 된 이름없이)에서 사용할 수 있습니다.
GrandmasterB

5
왜 "다음"이 필요한가요? 우리가 할 수있는 $ ( "# div"). addClass ( "error"). delay (1000) .queue (function () {$ (this) .removeClass ( "error");}); 더 우아해 보인다?
Vennsoh

@Vennsoh '다음'대기열 항목을 전달할 필요가 없습니다. 대신 dequeue () 메소드를 사용하도록 선택할 수 있습니다. api.jquery.com/dequeue
gfullam

49

AFAIK 지연 방법은 숫자 CSS 수정에만 작동합니다.

다른 목적으로 JavaScript에는 setTimeout 메소드가 제공됩니다.

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

11
+1 : Jquery를 위해 Jquery를 사용하지 마십시오. 많은 문제에 대한 간단한 자바 스크립트 솔루션이 있습니다.
Joel

1
+1 : 첫 코멘트와 동일합니다. 간단한 JS도 때때로 잘 작동합니다.
와우 패트릭

1
단순화를 위해 +1이지만 허용 된 답변을 +1했습니다. 다른 사이트에 많은 예제 사용 체인에서 하나의 지연과 매개 변수가 콜백, 그 메커니즘 약간의 오해의 소지가 지나친 단순화이다 - 나는 매개 변수가 콜백 내 체인은 첫 번째 실행 이유를 궁금해 시간의 절반을 보냈다
케찰코아틀이

1
pedant 메모 : setTimeout은 브라우저의 윈도우 객체 (BOM)에서옵니다. JavaScript (ECMA Script로 이해)에는 해당 방법이 없습니다.
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');


매우 도움이되었습니다! 감사합니다!
Fabian Jäger

6

jQuery의 CSS 조작은 대기열에 들어 있지 않지만 다음을 수행하여 '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 ()과 함께 delay ()를 사용할 필요는 없습니다.
MattYao

@MattYao 나는 당신이 아이디어를 얻을 생각하지 않습니다. 당신은 그 지연 실 거예요 작업의 setTimeout 사용 해달라고하면
알렉스 졸릭

1
이 솔루션은 함께 작동하기 위해 둘 다 필요하지 않습니다. jQuery에서 queue ()와 함께 delay ()를 사용하거나 setTimeout ()을 사용하면 문제를 해결할 수 있습니다. 나는 당신의 대답이 잘못되었다고 말하는 것이 아닙니다.
MattYao

0

이 시도:

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

0

이 간단한 화살표 기능을 사용해보십시오.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.