Jquery禁用链接5秒

Joh*_*ohn 10 ajax jquery onclick hyperlink

我有这个代码:

   $('#page-refresh').click( function() {
        $.ajax({
            url: "/page1.php",
            cache: false,
            dataType: "html",
            success: function(data) {
                $('#pagelist').html(data);
            }
        });
         return false;
   });
Run Code Online (Sandbox Code Playgroud)

在这段代码中,有可能在ajax成功函数中禁用#page-refresh点击5秒然后重新启用它?基本上,如果一个人点击按钮并且这个动作发生,我不希望他们再次点击并再次运行此动作5秒钟.我查看了delay()解除对此的点击,然后再次绑定它,但一旦解除绑定,它就再也不允许我点击按钮了.

T.J*_*der 13

如果"#page-refresh"实际上是一个按钮(a buttoninput type="button"元素),则可以使用其disabled属性,然后设置超时以恢复它:

$('#page-refresh').click( function() {
    var refreshButton = this;
    $.ajax({
        url: "/page1.php",
        cache: false,
        dataType: "html",
        success: function(data) {
            $('#pagelist').html(data);
            refreshButton.disabled = true;
            setTimeout(function() {
                refreshButton.disabled = false;
            }, 5000);
        }
    });
    return false;
});
Run Code Online (Sandbox Code Playgroud)

如果它不是真正的按钮,您可以模拟该disabled属性.我将在这里使用类来执行此操作,以便您可以通过CSS向用户显示禁用状态:

$('#page-refresh').click( function() {
    var $refreshButton = $(this);
    if (!$refreshButton.hasClass('disabled')) {
        $.ajax({
            url: "/page1.php",
            cache: false,
            dataType: "html",
            success: function(data) {
                $('#pagelist').html(data);
                $refreshButton.addClass('disabled');
                setTimeout(function() {
                    $refreshButton.removeClass('disabled');
                }, 5000);
            }
        });
        return false;
    });
Run Code Online (Sandbox Code Playgroud)

请注意,在第一种情况下,我保留对DOM元素(var refreshButton = this;)的引用,但在第二种情况下,我将保持对它周围的jQuery包装器的引用(var $refreshButton = $(this);).这只是因为jQuery使测试/添加/删除类名变得容易.在这两种情况下,一旦释放事件处理程序中的闭包(在上面,即ajax调用完成后的五秒),就会释放该引用.


你特意说你想在ajax调用完成禁用它,但正如Marcus在下面指出的那样,你可能想在启动 ajax调用时禁用它.只需稍微移动禁用位,并errorsuccess不调用的情况添加处理程序(error在任何情况下处理程序通常都是一个好主意):

真实按钮:

$('#page-refresh').click( function() {
    var refreshButton = this;
    refreshButton.disabled = true;             // <== Moved
    $.ajax({
        url: "/page1.php",
        cache: false,
        dataType: "html",
        success: function(data) {
            $('#pagelist').html(data);
            setTimeout(function() {
                refreshButton.disabled = false;
            }, 5000);
        },
        error: function() {                    // <== Added
            refreshButton.disabled = false;
        }
    });
    return false;
});
Run Code Online (Sandbox Code Playgroud)

通过'禁用'类模拟:

$('#page-refresh').click( function() {
    var $refreshButton = $(this);
    if (!$refreshButton.hasClass('disabled')) {
        $refreshButton.addClass('disabled');   // <== Moved
        $.ajax({
            url: "/page1.php",
            cache: false,
            dataType: "html",
            success: function(data) {
                $('#pagelist').html(data);
                setTimeout(function() {
                    $refreshButton.removeClass('disabled');
                }, 5000);
            },
            error: function() {                // <== Added
                $refreshButton.removeClass('disabled');
            }
        });
        return false;
    });
Run Code Online (Sandbox Code Playgroud)

  • 也许一个好主意是在AJAX调用结束之前禁用该按钮(以避免发出AJAX调用的垃圾邮件),然后如果成功调用返回,则使用`clearTimeout`来摆脱现有的5秒超时并创建一个从那时起新的一个重新启用按钮.---另外我可能还会有一个`error:function(){}`它清除超时并重新启用按钮(如果使用了这种方法),以避免按钮在发生时永远禁用AJAX调用失败. (2认同)