on('click', ...) не выполняется больше одного раза
Всем доброго дня.
Я совсем недавно знаком с языком JS, и, конкретно, библиотекой jQuery, поэтому прошу не закидывать помидорами, а спокойно указать на мои ошибки. Дело в следующем, есть очень короткий код с вызовом функции и сама функция. Я вызываю обработчик через on('click'...), однако, обработчик срабатывает лишь один раз. В чём причина такого поведения? $(document).on('ready', function () { stickDel(); }); function stickDel(){ $('.table').each(function(){ $(this).on('click', '#delete', function(){ var index = $(this).attr('name'); var name = $(".table #"+index).text(); var data = { action: "stick_mat_type_d", name: name }; var deleteAjax = $.post(ajaxurl, data, function(response) { if (response==1){ deleteAjax.complete(function(){ $('.stick_error').empty().css({'background':'#c4f9bb', 'color':'#1f5415'}).append('<p>Данные успешно удалены</p>'); $('html, body').animate({scrollTop: 0},500); stickInterval(); stickRefresh(); }); }else{ $('.stick_error').empty().append('<p>Произошла ошибка при удалении</p>'); $('html, body').animate({scrollTop: 0},500); stickInterval(); } }); }); }); } Заранее благодарю! |
Без html'я сказать в чем причина сложно.
Есть ли смысл объявлять обработчик "события" «complete» JQ, когда запрос уже завершился успехом (строка 16)? |
Цитата:
В чистом виде html такой: <div class="table"> <table class="stick_mat_types"><tbody> <tr class="type_row"><td class="type_name"> <div class="type_name_el" id="0">Name 1</div> <div class="type_action"><button class="stick_button" id="delete" name="0">Удалить</button></div> <div class="type_action"><button class="stick_button" id="edit" name="0">Редактировать</button></div> </td></tr> <tr class="type_row"><td class="type_name"> <div class="type_name_el" id="1">Name 2</div> <div class="type_action"><button class="stick_button" id="delete" name="1">Удалить</button></div> <div class="type_action"><button class="stick_button" id="edit" name="1">Редактировать</button></div> </td></tr> </tbody></table> </div> |
7in, в представленном вами коде изменяется только контент блока ".stick_error" и ничего более.
Вероятно при изменении элементов на странице затираются их обработчики. |
Цитата:
Есть ещё ряд функций, которые изменяют кол-во строк таблицы и обновляют их содержимое AJAX'ом. При этом структура никак не изменяется, т.е. в каждой строке выводится одно и то же Name 1, Name 2,... , Name N. И меняется id, соответственно, в той же прогрессии. Я не стал выкладывать весь код, т.к. его довольно много. Есть ещё функция: function stickEdit(){ $('.table #edit').each(function(){ $(this).on('click', function(){ var index = $(this).attr('name'); oldname = $(".table #"+index).text(); var data = { action: "stick_mat_type_e", name: oldname }; var editAjax = $.post(ajaxurl, data, function(response){ editAjax.complete(function(){ var count = $.parseJSON(response).length; var cats = $.parseJSON(response); if(count>1){ $('input:checkbox:checked').prop('checked', false); for(var i=0;i < count;i++){ $('input:checkbox[value="'+cats[i]+'"]').prop('checked', true); $('#stick_text').val(oldname); $('html, body').animate({scrollTop: 0},500); $('#to_complete').empty().text('Изменить'); } }else{ $('input:checkbox[value="'+cats+'"]').prop('checked', true); $('#stick_text').val(oldname); $('html, body').animate({scrollTop: 0},500); $('#to_complete').empty().text('Изменить'); } }); }); }); }); } Делает примерно то же самое, обработчик на ней тот же и вызывается прямо рядом с первой. Возможно, она затирает обработчик? Тогда вопрос такой. Обработчики $('.table').each(function(){ $(this).on('click', '#delete', function(){ }); }); и $('.table').each(function(){ $(this).on('click', '#edit', function(){ }); }); это одно и то же, мешают ли они друг другу? Если да, то как выйти из ситуации? |
ID должен быть уникальным, нельзя на странице объявить несколько элементов с одним id.
Немного изменил вашу функцию "stickEdit": function stickEdit(){ $('.table #edit').on('click', function(){ var oldname = $(".table #"+$(this).attr('name')).text(); $.post(ajaxurl, { action: "stick_mat_type_e", name: oldname }, function(response){ var cats=[]; try{ if(typeof response=='string') cats=$.parseJSON(response); }catch(e){ cats=[]; }; if(cats.length>1){ $('input:checkbox:checked').prop('checked', false); $.each(cats,function(i){ $('input:checkbox[value="'+cats[i]+'"]').prop('checked', true); }); }else $('input:checkbox[value="'+cats+'"]').prop('checked', true); $('#stick_text').val(oldname); $('html, body').animate({scrollTop:0},500); $('#to_complete').empty().text('Изменить'); }); }); } |
Nexus, изменил функции, убрал повтор id на странице в виде эксперимента. В итоге stickEdit работает, stickDel нет... Мистика да и только...
|
Часовой пояс GMT +3, время: 15:17. |