#jquery #events #clone #native
#jquery #Мероприятия #клонировать #собственный
Вопрос:
Если я добавлю собственный обработчик событий к элементу, используя синтаксис «element.onclick = function() {…};», а позже я клонирую элемент с помощью jQuery clone api, используя параметр ‘true’, то клонированный элемент не получит добавленный изначально обработчик событий. Как я могу это решить, если необходимо использовать собственный синтаксис, который я использовал выше (поэтому, пожалуйста, не давайте мне ответа типа «use $(element).click(function(e){…});»И т. Д.).
В коде:
РЕДАКТИРОВАТЬ: пожалуйста, проверьте jsfiddle: http://jsfiddle.net/86f96 /
Комментарии:
1. Не могли бы вы создать jsfiddle для этого, чтобы мы могли взглянуть на полный код и HTML? Так всегда проще проверить, влияет ли что-либо еще на JS.
Ответ №1:
У вас не может быть 2 элемента с идентификатором btn
на одной странице.
Редактировать:
Я посмотрел на jsfiddle, и, к сожалению, я не могу придумать другого решения, кроме повторного добавления события click, после добавления clone
РЕДАКТИРОВАТЬ 2:
Это настолько близко, насколько я понял, без изменения собственного onclick
события JS. Поэтому, если по какой-то причине вы не можете изменить ранее определенную функцию, это поможет:
var element = document.getElementById('element');
document.getElementById('element').onclick = function() { alert( 'clicked' ); };
//...
var clone = $(element).clone(true);
var native_click_function = $(element)[0].onclick;
$(element).remove();
clone.appendTo('body').click(function(){
native_click_function();
});
Код взят из скрипки JS.
Комментарии:
1. Да, я знаю, это всего лишь фиктивный код. Я удаляю исходный элемент перед добавлением клона.
2. Этот совет дал мне идею для решения проблемы, но я должен работать более абстрактно. Может быть, я переопределю clone api и пройдусь по всем возможным собственным событиям. Итак, спасибо, вы приблизили меня к решению.
Ответ №2:
append и appendTo не передают события. Некоторые видят в этом ошибку, некоторые видят в этом особенность, увы, единственный способ обойти это — использовать live() или переопределить события.
Комментарии:
1. Я использовал клон таким же образом, но он работает не так, как я написал в описании. clone (true) работает только для событий jQuery, которые хранятся в данных jQuery.
2. Извините, я написал этот ответ перед тем, как правильно прочитать код jsfiddle.