Использование .one () с .live () jQuery - PullRequest
17 голосов
/ 26 сентября 2010

Я использовал функцию live():

$('a.remove_item').live('click',function(e) {});

Мне нужно было изменить это значение на one(), чтобы предотвратить несколько кликов, однако, когда я внедряю один из этих элементов после загрузки страницы, слушатель one() не запускается.

Как мне заставить one() вести себя как live()?

Ответы [ 6 ]

15 голосов
/ 08 ноября 2010

Вот версия плагина для запуска обработчика .live() один раз, созданного просто от скуки:

$.fn.liveAndLetDie = function(event, callback) {
    var sel = this.selector;
    function unbind() { $(sel).die(event, callback).die(event, unbind); }
    return this.live(event, callback).live(event, unbind);
};

Он работает так же, как .live()будет (если вам не нужен аргумент данных события, в этом случае вам нужно будет добавить перегрузку).Просто используйте его так же:

$('a.remove_item').liveAndLetDie('click', function(e) { /* do stuff */ });

Вы можете проверить это здесь .

15 голосов
/ 26 сентября 2010

Попробуйте это:

$('a.remove_item').live('click',function(e) {
  if($(e.target).data('oneclicked')!='yes')
  {
    //Your code
  }
  $(e.target).data('oneclicked','yes');
});

Это выполнит ваш код, но при этом также установит флаг 'oneclicked', как да, чтобы он не активировался снова.По сути, просто устанавливает настройку, чтобы остановить ее активацию после щелчка один раз.

11 голосов
/ 26 сентября 2010

Просто используйте jQuery .die() метод в обработчике:

Пример: http://jsfiddle.net/Agzar/

$('a.remove_item').live('click',function(e) {
    alert('clicked');
   $('a.remove_item').die('click'); // This removes the .live() functionality
});​

РЕДАКТИРОВАТЬ:

Или, если вы хотите отключить событие только для каждого элемента, вы можете просто изменить имя класса, поскольку live() на основе селектора.

Пример: http://jsfiddle.net/Agzar/1/

$('a.remove_item').live('click',function(e) {
    alert('i was clicked');
    $(this).toggleClass('remove_item remove_item_clicked');
});​

Это изменило класс с remove_item на remove_item_clicked, который мог иметь тот же стиль.Теперь live() не будет срабатывать после первого клика.

2 голосов
/ 26 сентября 2010

Попробуйте это

$('a.remove_item').live('click', function(e) {
    if(!$(this).hasClass('clicked'))
    {
      $(this).addClass('clicked');
      alert("dd"); // this is clicked once, do something here
    }
});​
0 голосов
/ 12 ноября 2014

Я использую его для функции $ .ajax, поэтому в финале, в моем случае, происходит сбой, я использую 500, чтобы задержать его и прекратить повторную отправку много раз.

}).fail(function(response, status){ alert("FAILED: "+JSON.stringify(response, null, 4)); },500);

Надеюсь, это вам поможет!

0 голосов
/ 14 мая 2013

Я знаю, что это старый пост, но у меня сработало в похожем случае:

$('a.remove_item').live('click', function(e) {
    e.stopPropagation();
    // Your code here
});​
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...