Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.02.2013, 18:50
Новичок на форуме
Отправить личное сообщение для megagramm Посмотреть профиль Найти все сообщения от megagramm
 
Регистрация: 01.02.2013
Сообщений: 9

jquery -> prepend('<tr>...</tr>') - > нет клика по внутренним эл-там
Добрый день. Не так давно начал углубление знание в JS и возникают вопросы, которые как мне кажутся являются нубовыми.

И так, первый вопрос, порекомендуйте книгу или другой источник, которые помогли бы мне не сталкиваться с такими сложностями, как описано далее. Возможно, Флэнеган, подойдет?

Второй, вопрос, а точнее практическая сложность.

Имеется некоторая таблица, в которой представлен перечень и имеются некоторые кликабельные элементы, например один из них это: <td class="edit"><i class="icon-pencil"></i></td>
Собственно по клику на тэг <i> у меня происходит редактирование. С этим все нормально, отлажено и работает.

Но кроме того, я хочу добавлять элементы в эту таблицу, для чего сделал небольшую функцию, которая пocредством метода jquery prepend добавляет необходимое.
Т.к. на все <i> в этой таблице навешана функция на клик($("#sectors tr td.edit i").click(function()), я думал что этого будет достаточно. Но на практике, это оказалось не так, т.е. клик не срабатывает. Причем не работает функция обработчик по клику ни на одном элементе из таблицы, которые созданы через prepend.
Почему такое может происходить?

На всякий случай приведу куски кода, которые вызываются:
// Редактировать сектор
$("#sectors tr td.edit i").click(function() {
				$("#trap").focus();
				if($(this).attr('class')=='icon-pencil'){
					console.log('edit');
					$("#sectors tr td.edit").find('i').removeClass('icon-pencil');
					$(this).addClass('icon-ok-sign');
					$("#sectorActions tr td button").attr('disabled', true);
					$(this).parent().parent().find('input').attr('checked', true);
				}
				else if($(this).attr('class')=='icon-ok-sign'){
					console.log('save');
					$(this).removeClass('icon-ok-sign');
					$("#sectors tr td.edit").find('i').addClass('icon-pencil');
					$("#sectorActions tr td button").removeAttr('disabled');
					
				}
			});

// Добавляем сектор
			$("#sectorCreate").click(function() {
				$("#trap").focus();
				var sectorName=$("#sectorName").val(),
				sectorId=$("#sectorId").val(),
				sectorCourier=$("#sectorSelectCourier").val();
				$("#sectorName").val('');
				createSector(sectorId,sectorName,sectorCourier);
			});

function createSector(id,name,courier){
	if(name.length == 0||courier.length == 0) {
		return false;
	}
	var tmp = courier;
	if (courier > 12) {
		tmp = courier % 12;
	}
	$('#sectors').prepend('<tr class="'+id+'">'+
			'<td class="w16"><div class="point point-color-'+colors[tmp].colorLabel+' showSector"><span>'+courier+'</span></div></td>'+
			'<td class="sectorName">'+name+'</td>'+
			'<td class="edit"><i class="icon-ok-sign"></i></td>'+
			'<td><input class="collectionSectorToggle" type="checkbox" value="1" checked="checked"></td>'+
			'</tr>');
}
Ответить с цитированием
  #2 (permalink)  
Старый 01.02.2013, 18:54
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

megagramm,
ON а не click если хотите захвата будущих элементов
http://api.jquery.com/on/
Ответить с цитированием
  #3 (permalink)  
Старый 01.02.2013, 18:55
Аватар для animhotep
Профессор
Отправить личное сообщение для animhotep Посмотреть профиль Найти все сообщения от animhotep
 
Регистрация: 17.01.2013
Сообщений: 887

чтобы динамически созданные элементы работали как и статические их нужно создавать через .on

$(document).on("click", "#sectors tr td.edit i", function()
Ответить с цитированием
  #4 (permalink)  
Старый 05.02.2013, 14:09
Новичок на форуме
Отправить личное сообщение для megagramm Посмотреть профиль Найти все сообщения от megagramm
 
Регистрация: 01.02.2013
Сообщений: 9

спасибо. помогло.
как я понимаю в jquery 1.9 on() уже исключен? чем же там пользоваться тогда?
Ответить с цитированием
  #5 (permalink)  
Старый 05.02.2013, 14:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от megagramm
я понимаю в jquery 1.9 on() уже исключен?
откуда у вас такая информация?
Ответить с цитированием
  #6 (permalink)  
Старый 05.02.2013, 14:31
Новичок на форуме
Отправить личное сообщение для megagramm Посмотреть профиль Найти все сообщения от megagramm
 
Регистрация: 01.02.2013
Сообщений: 9

Сообщение от рони
откуда у вас такая информация?
в своем коде обновил билиотеку с 1.7.2 до 1.9, и on('click' перестал работать. начал шерстить доки. что-то нашел на эту тему. я не уверен что именно on(), но тогда пошерстив текст по диагонали, я решил пока откатиться назад на 1.7.2.
я попробую найти ссылку и опубликую тут.
Ответить с цитированием
  #7 (permalink)  
Старый 05.02.2013, 14:33
Новичок на форуме
Отправить личное сообщение для megagramm Посмотреть профиль Найти все сообщения от megagramm
 
Регистрация: 01.02.2013
Сообщений: 9

Пардон. наоборот, речь шла о live()
Цитата:
As of jQuery 1.7, the .live() method is deprecated. Use .on() to attach event handlers. Users of older versions of jQuery should use .delegate() in preference to .live().
Но тогда мне все ж придется разбираться почему on('click' не работает с современными версиями
Ответить с цитированием
  #8 (permalink)  
Старый 05.02.2013, 18:06
Аватар для animhotep
Профессор
Отправить личное сообщение для animhotep Посмотреть профиль Найти все сообщения от animhotep
 
Регистрация: 17.01.2013
Сообщений: 887

.on работает, возможно вешаешь его на ещё не существующий элемент
вешай на $(document).on("click", не прогадаешь
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск