jQuery: ฉันสามารถโทรล่าช้า () ระหว่าง addClass () และเช่นนั้นได้หรือไม่?


178

บางอย่างเรียบง่ายเพียง:

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

ดูเหมือนจะไม่ทำงาน สิ่งที่จะเป็นทางเลือกที่ง่ายที่สุด?


10
ต้องการทำสิ่งเดียวกัน มันจะยอดเยี่ยมในการโทร$("#div").addClassTemporarily("error",1000)
Sebastien Lorber

คำตอบ:


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 ("ข้อผิดพลาด"). ล่าช้า (1,000) .que (ฟังก์ชั่น () {$ (นี้) .removeClass ("ข้อผิดพลาด");}); ดูเหมือนสง่างามมากขึ้น?
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: เหมือนกับความคิดเห็นแรก Simple JS ยังทำงานได้ดีในบางครั้ง
wowpatrick

1
+1 เพื่อความง่าย แต่ +1 ด้วยคำตอบที่ยอมรับเพราะมันชี้ให้ฉันเห็นว่า. guue () ผ่านวัตถุที่ต่อเนื่องซึ่งต้องถูกเรียกด้วยตนเอง ('ถัดไป ()') ผมเคยใช้เวลาครึ่งชั่วโมงสงสัยว่าทำไมห่วงโซ่ของฉันเรียกกลับ parameterless ดำเนินการเพียงครั้งแรกหนึ่ง - ตัวอย่างมากมายในเว็บไซต์อื่น ๆ ที่ใช้ความล่าช้าเดียวในห่วงโซ่และโทรกลับ parameterless ซึ่งเป็นบิตเปลือกทำให้เข้าใจผิดจากการที่กลไก
Quetzalcoatl

1
เพียงโน้ตคนอวดรู้: setTimeout มาจากวัตถุหน้าต่างของเบราว์เซอร์ (BOM) JavaScript (เข้าใจว่าเป็นสคริปต์ ECMA) ไม่มีวิธีการดังกล่าว
corbacho

9

ฉันรู้ว่านี่เป็นโพสต์ที่เก่ามาก แต่ฉันได้รวมคำตอบบางส่วนไว้ในฟังก์ชั่นการห่อหุ้ม jQuery ที่รองรับการโยง หวังว่ามันจะเป็นประโยชน์กับใครบางคน:

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

และนี่คือ wrapper removeClass:

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

ตอนนี้คุณสามารถทำสิ่งนี้ - รอ 1 วินาทีเพิ่มรอ 3 วินาที.errorลบ.error:

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


มีประโยชน์มาก! ขอบคุณ!
Fabian Jäger

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

delaysetTimeout()ไม่ทำงานในฟังก์ชั่นคิวไม่มีดังนั้นเราจึงควรใช้

และคุณไม่จำเป็นต้องแยกสิ่งต่าง ๆ สิ่งที่คุณต้องทำคือการรวมทุกอย่างในsetTimeOutวิธีการ:

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

คุณไม่จำเป็นต้องใช้การหน่วงเวลา () กับ setTimeout ()
MattYao

@ Mattao ฉันไม่คิดว่าคุณจะได้รับความคิด หากคุณไม่ใช้ setTimeout การหน่วงเวลานั้นจะไม่สามารถทำได้
Alex Jolig

1
การแก้ปัญหาไม่จำเป็นต้องใช้ทั้งสองอย่างร่วมกัน ใช้ล่าช้า () กับคิว () ใน jQuery หรือเพียงแค่ใช้ setTimeout () สามารถแก้ปัญหาได้ ฉันไม่ได้กำลังบอกว่าคำตอบของคุณผิด
MattYao


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.