Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Обработка событий на динамически созданных объектах (https://javascript.ru/forum/jquery/1549-obrabotka-sobytijj-na-dinamicheski-sozdannykh-obektakh.html)

Alexey_R 12.08.2008 11:21

Обработка событий на динамически созданных объектах
 
Приветствую.
Использую jquery, $(document).ready(function() нормально работает, но только с объектами, которые были на странице с "самого начала".
А как обработать тот же click, не прописывая его непосредственно в атрибутах. Если вызывать $(document).ready(function() еще раз, то для существующих объектов события будут удваиваться.

BlackAngels 20.08.2008 15:12

тоже ищу ответ
 
Да ребята делаю корпоративный сайт а на динамически созданных
объектах click не работает помогайте все !!!
Плиз срочно !!!

ZoNT 20.08.2008 15:36

выкинь jquery в мусорку и пиши руками то что тебе надо...

BlackAngels 20.08.2008 15:40

да хороший ответ а посерьезней что нибудь

ZoNT 20.08.2008 15:46

посерьёзнее: когда тебе придётся всё это переделать на prototype или другой фрейворк, ты поймёшь, что я был прав...

BlackAngels 20.08.2008 15:48

ну ладно пойду попробую на prototype

ну короче ответа ты не знаешь !!!

ZoNT 20.08.2008 15:48

Вот краткий список минусов...

Библиотеки:
- лишний код библиотеки
- привязка к определённой библиотеке (переделывать потом под другую запаришься: надо будет изучать другую и эту библиотеку)
- привязка к длинным названиям нестандартных функций библиотеки (хрен сожмёшь нормально код)
- изучение особенностей данной библиотеки
- неявные неизвестные баги чужого кода

Сделать самому:
- время

ZoNT 20.08.2008 15:51

меня буквально позавчера попросили переделать скрипт маскированного ввода в инпуты с jquery на prototype.
В итоге я просто написал с нуля свой скрипт. Он в несжатом виде меньше по размеру, чем сжаты для jquery.
Он написан как самотоятельный метод и независим ни от каких библиотек...

BlackAngels 20.08.2008 15:55

ну круто молодец но я не javascript программер
мне просто сказали делай и все так знаю
php, c++, delphi, perl-немного, и тут пришлось делать
на javascript все самому через getElement так запорно
а так готовая библия да и как я сам click обработаю
по нажатию на <a> хер знает надо думать

Андрей Параничев 20.08.2008 16:00

ZoNT,
Зачем давать такие советы в разделе jQuery? Использовать и не использовать библиотеки - выбор самостоятельный. Тем более, что приведённые тобой минусы чисто символические. Для быстрого решения простых задач, для человека, не близко знакомого с JavaScript - фреймворки подходящий вариант.

BlackAngels,
Я не понял твою задачу. Выложи листинг кода проблемного места. Я уверен, что задача решаема, просто ты, видимо, что-то делаешь неправильно. Какая связь, между $(document).ready() и динамически создаваемыми элементами?

ZoNT 20.08.2008 16:00

elem.onclick = function(){alert('yo-moyo')}

ZoNT 20.08.2008 16:02

Цитата:

Сообщение от Андрей Параничев (Сообщение 4794)
ZoNT,
Зачем давать такие советы в разделе jQuery?

Звиняй, не заметил, что это раздел jquery. Просто слежу за новыми сообщениями и раздел в глаза никогда не бросается... Или шрифт слишком мелки, или цвет так подобран, но глаз не цепляется...

BlackAngels 20.08.2008 16:08

Вот то что добавляется в конец таблицы то есть строка !!!

$("#div_add a").click(
  function()
	{	
		var v=$(this).parent().parent().parent().find("table").attr("id");
		var add=$('<tr id="tr"><td width="3%">1.</td><td class="ch"><a>Выберите товар ...</a></td><td class="razm"></td><td><input name="kol_list" type="text"></td><td><input name="list" value="0"> руб.</td><td class="summ">0 руб.</td></tr>');
	add.appendTo("#"+v);
	});


А вот обработчик click

$(".ch a").click(
	function()
	{
		$("#Pr").animate({opacity: 'show'}, "slow", "easein");
		index = $(".ch a").index(this);	                                                val_zak=$(this).parent().parent().parent().parent().find("table").attr("id");		
	});


То есть по нажатия на $(".ch a") плавно появляется список

Андрей Параничев 20.08.2008 16:41

BlackAngels,
И в чем проблема? Устанавливайте обработчик $(".ch a").click() после того, как добавили строку в конец таблицы (т.е. внутри $("#div_add a").click()), или я что-то неправильно понял?

BlackAngels 20.08.2008 16:52

Да спасибо все работает !!!

Вопрос другой зачем ей еще раз подсовывать обработчик

$(".ch a").click(
    function()
    {
        $("#Pr").animate({opacity: 'show'}, "slow", "easein");
        index = $(".ch a").index(this);                                                    val_zak=$(this).parent().parent().parent().parent().find("table").attr("id");        
    });


если он у иеня уже есть в начале скрипта тупость какая то или он не понимает или не видит фигня короче ?????

BlackAngels 20.08.2008 16:55

Тогда просьба как сделать такую фичу по нажатии на этот
$(.ch a) значит с зади все затемняется и видно только всплывающий div

и как еще организовать прокрутку этого diva со скролом ну то есть страница на месте а div сползает

Андрей Параничев 20.08.2008 17:17

BlackAngels,
Цитата:

Сообщение от BlackAngels
Вопрос другой зачем ей еще раз подсовывать обработчик

Обработчик вешается только на те элементы, которые доступны в модели DOM. Т.е. до того, как вы создали эти элементы и присоединили к другому элементу - прописывать обработчик бессмысленно. Это же не CSS стили, это просто селекторы, и работает по другому.

Цитата:

Сообщение от BlackAngels
Тогда просьба как сделать такую фичу по нажатии на этот
$(.ch a) значит с зади все затемняется и видно только всплывающий div

Я не работал с jQuery, поэтому тут кодом не могу помочь.

Цитата:

Сообщение от BlackAngels
и как еще организовать прокрутку этого diva со скролом ну то есть страница на месте а div сползает

Не уверен, что вы это имеете в виду, но прокрутка div делается через CSS:
.класс_элемента {
     width: ширина;
     height: высота;
     overflow-x: hidden; // Прокрутки по ширине не будет
     overflow-y: scroll; //  Прокрутка по высоте будет
}

BlackAngels 20.08.2008 17:21

Ну хоть на этом огромное спасибо !!!

BlackAngels 22.08.2008 17:01

Ребята в продолжение банкета все то ра
ботает только вот как только снова обрабатываешь
$(".ch a").click(
    function()
    {
        $("#Pr").animate({opacity: 'show'}, "slow", "easein");
        index = $(".ch a").index(this);                                                    val_zak=$(this).parent().parent().parent().parent().find("table").attr("id");        
    });


то другой $(".ch a").click обрабатывается уже два раза
и получается что div #Pr появляется как бы мелькая
то есть столько раз сколько было добавлено $(".ch a").click

вообще хрень как сделать чтобы он появлялся только один раз

Андрей Параничев 22.08.2008 17:15

BlackAngels,
Что-то я не понял, что значит "еще раз обрабатываешь"? Один обработчик должен быть установлен один раз. Можно чуть более развернуто, например выложите весь листинг, где вы устанавливаете события и кусок HTML.

BlackAngels 22.08.2008 17:28

$(document).ready(function()
	{

$(".ch .a").click(

function()
{
	$("#Pr").animate({opacity: 'show'}, "slow", "easein");
	index = $(".ch a").index(this);
val_zak=$(this).parent().parent().parent().parent().find("table").attr("id");			
		});


$(".div_add a").click(
			function()
			{
			var addzak=$(this).parent().parent().parent().parent().find("table").attr("id");
			
			if(addzak=="tab1"){
				var numb=$("#tab1 tr").length;
				var str='<tr id="tr"><td>'+numb+'.</td>'
				str+='<td width="4%" class="close" onclick="clos(this);"><img src="close.gif" width="14" height="14"></td>';
				str+='<td class="ch" style="text-align:left;"><a>Выберите товар ...</a></td>';
				str+='<td><input  type="text" name="shl"></td>';
				str+='<td><input  type="text" name="dll"></td>';
				str+='<td><input  type="text" name="kol"></td>';
				str+='<td><input name="metr" value="0"> руб.</td>';
				str+='<td><span class="summ">0 руб.</span></td></tr>';
				var add=$(str);
				add.appendTo("#"+addzak);

//Как вы и сказали добавить еще раз обработчик чтобы у элемента заработал click				
$(".ch .a").click(

function()
{
	$("#Pr").animate({opacity: 'show'}, "slow", "easein");
	index = $(".ch a").index(this);
val_zak=$(this).parent().parent().parent().parent().find("table").attr("id");			
		});				
				});


});

ignar 22.08.2008 17:32

Есть очень хороший плагин listen.
Как раз для этих целей.

BlackAngels 22.08.2008 17:34

А без этого незя еще 20 кб лишние

ignar 22.08.2008 18:09

не 20, а 2.5кб запакованный.

Можно то и без него, но это будет универсально, и гораздо облегчает работу, тем более я не думаю, такая ситуация возникнет один раз.
Это одно средство на многие случаи жизни. И не нужно будет изобретать велосипед, сомневаюсь что можно будет написать лучше.
Зачем лишние грабли??

Андрей Параничев 22.08.2008 19:36

BlackAngels,
А, я понял проблему. У вас по клику добавляется обработчик на все элементы еще раз. Что-то я зашел в тупик. :)
Первый $(".ch .a").click можно удалить - по нему этому селектору элементов все-равно на тот момент не будет. Кстати, почему ".a", если у вас просто тег? Разве не .ch a?

Андрей Параничев 22.08.2008 19:58

BlackAngels,
В общем вы можете выкрутиться вот так:
$(document).ready(function()
    {
        $(".div_add a").click(
        function()
        {
            var addzak=$(this).parent().parent().parent().parent().find("table").attr("id");
 
            if(addzak=="tab1"){
                var numb=$("#tab1 tr").length;
                var str='<tr id="tr"><td>'+numb+'.</td>'
                str+='<td width="4%" class="close" onclick="clos(this);"><img src="close.gif" width="14" height="14"></td>';
                str+='<td class="ch" style="text-align:left;"><a>Выберите товар ...</a></td>';
                str+='<td><input  type="text" name="shl"></td>';
                str+='<td><input  type="text" name="dll"></td>';
                str+='<td><input  type="text" name="kol"></td>';
                str+='<td><input name="metr" value="0"> руб.</td>';
                str+='<td><span class="summ">0 руб.</span></td></tr>';
                var add=$(str);
                add.appendTo("#"+addzak);
                
            $(".ch a").each(function() {
                 this.onclick = function()
                 {
                    $("#Pr").animate({opacity: 'show'}, "slow", "easein");
                    index = $(".ch a").index(this);
                    val_zak=$(this).parent().parent().parent().parent().find("table").attr("id");            
                  }
            });                
        });
});

Deexus 09.01.2009 20:32

Есть такая библиотека livequery. Используется как раз для установки на динамически созданные элементы обработчиков.

Saratov64 15.02.2017 15:26

Цитата:

Сообщение от Deexus (Сообщение 10496)
Есть такая библиотека livequery. Используется как раз для установки на динамически созданные элементы обработчиков.

Скачал jquery.livequery

но прикрутить не смог, к моему примему так как пока это слишком сложно для новечка ((((

рони 15.02.2017 15:28

Цитата:

Сообщение от Saratov64
Скачал jquery.livequery

не надо качать старьё, jquery есть всё для делегирования из коробки.


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