Перепривязать событие клика live() после использования die()?

Я не смог решить свою проблему с поиском в стеке. У меня есть функция live() ниже. Вы можете видеть, как я хочу остановить нажатие кнопки во второй раз во время работы функции, а затем выполнить повторную привязку. Кнопка умирает от привязки, но она не привязывается снова... :S

$('.control-left, .prevActive').live('click',function(){

    var firstSlide = $('.slider li:first-child');

    if(firstSlide.attr('class') != 'active'){   
        $('.control-left, .prevActive').die('click');   
        moveSlider('left');
        $('.control-left, .prevActive').live('click');
    }

});

person Sabai    schedule 30.11.2011    source источник
comment
Если вы используете jQuery 1.7+, вам следует использовать on() вместо live() или delegate().   -  person David says reinstate Monica    schedule 01.12.2011
comment
Спасибо что подметил это :)   -  person Sabai    schedule 03.12.2011


Ответы (3)


Не нужно отвязывать и перепривязывать, просто используйте флаг:

var running = false;
$('.control-left, .prevActive').live('click',function(){
    var firstSlide = $('.slider li:first-child');

    if(firstSlide.attr('class') != 'active' && !running){ 
        running = true;
        moveSlider('left');
        running = false;
    }
});
person PetersenDidIt    schedule 30.11.2011
comment
Спасибо, это сработало! Я вижу, где я ошибался - на самом деле довольно глупая ошибка :) - person Sabai; 03.12.2011

Вы не передаете какую-либо функцию .live.. попробуйте следующее:

$('.control-left, .prevActive').live('click',function hello(){

    var firstSlide = $('.slider li:first-child');

    if(firstSlide.attr('class') != 'active'){   
        $('.control-left, .prevActive').die('click');   
        moveSlider('left');
        $('.control-left, .prevActive').live('click', hello);
    }

});
person Esailija    schedule 30.11.2011

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

$('.control-left, .prevActive').live('click', function () { code here });

В вашей ситуации вы, вероятно, захотите сделать что-то вроде этого

var myspecialclickfunction = function(){

  var firstSlide = $('.slider li:first-child');

  if(firstSlide.attr('class') != 'active'){   
      $('.control-left, .prevActive').die('click');   
      moveSlider('left');
      $('.control-left, .prevActive').live('click', myspecialclickfunction);
};

$(document).ready(function () {
  $('.control-left, .prevActive').live('click',myspecialclickfunction);
});

Также jQuery 1.42 до 1.6x вы должны использовать

  • delegate() для привязки к будущим элементам
  • undelegate() для отмены привязки к делегированным событиям

в jquery 1.7+

person John Hartsock    schedule 30.11.2011