clearTimeout无法正常工作

时间:2017-09-04 16:29:44

标签: javascript jquery html ajax

    //Create Account - Register Button
$('#registerCreateAccount').on('click', function() {
    var uid = $('#registerUsername').val();
    var email = $('#registerEmail').val();
    var age = $('#registerAge').val();
    var pwd = $('#registerPassword').val();
    var confirmPwd = $('#registerConfirmPassword').val();
    $.post('./php/register/createAccount.php', {uid: uid, email: email, age: age, pwd: pwd, confirmPwd: confirmPwd}, function(data) {
        if (errTime) {
            clearTimeout(errTime);
        }
        $('.errorMsg').html('<span class="w3-display-middle">' + data + '</span>');
        var errTime = setTimeout(function() {
            $('.errorMsg').html('');
        }, 5000);
    });
});

基本上我所做的是将数据发送到PHP文件,如果有回调,则会出现错误消息。所以我改变之前看不见的.errMsg div的html,因为它没有任何内容。由于我只希望错误消息存在5秒钟,所以我决定使用setTimeout在5秒后清除内容。

问题是当人们连续多次点击注册按钮时,setTimeout会继续运行。因此,我决定在按下按钮时清除第一个超时(如果存在),但由于某种原因它不起作用。

我一直在看这个差不多一个小时,我似乎无法找到这个错误,谢谢你们帮助我!

你们所有人都很棒,谢谢你们这么快帮助我!

3 个答案:

答案 0 :(得分:2)

在你的代码范围内,变量在post回调函数内结束,使这个变量全局可用,然后就可以了

var errTime;
$('#registerCreateAccount').on('click', function() {
    var uid = $('#registerUsername').val();
    var email = $('#registerEmail').val();
    var age = $('#registerAge').val();
    var pwd = $('#registerPassword').val();
    var confirmPwd = $('#registerConfirmPassword').val();
    $.post('./php/register/createAccount.php', {uid: uid, email: email, age: age, pwd: pwd, confirmPwd: confirmPwd}, function(data) {

            clearTimeout(errTime);

        $('.errorMsg').html('<span class="w3-display-middle">' + data + '</span>');
        errTime = setTimeout(function() {
            $('.errorMsg').html('');
        }, 5000);
    });
});

答案 1 :(得分:0)

范围问题。

var errTime;移到$.post的初始调用之上,因此不会在每次调用时重新定义它。保持errTime = setTimeout(....)不变,但没有var

答案 2 :(得分:0)

var errTime只是在超时函数范围内已知 要么在全局范围内定义errTime,要么在$(&#39; #registerCreateAccount&#39;)内定义(&#39;点击&#39;,函数(){

用于定义uid的功能等等......

另一种方法是使用窗口[&#39; errTime&#39;] = ....