Странности обработки событий добавленных элементов
Новый трабл. Были проблемы с реагированием вновь добавленных на страницу элементов на события. После подключения к новым элементам обработчиков через on стало лучше... но всё же...
удаление элементов работает без претензий, в то время как перемещение значений после добавления новых элементов работает только для них, а для старых элементов пропадает... Вот код: <head> <script src="http://code.jquery.com/jquery-latest.js"></script> <script> $(document).ready(function() { $('.up').click(function(){ var curVal = $(this).next('input').val(), curAttr = parseInt($(this).next('input').attr('id')), prevAttr = curAttr - 1, prevElem = $('#'+prevAttr), prevVal = $(prevElem).val(); $(this).next('input').val(prevVal); $(prevElem).val(curVal); }); $('.delete').click(function(){ var deletedBlock = $(this).parent(); deletedBlock.remove(); }); $('#add_block').click(function(){ var newId = parseInt($('#input_blocks input:last').attr('id'))+1; $(this).before("<span class='str_block'><span class='up' onClick='blockUp()'><img src='../city/css/img/arrow_up.png' height='15' /></span><input type='text' id='"+newId+"' value='' placeholder='Введите название' /><span class='delete'>Удалить</span><br /></span>"); $('.delete').on('click', function(){ $(this).parent().remove(); }); $('.up').on('click', function(){ var curVal = $(this).next('input').val(), curAttr = parseInt($(this).next('input').attr('id')), prevAttr = curAttr - 1, prevElem = $('#'+prevAttr), prevVal = $(prevElem).val(); $(this).next('input').val(prevVal); $(prevElem).val(curVal); }); }); }); </script> <style> .up, .delete, #add_block{ color: #03C; } .up:hover, .delete:hover, #add_block:hover{ cursor:pointer; color: #CCC; } </style> </head> <body> <div id='input_blocks'> <span class='str_block'> <input type='text' id='1' value='Гостиницы' /> <span class='delete''>Удалить</span><br /></span> <!--при нажатии, родитель (str_block) удаляется--> <span class='str_block'><span class='up'> <!--при нажатии, значение следующего input присваивается полю выше--> <img src='../city/css/img/arrow_up.png' height='15' /> </span> <input type='text' id='2' value='Рестораны' /> <span class='delete''>Удалить</span><br /></span> <span id='add_block'>Добавить блок</span> <!--при нажатии добавляется новый str_block с содержимым--> </div> </body> |
Методом научного тыка удалось решить трабл:
Вместо: $('.up').on('click', function(){ var curVal = $(this).next('input').val(), curAttr = parseInt($(this).next('input').attr('id')), prevAttr = curAttr - 1, prevElem = $('#'+prevAttr), prevVal = $(prevElem).val(); $(this).next('input').val(prevVal); $(prevElem).val(curVal); }); Сделал: $('.up:last').on('click', function(){ var curVal = $(this).next('input').val(), curAttr = parseInt($(this).next('input').attr('id')), prevAttr = curAttr - 1, prevElem = $('#'+prevAttr), prevVal = $(prevElem).val(); $(this).next('input').val(prevVal); $(prevElem).val(curVal); }); И всё как часы! |
Часовой пояс GMT +3, время: 00:13. |