jQuery setTimeout $this.remove() 多个元素重叠

jQuery setTimeout $this.remove() Overlapping for Multiple Elements

我有 2 个单独的 <div> 元素,它们具有类似的 invoke 按钮,可以添加透明覆盖消息。我的问题是,当我快速连续单击两个按钮时,或者在超时到期前两次单击同一个按钮时,叠加层只会被删除一次(而不是叠加添加许多叠加层)。如果有人能帮助我解决这个问题,我将不胜感激(这似乎非常低效)。

JSFiddle: http://jsfiddle.net/Hybridx24/733ueao4/

$(document).on('click', '#invoke', function(e) {

    $this = $(this);

    $cardOverlay = $("<div style='transition: background 0.2s linear' class='card-overlay'><span style='color:white;position:relative;top:40%;font-weight:bold'>Success!</span></div>");

    $this.parent('.card-shadow').append($cardOverlay);

    $cardOverlay.height('100%').css({
        'opacity' : 1,
        'position': 'absolute',
        'top': 0,
        'left': 0,
        'background': 'rgba(0, 0, 0, 0.6)',
        'width': '100%',
        'z-index': 1,
        'border-radius': '6px',
        'text-align': 'center'
    });

    setTimeout(function() {
        $cardOverlay.fadeOut("normal", function(){
            $(this).remove();
        })
    }, 2000)
});

您在 $cardOverlay 之前忘记了 var,因此 $cardOverlay 是在全局范围内定义的,并且是 相同的 变量处理程序 运行s。每次单击 #invoke 时都会覆盖它的值,这意味着当 setTimeout 运行 时,它总是指对 $cardOverlay 的最新分配,因此对旧的覆盖层丢失了。变化:

$cardOverlay = $("<div style='transition: background 0.2s linear' class='card-overlay'><span style='color:white;position:relative;top:40%;font-weight:bold'>Success!</span></div>");

var $cardOverlay = $("<div style='transition: background 0.2s linear' class='card-overlay'><span style='color:white;position:relative;top:40%;font-weight:bold'>Success!</span></div>");

出于类似的原因,您可能还想在 $this = $(this); 之前添加 var。请记住,虽然您可以在 javascript 中省略 var,但每次您这样做时,变量都是在全局范围内定义的,并且可以出现其他方法(或者相同的方法可以 运行 第二次)并干扰变量的值。一般来说,如果您使用的是您只想在特定范围内访问的变量,则应在该范围内使用 var 定义它,在您的情况下是您的处理函数。