2013-06-12 2 views
0

Имея немного проблем, выясняя, как снова включить обработчик событий.JQuery - Отключение обработчика событий, а затем обратно на

Я пытаюсь остановить выполнение функции несколько раз до завершения анимации.

Вот Fiddle:

http://jsfiddle.net/MkmnW/1/

Вот мой код:

$("#buttons a").click(function() { 

    $('a').off(); 

    // Remove class from current active 
    $("#buttons a").removeClass('active'); 

    // Change class on clicked button 
    $(this).addClass("active"); 

    // Hide Non-Clicked Content 
    $(".main_content").fadeOut("fast"); 


    $("#content_container").slideUp("slow"); 

    // Find Selected 
    var selected = $(this).attr("href"); 

    // Show Selected 

    $("#content_container").slideDown("slow", function() { 
     $(selected).fadeIn("slow"); 
    }); 

    return false; 
}); 
+0

Я бы не сделать это, это может привести к путанице для пользователя. Вместо этого отмените текущую анимацию. Посмотрите http://api.jquery.com/stop/. –

+0

@Malk: Прекрасно работает для меня в Chrome. –

+0

Да, я работаю для меня и в Chrome. Хмм, Феликс, это немного загадка UX, я думаю. Я просто не могу заставить обработчик щелчка вернуться, или, вернее, я не знаю, как и в какой точке. –

ответ

2

Если я понимаю ваш пример правильно, вы хотите, чтобы предотвратить анимацию запуск несколько раз, удаляя событие ,

Если вы удалили событие, вы не сможете его снова щелкнуть, если вы не присоедините свое мероприятие еще раз.

Вот пример, основанный на коде: http://jsfiddle.net/MkmnW/4/

$(document).ready(function() { 


$("#buttons a").click(function() { 
    $('a').off("click"); 
    clickMenu(this); 

    return false; 
}); 

function clickMenu(el){ 
    // Remove class from current active 
    $("#buttons a").removeClass('active'); 

    // Change class on clicked button 
    $(el).addClass("active"); 

    // Hide Non-Clicked Content 
    $(".main_content").fadeOut("fast"); 


    $("#content_container").slideUp("slow"); 

    // Find Selected 
    var selected = $(this).attr("href"); 

    // Show Selected 

    $("#content_container").slideDown("slow", function() { 
     $(selected).fadeIn("slow"); 

     $("#buttons a").click(function() { 
      $('a').off("click"); 
      clickMenu(this); 

      return false; 
     });    
    });  
} 
}); 
+2

Удивительный, спасибо. Просто нужно изменить «this» в объявлении переменной «selected» на «el», а затем работает отлично. Кроме того, я смущен функцией, это рекурсия? Я понимаю, как это работает, но я начинаю запугиваться, когда функции называют себя! –

+0

Ваш прием Том. Я думаю, что это не рекурсия, вы удаляете событие onclick, когда вы нажимаете тег. Таким образом, вы должны вернуть событие click, чтобы вы могли на самом деле щелкнуть другую кнопку, чтобы сделать это. Я переместил ваш код в функцию, чтобы вы могли привязать клик, когда анимация slidedown завершена. Вы можете проверить это, удалив второе назначение onclick, если вы сделаете второй клик, это не вызовет анимацию :) – Michael

0

Вы можете $(element).unbind('click'); для разряжения событий щелчка. То же самое со всеми другими типами событий.

Затем вы можете связать их снова с $(element).bind('click', function(evt) { ... });

В случае анимации, вы можете $(element).click(function(evt) { $(this).stop().fadeOut("fast").whatever... });

+0

'bind' /' unbind' довольно старые и пересыщенные. Используйте 'on' /' off'. –

+0

Правда. Я просто привык к ним! :) –

+0

Да, я пытаюсь использовать вкл/выкл, я просто не понимаю, как его реализовать. Чтобы переключить его обратно на –

Смежные вопросы