เมื่อใช้ jquery ฉันจะสร้างตัวจับเวลาที่สามารถรีสตาร์ททันทีและนับถอยหลังอย่างเห็นได้ชัดได้อย่างไร

jsfiddle ปัจจุบัน

ปัญหาหลักได้รับการเคลียร์แล้ว ไม่ว่าฉันจะทำอะไรก็ตาม ดูเหมือนว่าช่วงเวลาจะเรียกใช้ตัวจับเวลาหลายครั้งสำหรับการคลิกแต่ละครั้ง แม้ว่าฉันจะเคลียร์แล้วก็ตาม

ฉันอยู่ที่นั่นทั้งคืน ฉันเพียงแค่ต้องการรีสตาร์ทตัวจับเวลาถอยหลังเมื่อคลิก ฉันกำลังพยายามให้เวลาบุคคลนั้น 5 วินาทีในการเตรียมตัว และ 7 วินาทีในการลงมือทำ ดังนั้นจึงจำเป็นต้องนับถอยหลังจาก 5 จากนั้นนับถอยหลังจาก 7 และเมื่อคลิกแล้วจะต้องเริ่มใหม่ทั้งหมด

มันยากกว่าที่คิดมาก

ฉันใช้คำสั่งผสมของ

clearInterval()
var Interval = setInterval(function(){}, 1000);

แต่ก็ไม่สามารถทำให้มันทำงานได้


person Max Meents    schedule 18.09.2015    source แหล่งที่มา
comment
คุณควรระบุรหัสที่ส่งคืนภายใน setInterval ถึง clearInterval เช่น clearInterval(Interval)   -  person kav    schedule 18.09.2015
comment
ขอบคุณสำหรับความคิดเห็นแต่ฉันก็ทำอย่างนั้น   -  person Max Meents    schedule 18.09.2015


คำตอบ (2)


ลองอันนี้:

var timer = (function() {
    var timer = null;

    return {
        start: function( timesToRun, callback, interval ) {
            var timesRan = 0
            timer = setInterval( function() {
                if ( timesRan < timesToRun ) {
                    timesRan++
                    callback( timesRan, timesRan === timesToRun )
                } else {
                    clearInterval( timer )
                }
            }, interval || 1000 )

            return this 
        },

        stop: function() {
            clearInterval( timer )

            return this
        }
    }
}())

var cyclesLabel = document.getElementById("t")

// first argument is the amount of times to run the interval
// second argument is a callback to use on each iteration
// the 3rd argument is optional and is the interval time in milliseconds.
timer.start( 7, totalCycles, 1000 )

// Reset example
document.getElementById("btn").addEventListener( "click", function() {
   cyclesLabel.textContent = "0"
   timer.stop().start( 5, totalCycles )
} )

// Just for the sake of the example
function totalCycles( cycles, lastCycle ) {
   cyclesLabel.textContent = cycles

   if ( lastCycle === true ) {
     alert( "This is the last chance to do something" )
   }
}

http://jsfiddle.net/eedny9jn/2/

person elad.chen    schedule 18.09.2015
comment
ฉันหวังว่าฉันจะเขียนโค้ดได้สวยและซับซ้อนอย่างง่ายดายเช่นนี้ - person Max Meents; 18.09.2015
comment
ไม่มีอะไรพิเศษที่นี่ คุณเพียงแค่ต้องอ่านหนังสือสักหนึ่งหรือสองเล่มเพื่อเสริมความรู้ js ของคุณ - person elad.chen; 18.09.2015

setTimeout() ส่งคืนตัวระบุที่คุณสามารถใช้เพื่อยกเลิกคำขอ:

var timerId = setTimeout(function() { console.log('Now!'); }, 5000);

จากนั้นคุณสามารถยกเลิกได้ในภายหลัง เว้นแต่จะมีการดำเนินการไปแล้ว:

$('#cancelTimerButton').click(function() {  clearTimeout(timerId); });

หากคุณต้องการเห็นภาพคุณสามารถทำสิ่งนี้:

var n = 0;
var tick = function() {
    console.log(n % 2 ? 'Tock' : 'Tick');
    timerId = setTimeout(tick, 1000);
    if (++n == 5) {
        clearTimeout(timerId);
    }
};
var timerId = setTimeout(tick, 1000);`
person Flub    schedule 18.09.2015
comment
คุณจะนับถอยหลังด้วยสายตาด้วย setTimeout ได้อย่างไร - person Max Meents; 18.09.2015
comment
คุณสามารถใช้ 1 วินาที (1,000 มิลลิวินาที) และเก็บตัวนับได้หรือไม่? - person Flub; 18.09.2015