2013-10-11 64 views
0

我想知道如何将毫秒添加到我的JS计数器的测验中。在这一点上,测验本身只计数并寻找秒(在mysql中是秒数,如:120(2分钟),并显示为02:00)。现在我想增加毫秒。在此先感谢javascript - 将毫秒添加到计数器

这里的脚本:

<script type="text/javascript"> 
var quiz_timer = 0; 

$(window).load(function(){ 
setInterval('run_timer()',1000) 
}) 

function run_timer() 
{ 
quiz_timer++; 

if(quiz_timer > 60) 
{ 
    sec = quiz_timer%60; 
    min = Math.floor(quiz_timer/60); 
} 
else 
{ 
    sec = quiz_timer; 
    min = 0; 
} 

var timer=''; 

if(min < 10) 
timer = '0'; 

timer += min; 

timer += ':'; 

if(sec < 10) 
timer += '0'; 

timer += sec; 


var timer_h = 'Time: '+timer;//+rand(); 
$('#quiz_timer').html(timer_h); 
$('#quiz_time').val(quiz_timer); 
} 

function update_quiz() 
{ 
var cnt_questions = parseInt($('#cnt_questions').val()); 
var cq = parseInt($('#current_question').val()); 
var op = $('#question_'+cq).find('input[type=radio]:checked').length; 

if(op == 0) 
{ 
    alert('You must answer on the question.'); 
    return false; 
} 

if(cq < cnt_questions) 
{ 
    $('#question_'+cq).hide(); 
    $('#question_'+(cq+1)).fadeIn(1000); 
    $('#current_question').val(cq+1); 
    return false; 
} 

$(window).unbind('beforeunload'); 
document.frm_quiz.submit(); 
} 
</script> 

而这里的功能是输入mysql中的数据:

function timer($quiz_timer) 
{ 
if($quiz_timer > 60) 
{ 
    $sec = $quiz_timer%60; 
    $min = floor($quiz_timer/60); 
} 
else 
{ 
    $sec = $quiz_timer; 
    $min = 0; 
} 

$timer=''; 

if($min < 10) 
$timer = '0'; 

$timer .= $min; 

$timer .= ':'; 

if($sec < 10) 
$timer .= '0'; 

$timer .= $sec; 

return $timer; 
} 
+1

您是否尝试过加入他们吗? – putvande

+0

@putvande我一直在寻找正确的方式,但我找不到任何... –

+0

嗯..对于初学者..你需要改变你的'setInterval'运行每毫秒而不是每秒。 – putvande

回答

1

试试这个:

<script type="text/javascript"> 
    var quiz_timer = 0; 
    var millisecondFactor = 60; //lesser this factor, accurate the timer will work 
    var sec = 0; 
    var min = 0; 
    var hour = 0; 
    $(window).load(function() { 
     setInterval('run_timer()', (1000/millisecondFactor)); 
    }) 

    function run_timer() { 
     quiz_timer++; 
     millisec = quiz_timer; 
     if (millisec > millisecondFactor) { 
      sec++; 
      quiz_timer = 0; 
     } 
     if (sec > 59) { 
      min++; 
      sec = 0; 
     } 
     if (min > 59) { 
      hour++; 
      min = 0; 
     } 
     if (hour > 23) { 
      hour = 0; 
     } 

     var timer = ''; 

     if (min < 10) 
      timer = '0'; 

     timer += min; 

     timer += ':'; 

     if (sec < 10) 
      timer += '0'; 

     timer += sec; 

     timer += ':'; 

     if (millisec < 10) 
      timer += '0'; 

     timer += millisec; 

     var timer_h = 'Time: ' + timer;//+rand(); 
     $('#quiz_timer').html(timer_h); 
     $('#quiz_time').val(quiz_timer); 
    } 

    function update_quiz() { 
     var cnt_questions = parseInt($('#cnt_questions').val()); 
     var cq = parseInt($('#current_question').val()); 
     var op = $('#question_' + cq).find('input[type=radio]:checked').length; 

     if (op == 0) { 
      alert('You must answer on the question.'); 
      return false; 
     } 

     if (cq < cnt_questions) { 
      $('#question_' + cq).hide(); 
      $('#question_' + (cq + 1)).fadeIn(1000); 
      $('#current_question').val(cq + 1); 
      return false; 
     } 

     $(window).unbind('beforeunload'); 
     document.frm_quiz.submit(); 
    } 
</script> 
+0

现在工作完全正常,我可以看到计时器正在运行毫秒,你介意检查我的编辑,看看在mysql中输入数据的代码的第二部分,出于某种原因,它输入所有错误的时间... –

+0

以及我不介意..但你将不得不将它作为新的问题发布..:p –

+0

伟大的,当然,这里是:http://stackoverflow.com/questions/19318651/js-add-timer-in- MySQL的-AS-日期时间与 - 毫秒 –

0

您当前的方式有很显著的缺陷:setInterval的时机并不完美。处理时间的更好方法是使用Date对象,获取开始时间,然后在setInterval中计算经过的时间。

下面是一些示例代码,应该让你在正确的轨道上。它只需要你来格式化你怎么想的时候,你是好去:

/* display the currently elapsed time */ 
function showTime(){ 
    var time = formatTime(Date.now() - startTime); 
    document.getElementById('timer').innerHTML = time; 
} 

/* format the number of miliseconds how you wish them */ 
function formatTime(elapsed) { 
    var hours, minutes, seconds, milis; 

    hours = Math.floor(elapsed/(60*60*1000)); 
    elapsed -= hours * 60 * 60 * 1000; 

    minutes = Math.floor(elapsed/(60*1000)); 
    elapsed += minutes * 60 * 1000; 

    seconds = Math.floor(elapsed/1000); 
    elapsed -= seconds * 1000; 

    milis = elapsed; 

    return 'H' + hours + ' M' + minutes + ' S' + seconds + ' F' + milis; // change this 
} 

/* start counting */ 
var startTime = Date.now(); 
/* runs every 10ms, but it's hardly noticeable */ 
var interval = window.setInterval(showTime, 10); 

/* stop after a while */ 
window.setTimeout(function() { window.clearInterval(interval);}, 3000); 

DEMO:http://jsbin.com/EqoRezE/1/edit

PS:Date.now()可能无法使用您的特定目标浏览器。你可以找到一个替代实现此处 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now

+0

这次我会坚持使用我的代码...我真的很想先理解代码,然后才能继续前进。感谢您的努力。 –

+0

不用担心。请记住,它存在根本上的缺陷,尽管在处理秒数时缺陷可能不会变得明显,但在增加粒度时会困扰您。我会用一些格式编辑我的文章,以帮助您理解我的代码和原始代码。 – Tibos

+0

非常感谢你,我想让它能够正常工作,因为我现在正处于工作中。我遇到了一些问题,用户有两秒钟的时间,我必须增加毫秒,所以我可以更容易地排序......但是,感谢您帮助我,我真的很感激。 –