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

jQueryの書き方の質問です。
補足にある外部ファイル jquery.q.js は、jQueryでカウントダウンと、liタグの文字クリックで "xxxxx" を表示する関数を試しに作ってみたのですが、ワンクリックで quesFunc() だけでなくもう一つの関数 countDown() にも干渉したいのですが書き方がわからずにいます。


liタグの文字をクリックしたらカウントダウンをストップし、そのストップした残秒数を <input type="hidden" name="time" value=""> に渡したいのです。
どのような書き方になるでしょうか?


よろしくお願いします。

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

▽最新の回答へ

質問者から

index.php

<!DOCTYPE html>
<html lang="ja">
<head>
<{$content_type|smarty:nodefaults}>
<link href="<{$root_surl}>css/master.css" rel="stylesheet" type="text/css">
<script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="../js/jquery.q.js" type="text/javascript"></script>
<script>


$(function(){ //---カウントダウン
var timelimit = '<{$timelimit}>';
var m = getFinishTime(parseInt(timelimit, 10));
countDown(m);
});
$(function(){ //---テスト
$("ul>li").click(quesFunc);
});
</script>
</head>

<body>
<div id="Timer"></div>
<ul>
<li id="1">テスト1</li>
<li id="2">テスト2</li>
<li id="3">テスト3</li>
</ul>
<form id="nextquizBtn" action="<{$url}>" method="post" target="_self">
<input type="hidden" name="id" value="<{$id}>">
<input type="hidden" name="time" value="">
<input type="submit" value="次へ">
</form>

</body>
</html>



jquery.q.js

// --- カウントダウン
function getFinishTime(e){
var datetime = new Date();
return datetime.setTime(datetime.getTime() + ((e) * 1000)); // 秒
}
function countDown(m){
var startTime = new Date();
var endTime = new Date(m);
var diff= endTime - startTime;
var times= 24 * 60 * 60 * 1000;
var sec= Math.floor(diff % times / 1000) % 60 % 60
if(diff > 0){
$("#Timer").text(sec);
setTimeout(function(){
countDown(m);
}, 10);
}else{
// 終了した時のテキスト
$("#Timer").text('Time Over !!');
}
}

// --- クリックアクション
var selectID;
function quesFunc(){
if (selectID == this.id) return;
$(this).addClass("selected");
$("#" + selectID).removeClass("selected");
this.innerText = "xxxxx"
}

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

例えば、こんな感じ。

$(function(){ //---テスト
 $("ul>li").click(function() {
 quesFunc();
 countDown();
 });
});

jQuery 的には、こうした方が良いのかも。

$(function(){ //---テスト

 $("ul>li")
 .click(quesFunc)
 .click(countDown);

});

目立つように改行してますが、一行に続けて書いても同じです。

$(function(){ //---テスト

 $("ul>li").click(quesFunc).click(countDown);

});




(追記、というか、書き直しです)
先の回答は、ばっさり無視してください。

外部スクリプトに、ちょっと手を加えてみました。
★が末尾についている行が、追加(×4)・変更(×1)した行です。

var continue_count_down = true; // ★

// --- カウントダウン
function getFinishTime(e){
 var datetime = new Date();
 return datetime.setTime(datetime.getTime() + ((e) * 1000)); // 秒
}
function countDown(m){
 var startTime = new Date();
 var endTime = new Date(m);
 var diff = endTime - startTime;
 var times = 24 * 60 * 60 * 1000;
 var sec = Math.floor(diff % times / 1000) % 60 % 60
 if(continue_count_down && diff > 0){ // ★
 $("#Timer").text(sec);
 setTimeout(function(){
 countDown(m);
 }, 10);
 }else if (diff > 0){ // ★
 $("#nextquizBtn input[name='time']").val(Math.floor(diff / 1000)); // ★
 }else{
 // 終了した時のテキスト
 $("#Timer").text('Time Over !!');
 }
}

// --- クリックアクション
var selectID;
function quesFunc(){
 if (selectID == this.id) return;
 $(this).addClass("selected");
 $("#" + selectID).removeClass("selected");
 this.innerText = "xxxxx"
 continue_count_down = false; // ★
}

name="time" の type を "text" に変えて、実際に残り秒数が入るのを確認してみてください。


a-kuma3さんのコメント
あー、setTimeout を止めなきゃいけないのか orz quesFunc() は、何度か呼ばれても大丈夫なようにしてあるふうに見えますけど、一回クリックしちゃったら、取戻しが効かなくてOKですか?

appfbさんのコメント
いつもありがとうございます。 いま、教えていただいた >|javascript| $(function(){ //---テスト $("ul>li").click(quesFunc).click(countDown); }); ||< で試している最中でした。 はい、今回は1回しかクリックしません。

a-kuma3さんのコメント
回答に追記しました(というか、書き直しですね ><)。

appfbさんのコメント
バッチリ動作しました! ありがとうございます。 type を "text"に変更して、値が取れていることも確認しました。 jQuery というより JavaScript を、苦手としてきましたが、教えていただいたことを逆にたどるとそうでもない気がしてきます。 $("ul>li").click(quesFunc).click(countDown); の書き方も今後必要な時があると思いますので、勉強になりまた助かります。 ありがとうございました。
関連質問

●質問をもっと探す●



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