Функцията за кликване не работи върху клас 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], задавайки Q, трябва да има изскачащ прозорец с надпис: Хей, ти! Знаете ли за страхотния метод .on()? :) наистина ни липсва тази функция!   -  person Roko C. Buljan    schedule 03.05.2013
comment
възможен дубликат на stackoverflow .com/questions/11288516/ и други 100 Q   -  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 Docs

Делегираните събития имат предимството, че могат да обработват събития от наследствени елементи, които се добавят към документа по-късно. Като изберете елемент, който гарантирано присъства в момента на прикачване на делегирания манипулатор на събития, можете да използвате делегирани събития, за да избегнете необходимостта от често прикачване и премахване на манипулатори на събития. Този елемент може да бъде елементът на контейнера на изглед в дизайна на модел-изглед-контролер, например, или документ, ако манипулаторът на събития иска да наблюдава всички балончета в документа. Елементът на документа е наличен в главата на документа, преди да се зареди всеки друг 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