Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Присвоить обработчик рекурсивно - правильно ли так? (https://javascript.ru/forum/jquery/80736-prisvoit-obrabotchik-rekursivno-pravilno-li-tak.html)

win32s 23.07.2020 01:29

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

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


Как видите, каждый раз при загрузке контента отрабатывает функция wrap_links , которая добавляет обработчик к каждой ссылке. Но - правильно ли это? Может можно как-то лучше.

laimas 23.07.2020 04:34

Цитата:

Сообщение от win32s
обработчик рекурсивно - правильно ли так?

Это ужас, а правильно делегировать обработку.

win32s 23.07.2020 13:06

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

laimas 23.07.2020 13:15

Цитата:

Сообщение от win32s
А можно подробнее?

По ссылке же куда еще подробнее описано - делегирование, это передача обработки события общему ближайшему родителю. Если у вас не работает, значит вы не тому делегируете обработку и судя по селектору "li.zagNav" так оно и есть.

win32s 23.07.2020 13:40

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

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


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

Может jQuery не видит элементов, что добавлены ajax'ом? Или должен видеть?

laimas 23.07.2020 13:47

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

win32s 23.07.2020 14:22

Цитата:

Сообщение от laimas (Сообщение 527258)
а делегировать нужно общему родителю и что важно, ближайшему, гарантированно присутствующему на странице.

Спасибо, элемент 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


Часовой пояс GMT +3, время: 16:28.