次のような単純なもの:
$("#div").addClass("error").delay(1000).removeClass("error");
動作しないようです。最も簡単な代替手段は何ですか?
新しいキューアイテムを作成して、クラスを削除できます。
$("#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に、このキューに入れられたアイテムの処理が完了し、次のアイテムに進む必要があることを知らせるためです。
私の知る限り、遅延方法は数値のCSS変更に対してのみ機能します。
他の目的のために、JavaScriptにはsetTimeoutメソッドが付属しています。
window.setTimeout(function(){$("#div").removeClass("error");}, 1000);
これは非常に古い投稿であることは知っていますが、いくつかの答えを連鎖をサポートする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');
jQuery CSS操作はキューに入れられませんが、次を使用して「fx」キュー内で実行できます。
$('#div').delay(1000).queue('fx', function() { $(this).removeClass('error'); });
SetTimeoutを呼び出すのとまったく同じですが、代わりにjQueryのキューメカニズムを使用します。
もちろん、次のように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);
遅延はキューで動作します。そして、私が知っている限りでは、CSS操作(アニメートを介して以外)はキューに入れられていません。
delay
はどのキュー関数でも機能しないため、setTimeout()
を使用する必要があります。
そして、物事を分ける必要はありません。必要なことは、すべてをsetTimeOut
メソッドに含めることです。
setTimeout(function () {
$("#div").addClass("error").delay(1000).removeClass("error");
}, 1000);
これを試して:
function removeClassDelayed(jqObj, c, to) {
setTimeout(function() { jqObj.removeClass(c); }, to);
}
removeClassDelayed($("#div"), "error", 1000);