Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.07.2020, 01:29
Аспирант
Отправить личное сообщение для win32s Посмотреть профиль Найти все сообщения от win32s
 
Регистрация: 28.09.2019
Сообщений: 38

Присвоить обработчик рекурсивно - правильно ли так?
Здравствуйте
В общем, есть разметка с вложенными ссылками (каталоги, подкаталоги и ниже). При нажатии на каждую ссылку должно загружаться содержимое по ajax. Но - в содержимом тоже есть ссылки, а к ним обработчик почему-то не применяется.

Я сделал вот так,
function wrap_links()
	{
	$("li a").click(function()
		{
		var url = $(this).attr("href"); // возьмем ссылку 
		$("#content").load(url,wrap_links); // загружаем обновлённое содержимое
		return false; //не переходим	
		});	
	}


Как видите, каждый раз при загрузке контента отрабатывает функция wrap_links , которая добавляет обработчик к каждой ссылке. Но - правильно ли это? Может можно как-то лучше.
Ответить с цитированием
  #2 (permalink)  
Старый 23.07.2020, 04:34
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от win32s
обработчик рекурсивно - правильно ли так?
Это ужас, а правильно делегировать обработку.

Последний раз редактировалось laimas, 23.07.2020 в 05:27.
Ответить с цитированием
  #3 (permalink)  
Старый 23.07.2020, 13:06
Аспирант
Отправить личное сообщение для win32s Посмотреть профиль Найти все сообщения от win32s
 
Регистрация: 28.09.2019
Сообщений: 38

А можно подробнее? Пишу код, но не работает (при загрузке по ajax нового контента).
$("li").on("click","a",function()
		{
		var url = $(this).attr("href"); 
		$("#content").load(url); 
		
		return false;	
		});	
	}

Последний раз редактировалось win32s, 23.07.2020 в 13:12.
Ответить с цитированием
  #4 (permalink)  
Старый 23.07.2020, 13:15
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от win32s
А можно подробнее?
По ссылке же куда еще подробнее описано - делегирование, это передача обработки события общему ближайшему родителю. Если у вас не работает, значит вы не тому делегируете обработку и судя по селектору "li.zagNav" так оно и есть.
Ответить с цитированием
  #5 (permalink)  
Старый 23.07.2020, 13:40
Аспирант
Отправить личное сообщение для win32s Посмотреть профиль Найти все сообщения от win32s
 
Регистрация: 28.09.2019
Сообщений: 38

Оно отрабатывает также, первый раз, а потом все. Я убрал эти классы, т.е. чисто li с вложенными а. Первый раз отработало, потом ajax подгрузил очередной список , и все.

Пробовал ставить обработчик на родительский ul (т.е. написать вида
$("ul").on("click","li a",function()


Аналогично, раз отрабатывает и все.

Может jQuery не видит элементов, что добавлены ajax'ом? Или должен видеть?
Ответить с цитированием
  #6 (permalink)  
Старый 23.07.2020, 13:47
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Что вы мне вопросы задаете, если я не знаю html структуры того, во что добавляется. Делегирование для динамически добавляемых элементов, это решение, а делегировать нужно общему родителю и что важно, ближайшему, гарантированно присутствующему на странице. Что есть у вас общий ближайший родитель для этих ссылок? Вот ему и установите обработчик. А ajax ли это, или иное добавление на страницу, роли никакой не играет.

Последний раз редактировалось laimas, 23.07.2020 в 13:52.
Ответить с цитированием
  #7 (permalink)  
Старый 23.07.2020, 14:22
Аспирант
Отправить личное сообщение для win32s Посмотреть профиль Найти все сообщения от win32s
 
Регистрация: 28.09.2019
Сообщений: 38

Сообщение от laimas Посмотреть сообщение
а делегировать нужно общему родителю и что важно, ближайшему, гарантированно присутствующему на странице.
Спасибо, элемент ul тоже подгружался динамически, сделал вот так

$("div.jumbotron").on("click","ul li.zagNav a",function()
		{
		var url = $(this).attr("href"); 
		$("#content").load(url); 
		
		return false;
});


И заработало. Спасибо!
p.s.
А структура примерно такая
<div class="jumbotron" id="content">
<h4>Список по категориям</h4>
<ul>
<li class="zagNav"><a href="/ss/zag.php?cat=1">Первый</a></li>
<li class="zagNav"><a href="/ss/zag.php?cat=2">Второй</a></li>
<li class="zagNav"><a href="/ss/zag.php?cat=3">Третий</a></li>
</ul>
</div>


И при клике подгружается все внутрь div#content
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заставить выполняться обработчик после всех имеющихся обработчиков данного элемен Анатолий Саратовцев jQuery 2 08.10.2012 18:49
setTimeout, так правильно? person Общие вопросы Javascript 4 03.05.2012 13:28
Код работает не так как задумал. Обработчик onclick prowoke Общие вопросы Javascript 2 20.07.2011 23:31
Как "обмануть" обработчик события? itPiligrim Events/DOM/Window 0 13.05.2010 22:55
как правильно установить обработчик onclick? Yurik AJAX и COMET 6 14.04.2009 21:04