Функция щелчка не работает с классом div, созданным на лету

Я не уверен, как подойти к этой проблеме.

У меня есть несколько кнопок, сделанных в HTML с добавлением к ним некоторых атрибутов данных. У этих кнопок есть класс с именем roleBtn, который будет вызывать мою функцию jQuery roleBtnClicked и получать переменные в атрибутах данных HTML.

$(".roleBtn").click(roleBtnClicked);

function roleBtnClicked(event){
    reg.roleName  = $(this).html();           /* Get role name: Actor */
    reg.blueBtn   = $(this).data('blue');     /* Get blue-btn-1 */
    reg.the_Num   = $(this).data('num');      /* Get the number */
    reg.modal_ID  = $(this).data('modal');    /* Get modal-1 */

Теперь, используя эту информацию, после нажатия roleBtn появится модальное окно, затем у меня есть doneButton, которое закроет модальное окно и использует переменные из атрибутов данных, чтобы затем генерировать новый HTML на лету. Этот новый HTML будет содержать кнопку с классом blueBtn.

Моя проблема в том, что моя функция щелчка для blueBtn не будет работать на синей кнопке, созданной на лету. Он будет работать с div, у которого уже есть класс blueBtn, но не будет работать, если он был создан на лету.

Знаете ли вы обходной путь к этому? Или я упускаю что-то простое?

После нажатия doneButton у меня есть еще одна функция, которая создает новый HTML, включая blueBtns на лету:

$('.selected_row .choices-col-left').append('<div class="blueBtn-holder" id="blueBtnHolder-'+theNum+'"><div class="blueBtn" id="'+blueBtn+'" row="'+rowName+'" modal="'+modal_ID+'" num="'+theNum+'">'+roleName+'</div></div>');

Моя функция нажатия синей кнопки, которая не работает

$(".blueBtn").click(blueBtnClicked);

function blueBtnClicked(event){
    alert("Where are you blueBtn on the fly?");
    console.log("Where are you blueBtn on the fly?");
};

person Leon Gaban    schedule 03.05.2013    source источник
comment
google.fr/   -  person A. Wolff    schedule 03.05.2013
comment
Динамическим элементам потребуется делегированная версия on(), поиск дал бы вам миллион ответов на этот вопрос?   -  person adeneo    schedule 03.05.2013
comment
(O.T.) Когда вы вводите тег [jQuery] и задаете вопрос, должно появиться всплывающее окно со словами: Привет, ты! А вы знали о классном методе .on()? :) нам очень не хватает этой функции!   -  person Roko C. Buljan    schedule 03.05.2013
comment
возможный дубликат stackoverflow .com/questions/11288516/ и другие 100 вопросов   -  person Roko C. Buljan    schedule 03.05.2013


Ответы (2)


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

$(".selected_row").on('click', '.blueBtn', blueBtnClicked);

function blueBtnClicked(event){
    alert("Where are you blueBtn on the fly?");
    console.log("Where are you blueBtn on the fly?");
};

Демо

Когда вы просто привязываете событие клика, оно будет привязано только к существующим элементам DOM, поэтому вы хотите привязать событие к родительскому элементу, а затем любые элементы, которые вы добавляете с помощью того же селектора с этим контейнером, будут иметь событие, доступное делегированием .

Из документов Jquery

Преимущество делегированных событий заключается в том, что они могут обрабатывать события из элементов-потомков, добавленных в документ позднее. Выбрав элемент, который гарантированно присутствует во время присоединения делегированного обработчика событий, вы можете использовать делегированные события, чтобы избежать необходимости часто прикреплять и удалять обработчики событий. Этот элемент может быть элементом-контейнером представления в конструкции Model-View-Controller, например, или документом, если обработчик событий хочет отслеживать все всплывающие события в документе. Элемент документа доступен в заголовке документа перед загрузкой любого другого HTML, поэтому можно безопасно прикреплять туда события, не дожидаясь готовности документа.

person PSL    schedule 03.05.2013
comment
Спасибо! Я искал это, но продолжал находить вопросы о полупохожих ситуациях, но не совсем о том, что я пытался сделать. Еще 10 минут, прежде чем я смогу проверить ваш ответ :) - person Leon Gaban; 03.05.2013
comment
Нет проблем, мы также добавили демоверсию, если вы хотите сослаться. - person PSL; 03.05.2013

Это потому, что вам нужно переназначить обработчики событий для вновь созданных элементов.

Лучшим подходом будет использование .on для объекта-контейнера, а затем указать дочерние объекты, которые должны реагировать на клики:

$(".container").on('click', '.blueBtn', blueBtnClicked);

Таким образом, даже если вы рекламируете объекты на лету, они все равно будут реагировать. На самом деле это намного более эффективный способ справиться с этим, потому что вы создаете только один обработчик событий, а не множество. На самом деле это называется делегирование события.

Помните, что когда вы выполняете $(selector).click, вы говорите jQuery найти все элементы, соответствующие selector, и назначить им определенный «обработчик кликов». Этого больше не происходит, когда вы создаете новые объекты, потому что вы не указываете jQuery обрабатывать каждый будущий объект (jQuery не будет знать о добавлении вами новой кнопки и не назначит ей обработчик).

person MMM    schedule 03.05.2013