禁用单击事件直到动画完成

时间:2012-11-06 09:15:24

标签: javascript jquery

在我的游戏中,我有一个填充了单词的网格。要拼写单词,用户必须单击名为“拖动”的一侧的字母。单击一个字母时,它会动画到网格上的位置。

我遇到的问题是用户可以快速点击字母,这会导致程序崩溃。为了解决这个问题,我想在动画完成之前禁用点击事件。

过去我之前使用过setTimeOut函数,但它不是一个可靠的方法,因为时间都取决于浏览器的速度。

以下是点击事件:

$('.drag').on('click', function (e) {
    e.preventDefault();
    var target = $('.highlight-problem .drop-box:not(.occupied):first');
    var targetPos = target.parents('td').position();
    console.log(targetPos);
    var currentPos = $(this).offset();
    var b = $(this);
    if (target.length) {
        target.addClass("occupied");
        $(".occupied").parent(".flip-wrapper").addClass("flipped");
        var clonedObject = b.clone()
        if (b.data("letter") == target.parents('td').data("letter")) {
            clonedObject.addClass("right-letter");
            target.addClass('right-letter');
            setTimeout(function () {
                hitSound.play();
            }, 550);
        } else {
            clonedObject.addClass("wrong-letter");
            target.addClass('wrong-letter');
            setTimeout(function () {
                missSound.play();
            }, 550);
        }
        clonedObject.appendTo("table").css({
            position: "absolute",
            top: currentPos.top,
            left: currentPos.left
        }).stop().animate({
            top: targetPos.top,
            left: targetPos.left
        }, "slow", function () {
            $(this).prop('disabled', false).css({
                top: 0,
                left: 0
            }).appendTo(target);
            var spellWord = $('.highlight-problem .drop-box');
            if (!spellWord.filter(':not(.occupied)').length) {
                var wordIsCorrect = 0;
                spellWord.each(function () {
                    if ($(this).parents('td').data("letter") == $(this).find("div").data("letter")) {
                        console.log('letter is: ' + $(this).find("div").data("letter"))
                        wordIsCorrect++;
                    }
                });

2 个答案:

答案 0 :(得分:7)

您可以通过简单的3个步骤完成。

  1. 声明一个名为animationComplete的全局变量,并将其设置为false

    var animationComplete = false;
    
  2. .animate({...});功能中,在动画完成后切换值。

    .animate({
        top: targetPos.top,
        left: targetPos.left
    }, "slow", function () {
        ...
        animationComplete = true;
    });
    
  3. 使用全局变量检查完整性。

    if (animationComplete)
    {
        // Do something!
    }
    
  4. 完整代码

    <强>的JavaScript

    animationComplete = true;
    $(document).ready(function(){
        animationComplete = false;
        $(".background").animate({
            height: 50,
            width: 50
        }, 10000, function(){
            animationComplete = true;
        });
        $("button").click(function(){
            if (animationComplete)
                $(".background").animate({
                    height: 200,
                    width: 200
                }, 10000, function(){
                    animationComplete = false;
                });
            else
                alert("Please wait till the animation is complete!");
        });
    });
    

    <强> HTML

    <div class="background"></div>
    <button>Click me!</button>​
    

    <强> CSS

    .background {background: red;}
    

    小提琴:http://jsfiddle.net/KAryP/

    在此处为您的代码提示:http://jsfiddle.net/smilburn/Dxxmh/94/

答案 1 :(得分:1)

无法测试代码atm,但是检查元素是否在click函数中没有动画应该

if(!$('selector:animated')){


}