0

質問で正確に正しい用語を使用したかどうかはわかりませんが、playSequence() 関数と setTimeOutFunction のループを使用して、一連の時限関数呼び出しをトリガーしています。これでうまくいきますが、すべてのタイマーを一時停止する一時停止機能と、すべてのタイマーを再開する再開機能が必要です。問題は、pauseAllTimers() 関数で関数オブジェクトの一時停止メソッドを呼び出そうとすると、「Uncaught TypeError: Object 0 has no method 'pause'. 何か案は?

var timers = new Array();

function Timer(callback, delay) {
var timerId, start, remaining = delay;

this.pause = function() {
    window.clearTimeout(timerId);
    remaining -= new Date() - start;
};

this.resume = function() {
    start = new Date();
    timerId = window.setTimeout(callback, remaining);
};

this.resume();
}

function pauseAllTimers()
{
for (var timer in timers) 
{   
    timer.pause();
}
} 

function resumeAllTimers()
{
for (var timer in timers) 
{   
    timer.resume();
}
}

function playSequence()
{
var totaltimeout = 0;
for (var lesson_step_str in lesson_step) 
{
    var splitarr = lesson_step[lesson_step_str].split("|||");
    var element = splitarr[0];
    var txt = splitarr[1];
    var timeout = splitarr[2];
    totaltimeout += (timeout*1);
    console.log(totaltimeout);
    console.log(txt);

    (function(a,b){

     var timer = new Timer(function(){ displayText( a, b); }, totaltimeout * 1000);
     timers.push(timer);
  })(element, txt);

}   
}
4

1 に答える 1

0

ループでは、オブジェクトの代わりにインデックスを返すため、次のようにする必要がありますfortimerTimer

timers[timer].pause();

以下は作業コードです:

var timers = new Array();

var Timer = function (callback, delay) {
    this.timerId, this.start, this.remaining = delay;

    this.pause = function () {
        window.clearTimeout(this.timerId);
        this.remaining -= new Date() - this.start;
    };

    this.resume = function () {
        this.start = new Date();
        this.timerId = window.setTimeout(callback, this.remaining);
    };

    this.resume();
}

function pauseAllTimers() {
    for (var timer in timers) {
        timers[timer].pause();
    }
}

function resumeAllTimers() {
    for (var timer in timers) {
        timers[timer].resume();
    }
}

function playSequence() {
    var totaltimeout = 0;
    for (var i=1;i<6; i++) {    
        var txt = "this is part "+i, 
        element="#div"+i, timeout=2;
        totaltimeout += timeout;
        (function (a, b) {
            var timer = new Timer(function () {
                $("#divTxt").html(b);
            }, totaltimeout * 1000);
            timers.push(timer);
        })(element, txt);
    }
}

$(function(){
    $("#pauseAll").click(function(){
        pauseAllTimers();
    });

    $("#resumeAll").click(function(){
        resumeAllTimers();
    });

    playSequence();
});
于 2013-09-18T01:09:12.457 に答える