jQuery:addClass()などの間で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();
});

または、デキューメソッドを使用します。

$("#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

私の知る限り、delayメソッドは数値CSSの変更に対してのみ機能します。

他の目的のために、JavaScriptにはsetTimeoutメソッドが付属しています。

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

11
+1:JqueryのためにJqueryを使用しないでください。多くの問題に対する簡単なJavaScriptソリューションがあります。
Joel

1
+1:最初のコメントと同じです。Simple JSも正常に動作する場合があります。
wowpatrick

1
単純化のために+1しましたが、受け入れられた回答も+1しました。これは、.queue()が実際に手動で呼び出さなければならない継続オブジェクト(「next()」)を渡すことを指摘しました。私は、パラメータなしのコールバックの私のチェーンは最初のものだけを実行し、なぜ不思議時間の半分を費やしてきた-他のサイト上の多くの例は、そのメカニズムのビット誤解単純化しすぎているチェーン内の単一の遅延やパラメータのないコールバックを使用する
ケツァルコアトルを

1
単なる注意書き:setTimeoutは、ブラウザーのウィンドウオブジェクト(BOM)から取得されます。JavaScript(ECMAスクリプトとして理解される)にはそのメソッドはありません。
corbacho 2012年

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

今、あなたはこのようなことをすることができます.error-1 秒待って、追加して、3 秒待って、削除して.errorください:

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


非常に役立ちます!ありがとうございました!
FabianJäger18年

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

遅延はキューに作用します。そして、私が知る限り、(animate以外の)css操作はキューに入れられません。


2

delayどのキュー関数でも機能しないため、を使用する必要がありますsetTimeout()

そして、あなたは物事を分離する必要はありません。あなたがする必要があるのはsetTimeOutメソッドにすべてを含めることです:

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

setTimeout()でdelay()を使用する必要はありません。
MattYao

@MattYao私はあなたが考えを理解していないと思います。setTimeoutを使用しない場合、その遅延は機能しません
Alex Jolig

1
このソリューションでは、両方を連携させる必要はありません。jQueryのqueue()でdelay()を使用するか、単にsetTimeout()を使用することで問題を解決できます。私はあなたの答えが間違っていると言っているのではありません。
MattYao 2019

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.