人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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


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

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

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


●質問者: yoshioka
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● a-kuma3
ベストアンサー

これじゃ止まらないですよ。
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);
 }
 });

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

2 ● Cherenkov

うーんシリーズ。

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);
});

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

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ