【问题标题】:Link click count for animation to run once动画运行一次的链接点击计数
【发布时间】:2014-03-11 11:40:40
【问题描述】:

我之前回答了一个问题,在单击链接时运行 jQuery 动画。然后发帖人问了一个相当有道理的问题,这让我很难过。

“如何只在第一次点击时运行动画”...

我认为这会很简单,所以我尝试了这样的方法:

clicked = true;

$('#hotel').click(function(){

    if (clicked){
    $('#Hotelbody').animate({width:'toggle'},1000);
    $('#Hotelbody').fadeIn();
    $('#Mealsbody').hide();
        clicked = false;

    }
});

平心而论,它只在第一次点击时运行动画。但是,如果我单击该菜单项并单击“Meals”,然后返回单击“Hotels”,则动画根本不会运行。我花了一上午的时间试图弄清楚这一点,现在我感到很沮丧-哈哈

本质上,需要发生的是,当用户在“酒店”菜单项上时,如果他/她单击“酒店”菜单项,则不要再次运行动画。但如果用户冒险进入另一个菜单项并返回酒店,则运行动画。

请以FIDDLE为例。

要遵循的步骤:

1. Click Hotel --> (Animation runs)
2. Click Hotel again --> (Animation doesn't run)[so far, so good] 
3. Click Meals --> Then Click Hotels again --> (Animation will not run again) 

如果我需要进一步解释,请告诉我?

想法: - 让 jQuery 查看 css 类 :active 和动画?

【问题讨论】:

  • 使用one()方法而不是点击。
  • 如果我错了,请纠正我,但是 one() 会做同样的事情......它会运行一次动画,然后当你在 Meal 菜单项后返回时,它什么也不做?看到这个小提琴:jsfiddle.net/gMha8/9
  • 不清楚你想说什么!
  • 你最好先正确处理这个active类,然后逻辑很容易得到,如果元素已经激活,请检查点击处理程序

标签: javascript jquery html css animation


【解决方案1】:

没那么难,只要检查被点击的那个当前是否可见

$('#Hotel, #Meals').on('click', function(){
    var el = $('#'+this.id+'body');
    if ( el.is(':visible') ) return false;
    el.animate({width:'toggle'},1000)
    $('#Mealsbody, #Hotelbody').not(el).hide();
});

FIDDLE

【讨论】:

  • SHEW - 99.7k 先生只是让我大吃一惊! :) 这太棒了。谢谢你,先生。比我前进的方向聪明得多。
  • @Mike - 没问题,我们在这里做的是令人兴奋的事情!
【解决方案2】:

使用类的另一种方式http://jsfiddle.net/gMha8/17/

$('.tabs_bar').on('click', '#hotel:not(.now)', function () {
    $(this).addClass('now');
    $('#Meal').removeClass('now');
    $('#Hotelbody').animate({
        width: 'toggle'
    }, 1000);
    $('#Hotelbody').fadeIn();
    $('#Mealsbody').hide();

});

$('.tabs_bar').on('click', '#Meal:not(.now)', function () {
    $(this).addClass('now');
    $('#hotel').removeClass('now');
    $('#Mealsbody').animate({
        width: 'toggle'
    }, 1000);
    $('#Mealsbody').fadeIn();
    $('#Hotelbody').hide();
});

这是一种愚蠢的做法http://jsfiddle.net/gMha8/14/

function meal() {
    $('#Mealsbody').animate({
        width: 'toggle'
    }, 1000);
    $('#Hotelbody').animate({
        width: 'toggle'
    }, 1000);
    $('#Mealsbody').fadeIn();
    $('#Hotelbody').hide();

    $('#hotel').off().on('click', hotel);
    $('#Meal').off('click', meal);
}

function hotel() {
    $('#Hotelbody').animate({
        width: 'toggle'
    }, 1000);
    $('#Mealsbody').animate({
        width: 'toggle'
    }, 1000);
    $('#Hotelbody').fadeIn();
    $('#Mealsbody').hide();

    $('#Meal').off().on('click', meal);
    $('#hotel').off('click', hotel);
}

$('#hotel').off().on('click', hotel);

$('#Meal').off().on('click', meal);

【讨论】:

  • 在我看来并不愚蠢,因为这也是我想到实现它的唯一方法。它与 Chris Hardies 的示例几乎完全相同,只是更优雅一点。哈哈
  • @Mike 是的,现在有另一个正在使用类
  • @Mike 你可能还想将.stop() 添加到动画中
  • 看看 adeneo 的回答。我很喜欢那个 :) 非常感谢你的帮助。
【解决方案3】:

试试这个:

var lastClicked = null;

$('#hotel').click(function(e){
    if (lastClicked != e.target){
    $('#Hotelbody').animate({width:'toggle'},1000);
    $('#Hotelbody').fadeIn();
    $('#Mealsbody').hide();

    }
    lastClicked = e.target;
});

$('#Meal').click(function(e){

    if (lastClicked != e.target){$('#Mealsbody').animate({width:'toggle'},1000);
    $('#Mealsbody').fadeIn();
    $('#Hotelbody').hide();
                    }
     lastClicked = e.target;
});

http://jsfiddle.net/gMha8/22/

【讨论】:

  • 猜猜这是我们完成它的唯一方法。我在考虑完全相同的路线,但也认为每次都必须重置标志是愚蠢的。 :( 不过谢谢。
  • @Mike 我改进了我的答案。
  • 哇 - 我其实更喜欢你的方法,因为我真的理解它!哈哈
  • 拍脑袋 我没有注意到这两个点击处理程序是相同的。如果你使用它,请确保像 Adeneo 那样合并两个选择器,并得到他的出色回答。
【解决方案4】:

试试这个

$('#hotel').click(function(){

$('#Hotelbody').animate({width:'toggle'},1000);
$('#Mealsbody').animate({width:'toggle'},1000);
$('#Hotelbody').fadeIn();
$('#Mealsbody').hide();

});

$('#Meal').click(function(){
$('#Mealsbody').animate({width:'toggle'},1000);
$('#Hotelbody').animate({width:'toggle'},1000);
$('#Mealsbody').fadeIn();
$('#Hotelbody').hide();
});

Demo

【讨论】:

    猜你喜欢
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多