如何防止多次点击触发多个动画

How to prevent multiple clicks triggering multiple animations

我想知道如何防止多次点击或一个事件因多次点击而被多次触发。

假设我必须为一个对象设置动画。 一个按钮将触发动画,另一个按钮将重置动画。

<div class="div">
   Animate Me!
</div>
<div class="nav">
    <div class="start">start</div>
    <div class="reset">reset</div>
</div>

我不在乎用户点击 "star" 按钮多少次,动画必须只触发一次。 这并不意味着将来不能再触发动画。动画重置时,可以再触发一次,依此类推。

$( '.start' ).click(function(){
    $('.div').animate({
        left: '+=' + 100});
});

$( '.reset' ).click(function(){
    $('.div').animate({
        left: 50});
});

这是我愿意做的一个例子:fiddle

尝试尽可能多地点击"start"按钮,动画将根据点击次数触发。

我在网上查了一下,发现有两种方法可以防止多次点击。然而他们似乎不适合我。

1) 使用.unbind() found here:

$( '.reset' ).unbind().click(function(){
    $('.div').animate({
        left: 50});
});

但它不起作用:fiddle

2) 使用 event.stopImmediatePropagation found here:

$( '.reset' ).click(function(event){
event.stopImmediatePropagation()
    $('.div').animate({
        left: 50});
});

也不行。 fiddle;

如何防止"start"按钮多次触发动画?但在单击 "reset" 按钮时被单击?

使用jqueryone方法http://api.jquery.com/one/

$( '.start' ).click(function(){
var div = $('.div:not(.animated)');
div.animate({
        left: '+=' + 100}).addClass('animated');
});

$( '.reset' ).click(function(event){
var animated = $('.div.animated');
animated.animate({
        left: 50}).removeClass('animated');
});
.div {
    position: absolute;
    top: 150px;
    left: 50px;
    height: 100;
    width: 100;
    background-color: blue;
}

.start, .reset {
    display: table-cell;
    width:50%;
}

.start {
    background-color:green;
}

.reset{
    background-color:red;
}

}
.nav {
    position: absolute;
    width: 100%;
    top: 0;
    right: 0;
    left: 0;
    height: 60px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div class="div">
   Animate Me!
</div>
<div class="nav">
    <div class="start">start</div>
    <div class="reset">reset</div>
</div>

您可以向开始按钮添加帮助 class,并在单击重置按钮时将其删除。

$('.start').click(function () {
    if(!$(this).hasClass('move')){
        $(this).addClass('move');
        $('.div').animate({
            left: '+=' + 100
        });
    }
});

$('.reset').click(function () {
    $('.start').removeClass('move');
    $('.div').animate({
        left: 50
    });
});

Fiddle

更好:

$('.nav').on('click', '.start:not(.move)', function () {
    $(this).addClass('move');
    $('.div').animate({
        left: '+=' + 100
    });
});

$('.reset').click(function () {
    $('.start').removeClass('move');
    $('.div').animate({
        left: 50
    });
});

Fiddle