клон jQuery () не клонує події прив'язки, навіть при ввімкненому ()


100

Я створив низку спеціальних подій jQuery для використання в мобільних веб-додатках. Вони чудово працюють і пройшли перевірку. Однак я зіткнувся з невеликою проблемою, яку у мене виникають проблеми з розумінням.

Я використовую .clone()кілька елементів у DOM, які містять кнопку. Кнопка має деякі пов'язані з нею користувацькі події (події пов'язані за допомогою .on()), але. На жаль, коли я використовую jQuery's .clone(), прив'язки не зберігаються, і мені доведеться їх додати ще раз.

Хто-небудь стикався з цим раніше, хтось знає про потенційну роботу? Я думав, що використання .on()повинно зберегти прив'язку для елементів, які існують зараз, або в майбутньому?


"Я думав, що використання .on () повинне зберегти прив'язку для елементів, які існують зараз або в майбутньому?" - Це мало стосується .clone; це логіка делегування події jQuery і працює, якщо ви передаєте додатковий селектор .on.
pimvdb

Відповіді:


213

Я думаю, ви повинні використовувати цю перевантаження методу .clone () :

$element.clone(true, true);

клон ([withDataAndEvents] [, deepWithDataAndEvents])

withDataAndEvents : логічне значення, яке вказує, чи потрібно копіювати обробники подій та дані разом з елементами. Значення за замовчуванням - помилкове.

deepWithDataAndEvents : логічне вказівка, чи слід копіювати обробники подій та дані для всіх дітей клонованого елемента. За замовчуванням його значення відповідає значенню першого аргументу (який за замовчуванням відповідає false).


Остерігайтеся, що .on()насправді не пов'язує події з цілями, а з елементом, якому ви делегуєте. Тож якщо у вас є:

$('#container').on('click', '.button', ...);

Події насправді пов'язані #container. Коли відбувається клацання на .buttonелементі, він переходить до #containerелемента. Елемент, який викликав подію, оцінюється за параметром селектора .on()та, якщо він відповідає, обробник події виконується. Так працює делегація подій.

Якщо ви клонуєте елемент #container, вам доведеться глибоко клонувати події та дані, для яких зв'язки, з якими .on()потрібно зберегти.

Це не буде необхідним, якби ви користувались .on()батьком #container.


20
Ніколи не знав .clone()прийнятих аргументів. FML. Спасибі за вашу допомогу.
БенМ

1
@DidierGhys Спасибі, я боровся з .clone()не клонуванням .data()( data-xxxx="somedata"і даних, і DOM) .. Це також виправляє!
Річард де Віт

Я задав це запитання , але мені ніхто не відповів. Можеш допомогти мені?
Алі Солтані

Чудово, мені довелося зробити clickподію, щоб додати нового клонованого діва. readyне працював
csandreas1

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.