Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Странности обработки событий добавленных элементов (https://javascript.ru/forum/jquery/42592-strannosti-obrabotki-sobytijj-dobavlennykh-ehlementov.html)

Dozentos 01.11.2013 21:53

Странности обработки событий добавленных элементов
 
Новый трабл. Были проблемы с реагированием вновь добавленных на страницу элементов на события. После подключения к новым элементам обработчиков через 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>

Dozentos 02.11.2013 00:52

Методом научного тыка удалось решить трабл:
Вместо:

$('.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, время: 07:06.