2010-09-26 2 views
16

я использовал live() функцию:Используя .one() с .live() JQuery

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

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

Как я могу получить one(), чтобы вести себя как live()?

+0

Вы хотите, чтобы живой клик работал только один раз. –

ответ

15

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

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

Это выполняет код, но он также устанавливает флаг «oneclicked», как да, так что она не будет активировать снова. В основном просто устанавливает настройку, чтобы остановить ее от активации, как только она была нажата один раз.

+0

Хорошее решение. Я думаю, что это лучше, чем JapanPro, потому что использование функции данных более дискретно, чем добавление класса. – Kranu

+0

это, кажется, хорошо работает, спасибо! – Titan

+0

Было бы неплохо, если бы был способ удалить событие без использования другого '$ ('a.remove_item')' 's – Blowsie

2

Попробуйте

$('a.remove_item').live('click', function(e) { 
    if(!$(this).hasClass('clicked')) 
    { 
     $(this).addClass('clicked'); 
     alert("dd"); // this is clicked once, do something here 
    } 
});​ 
+0

, это будет работать аналогично функции данных, однако, как сказал Крану, это менее дискретно. В любом случае, спасибо! – Titan

11

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

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

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

EDIT:

Или, если вы хотите только отключить событие для каждого элемента, вы можете просто изменить имя класса, так как 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() не запускается после первого нажатия.

+0

Я использовал это сегодня. Работает как шарм. – jessegavin

15

Вот версия плагина для запуска .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 */ }); 

You can test it out here.

+4

+1 для имени метода – Blazemonger

+1

Я должен отметить, что существует разница между этим ответом и тем, который указан как правильный. С этим ответом, если вы применяете его к группе элементов (например, '$ ('. Class')'), она будет выполняться только один раз на любом из элементов в селекторе (т. Е. Если был нажат первый элемент, вторая не может быть нажата), в то время как в первом ответе каждый элемент можно щелкнуть только один раз (т.е. вы можете щелкнуть первый элемент один раз, затем второй элемент один раз и т. д.). Таким образом, в моем случае, я нашел ответ, помеченный как правильный более полезный, по сравнению с этим. Не предлагая никаких изменений, просто указывая на разницу. – think123

+0

@ думаю123 очень действительная точка и применима в моем сценарии – Blowsie

0

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

$('a.remove_item').live('click', function(e) { 
    e.stopPropagation(); 
    // Your code here 
});​ 
0

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

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

Я надеюсь, что это помогает!

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