Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Невозможно обратиться к только что вставленному элементу DOM (https://javascript.ru/forum/jquery/24919-nevozmozhno-obratitsya-k-tolko-chto-vstavlennomu-ehlementu-dom.html)

Vovan91 18.01.2012 21:16

Невозможно обратиться к только что вставленному элементу DOM
 
Невозможно обратиться к только что вставленному элементу DOM
Приведу примерный код
$(id).click(function(){
$.getJSON(1,function(json){ 
 $(вставляю в начало элемента).prepend(<div id="a1">этот текст</div>);
 });
$("#a1").animate({left: "+=377"}, 1000);
});

Почему при первом клике не работает?
При повторных кликах работает нормально вставленный ранее, а только что вставленный не работает. И как это можно обойти или с этим бороться?

Octane 18.01.2012 21:26

getJSON выполняется асинхронно

Vovan91 19.01.2012 09:30

как решить проблему с обращением к DOM?

Kolyaj 19.01.2012 12:51

Обращаться к элементу после его добавления, а не до.

Vovan91 19.01.2012 13:00

Цитата:

Сообщение от Kolyaj (Сообщение 151407)
Обращаться к элементу после его добавления, а не до.

по идеи он должен был быть уже добавлен

SkyLight 19.01.2012 14:42

Вы ошибаетесь, т.к.
Цитата:

Сообщение от Octane
getJSON выполняется асинхронно


Gvozd 19.01.2012 14:59

alert(1);
$(id).click(function(){
	alert(3);//выполняется, когда пользователь кликнет, а не сразу.
	$.getJSON(1,function(json){ 
		alert(5);//вызвалася, когда пришли результаты для обработки
		$(вставляю в начало элемента).prepend(<div id="a1">этот текст</div>);
		//Так как "4" уже выполнился, то пришедшую информацию надо обрабатывать тут, а не там
	});
	alert(4);//getJSON просто послал запрос, и повесил обработчик события, и код пошел дальше. обработчик события вызовется тогда, когда придут результаты с сервера
	$("#a1").animate({left: "+=377"}, 1000);
});
alert(2);//метод click просто повесил обработчик события, и код пошел дальше


методы click и getJSON Оба асинхронные.
Вам очевидно, почему сперва сразу выполняются 1 и 2, а вот 3 выполняется позже(когда был совершен клик)
Если бы после вызова click(), JS ждал бы этого клика, то никакой другой код не смогу бы выполнятся, и все зависло бы, пока пользователь не кликнет.
Аналогично, и getJSON
Он отправил запрос, и вызовет обработчик когда придется результат.
Если сервер медленный, то это может произойти через несколько секунд, или даже минут.
Если бы после отправления запроса JS ждал бы результата для того чтобы вызвать обработчик события ДО вашего кода анимации, то опять -таки все зависло бы на эти секунды или даже минуты, что не очень красиво
Хотя у getJSON в отличии от click есть такой режим работы(параметр async:true), но как я описал это очень плохая идея.

Привыкайте к событийно-ориентированной асинхронной модели


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