jQuery の clearTimeout でループ処理が止まらなくて悩んでいます。


ソースは以下です。
ご教授いただけると本当に助かります。

var timerId = function(){
setTimeout(function(){
処理
timerId(); //ループさせるために関数を読み込んでいる
},2000);
}
var tm = timerId();


//////////////////////////////////////////////////////////////////
//画像クリックでタイマーを止めたい

$("#stop").click(function(){
if(timerId){
clearTimeout(timerId);
});

ポイントの残高があると思っていたのですが、0ptだったので
支払いポイントもなく、厚かましいですが
小さなヒントだけでもいただければ嬉しく思います。
よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/05/22 10:24:29

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

これじゃ止まらないですよ。
clearTimeout の引数に渡すのは、setTimeout の戻り値ですけど、どこにも代入されてないですもん。

素直にループさせるなら、setTimeout じゃなくて setInterval を使う方が簡単。

var timerId = setInterval(function() {
        処理
    }, 2000);

$("#stop").click(function() {
        if (timerId) {  // 要らないけどね
            clearInterval(timerId);
        }
    });

どうしても setTimeout を使いたいならこんな感じ。

var timerId
var job = function() {
        処理
        timerId = setTimeout(job, 2000);
    };
timerId = setTimeout(job, 2000);

$("#stop").click(function() {
        if (timerId) {  // 要らないけどね
            clearTimeout(timerId);
        }
    });
id:sakabeee

ありがとうございました!
setTimeoutの戻り値を代入するんですね。
jQueryを独学で勉強しだして2年間、ずっとぶつかっていた疑問が解消しました!
無事、イメージどおりに動くものができました。
ソースまで丁寧に書いていただいて、
凄くわかりやすかったです。
ありがとうございました。

2013/05/22 09:47:36

その他の回答1件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

これじゃ止まらないですよ。
clearTimeout の引数に渡すのは、setTimeout の戻り値ですけど、どこにも代入されてないですもん。

素直にループさせるなら、setTimeout じゃなくて setInterval を使う方が簡単。

var timerId = setInterval(function() {
        処理
    }, 2000);

$("#stop").click(function() {
        if (timerId) {  // 要らないけどね
            clearInterval(timerId);
        }
    });

どうしても setTimeout を使いたいならこんな感じ。

var timerId
var job = function() {
        処理
        timerId = setTimeout(job, 2000);
    };
timerId = setTimeout(job, 2000);

$("#stop").click(function() {
        if (timerId) {  // 要らないけどね
            clearTimeout(timerId);
        }
    });
id:sakabeee

ありがとうございました!
setTimeoutの戻り値を代入するんですね。
jQueryを独学で勉強しだして2年間、ずっとぶつかっていた疑問が解消しました!
無事、イメージどおりに動くものができました。
ソースまで丁寧に書いていただいて、
凄くわかりやすかったです。
ありがとうございました。

2013/05/22 09:47:36
id:Cherenkov No.2

回答回数1504ベストアンサー獲得回数493

うーんシリーズ。

var timerId = setInterval(function() {
  //処理
  console.log(Date.now());
}, 500);

$("body").click(function(){
  clearInterval(timerId);
});

//----------

var timerId;
var timer = function() {
  timerId = setTimeout(function() {
    //処理
    console.log(Date.now());
    timer();
  }, 500);
}
timer();

$("body").click(function(){
  clearTimeout(timerId);
});
id:sakabeee

ありがとうございます。
検索しても中々、ピンポイントの答えが無くって困っていたんですが、
Cherenkovさんとa-kuma3さんの回答があったので、
動くものができました。
ありがとうございます!

2013/05/22 09:49:16

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません