如何在使用setTimeout()时停止累积?

时间:2016-05-01 22:09:37

标签: javascript jquery ajax django

的.js

<script type="text/javascript">
var c={{ rest_time }}
var t

function timedCount()
{
    if(c>-1){
        $('#txt').html(c)
        c=c-1
        t=setTimeout("timedCount()",1000)    //1000ms后,执行参数1(调用自身)
    }

    else{
        $('#txt').html("time's up")
    }
}
$(document).ready(timedCount())

</script>

django view

def show_reply_page(request, topic_id):
    t = topic.objects.get(id=topic_id)
    comments = t.comment_set.filter(deleted=False)
    posts = t.post_set.filter(deleted=False)
    past_time = int(time.time() - t.locktime)
    rest_time = 300 - past_time
    t.save()
    return render_to_response('forum/reply.html', {'conf': conf, 'title': t.title,
                                             'request': request,
                                             'topic': t,
                                             'posts': posts,
                                             'comments': comments,
                                             'past_time': past_time,
                                             'rest_time' : rest_time,
    },
                              context_instance=RequestContext(request))

当我点击按钮时,django视图会给javascript一个{{rest_time}}。然后它将进行倒计时(每秒timedCount()调用自己)。但是当我再次点击它时,倒计时的速度会累积起来。这意味着当我点击它十次时,它每秒计算10秒。如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

两个选项:

选项1: 在函数开头设置全局值。例如window.counterStarted

但即使在设置该值之前,请检查是否已设置该全局值。如果是这样,那就不要再开始了。

if(typeof window.counterStarted !== undefined){
    return false;
}
window.counterStarted = true;

选项2:setTimeout定义为全局值,例如window.myTimeout,而不是函数中的局部变量t。然后在新的启动之前清除先前的超时,在函数的开头使用以下内容:

if(typeof window.myTimeout !== undefined){
    clearTimeout(window.myTimeout);
}