2015-11-24 2 views
0

Я в настоящее время борется с jQuery .one(). Документация заявлена ​​jQuery .one() не срабатывает один раз для элемента, но только один раз

Обработчик выполняется не более одного раза для каждого элемента в каждом типе события.

Если у меня есть три входа и сделать что-то вроде $(document).one("click", "input", function() { ... } как в https://jsfiddle.net/rr49ryyo/, я ожидаю, что событие срабатывает в 3 раза, если я нажму на всех 3-х входов, но на самом деле, это только выстрелил один раз в общей сложности и не один раз на элемент. Это ошибка, или я делаю что-то неправильно?

.one ведет себя как ожидается, если я присоединю обработчик через $("input").one("click", function() { ... }, но моя проблема в том, что мне нужно реагировать на события, запускаемые динамически добавленными входами. Как я могу это сделать?

ответ

0

Проблема заключается в том, что при использовании $(document).one(...) он фактически устанавливает один прослушиватель в документе, который запускается, когда элемент потомка input является объектом события и удаляется после его запуска один раз.

С $('input').one(...) он устанавливает слушатель на каждом элементе ввода, каждый из которых удаляется при запуске.

Edit: Вы можете обойти эту проблему, видя @ Ссылка на комментарий Фила в Is there any way to delegate the event one in jQuery?

Solution:

https://stackoverflow.com/a/6873265/1059070

$('#container').delegate('.children', 'click', function() { 
    if($(this).data('clicked')) { 
     return; 
    } 

    // ... your code here ... 


    $(this).data('clicked', true); 

}); 
+1

По JQuery 1.7, .delegate() имеет был заменен методом .on(). Однако для более ранних версий он остается наиболее эффективным средством использования делегирования событий. – Yuri

+0

Спасибо за обновление. Я просто ссылался на другой ответ напрямую. – arcyqwerty

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