Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Делегирование (https://javascript.ru/forum/dom-window/51937-delegirovanie.html)

sloyi 26.11.2014 11:57

Делегирование
 
Пытаюсь создать событие при клике на созданном option с помощью вывода ajax.

Пример
есть два select

<select id="select_one">
<option selected="selected">Выберите раздел</option>
<option id="82" class="option_id_one">Мягкая мебель</option>
<option id="83" class="option_id_one">Гостиная</option>
<option id="96" class="option_id_one">Кухни</option>
<option id="104" class="option_id_one">Спальня</option>
</select>

<select id='select_two'>
</select>


во второй селект я вывожу option из базы допустим после того как мы выбрали раздел второй селект получился :

<select id="select_two">
<option id="156" class="option_id_two">Табуреты</option>
<option id="97" class="option_id_two">Кухонные гарнитуры</option>
<option id="98" class="option_id_two">Стулья</option>
<option id="99" class="option_id_two">Столы</option>
<option id="101" class="option_id_two">Кухонные уголки</option>
<option id="179" class="option_id_two">Шкафы</option>
</select>

далее мне надо повесить событие клика по option с классом option_id_two

пытаюсь сделать следущим образом:

$('#select_two').on('click', '.option_id_two', function() {
	alert('Привет');
});


но он мне alert не выводит

(сам вывод option во второй select работает корректно, но делегирование мне не поддаеться)
Помогите парни пожалуйста.:help:

sloyi 26.11.2014 11:58

если надо то вот вывод во второй селект

$('.option_id_one').click(function (){
		id = this.id;
		$.post("/netcat/modules/default/tegs-vivod-podrazd.php",
						{
						id:id,
						},
					function(data)
						{
						document.getElementById('select_two').innerHTML = data;
						}
				);
	});

ruslan_mart 26.11.2014 12:19

$('#select_two').change(function() {
    alert(this.value);
});

sloyi 26.11.2014 12:26

вооооуууу спасибо большое все вышло как надо:dance:

sloyi 26.11.2014 13:22

блин нет все равно не правильно. мне нужно событие именно на нажатие

элемента с классом option_id_two

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

kostyanet 26.11.2014 14:59

Щелчок по селекту не имеет смысла.

Чтобы гарантировано был change, нужен item по умолчанию который не имеет значения. Например "----", или там "Выберите табуретку".

kostyanet 26.11.2014 15:05

Ну да, как в первом селекте у вас сделано - так и продолжайте добавлять дефолтное значение на которое нельзя получить данные, ну или придут те же самые.

Да, кстати, а что будет внешне с селектом, если ему программно засандалить selectedIndex=-1? Я как-то делал, уже забыл. Но тогда, вроде, не нужен пустой item. Любой выбор дает дает change, поскольку selectedIndex начинается с 0.

sloyi 26.11.2014 15:09

хоршо а если у меня появилось несколько дивов например

<div class='otpravka'>
<span>1 значение</span>
<div class='otpracit'>Отправить</div>
</div>

<div class='otpravka'>
<span>2 значение</span>
<div class='otpracit'>Отправить</div>
</div>

<div class='otpravka'>
<span>3 значение</span>
<div class='otpracit'>Отправить</div>
</div>


мне нужно повесить событие клика на кнопку отправить

kostyanet 26.11.2014 15:11

Все правильно, вот что будет http://learn.javascript.ru/play/uTrs1b

селект будет kinda empty, но зато ченч сработает гарантировано.

Кстати, а кто знает как сделать чтобы код выполнялся в теме? Я все пункты тут проверил в навигации - нет ничего похожего.

kostyanet 26.11.2014 15:13

Цитата:

Сообщение от sloyi
мне нужно повесить событие клика на кнопку отправить

Ну вы не путайте член с морковкой. селект это селект (по-старому это называлось menu), а кнопка - какой у нее ченч?

sloyi 26.11.2014 15:21

не не не чуточку меня не понял вот подробнее :)


допустим есть кнопка и див в который мы выводим
<div class='vivod'>Вывести</div>

<div class='all-form'>

</div>


далее с помощью события я вывожу несколько дивов

$(document).ready(function(){
	$('.vivod').click(function (){
		$.post("/netcat/modules/default/tegs-vivod-tovar.php",
						{
						podrazdel:podrazdel
						},
					function(data)
						{
						document.getElementById('all-form').innerHTML = data;
						}
				);
	});


В файле tegs-vivod-tovar.php идет вывод дивов. и вывели мы в див с классом all-form

далее у меня появляються такие дивы

<div class='all-form'>
	<span>1 значение</span>
	<div class='otpravit'>Отправить</div>
	</div>
	 
	<div class='otpravka'>
	<span>2 значение</span>
	<div class='otpravit'>Отправить</div>
	</div>
	 
	<div class='otpravka'>
	<span>3 значение</span>
	<div class='otpravit'>Отправить</div>
        </div>
</div>


теперь мне нужно событие при нажатии на кнопку с классом otpravit

пример:

$('.otpravit').click(function (){
    alert('Привет');
});


но он не работает т.к. при создании страницы данных дивов нет и он не понимает к кому его заставляют обратиться

и как вот справиться мне с данной проблемой

kostyanet 26.11.2014 15:21

Чуваки с SO подсказывают: http://learn.javascript.ru/play/m6Ixl

нулевый елемент делается кроме того disabled и его попросту нельзя выбрать. Еще можно засунуть все в optgroup кстати.

kostyanet 26.11.2014 15:24

Цитата:

Сообщение от sloyi
т.к. при создании страницы данных дивов нет и он не понимает к кому его заставляют обратиться

Ну так вешайте свои вектора когда див появился. После того как. В чем тут проблема-то?

sloyi 26.11.2014 15:25

извени не понял тебя(
куда вешать?

sloyi 26.11.2014 15:28

впринцапе можно сделать вот так

$.post("/netcat/modules/default/tegs-vivod-tovar.php",
						{
						podrazdel:podrazdel
						},
					function(data)
						{
						document.getElementById('all_tovar').innerHTML = data;
                                                $('.otpravit').change(function() {
	                                             alert('Привет');
                                                });
						}
				);


и тогда будет работать. но там будут еще различные события и тогда придеться писать внутри внутри и внутри событий. а так не устраивает((((

kostyanet 26.11.2014 15:33

У вас родительский контейнер существует отродясь или аяксом зарождается?

<div class='all-form'>

на него вешаете обработчик щелчка и затем все что внутри появится будет доступно как я понимаю по event.target.

sloyi 26.11.2014 15:35

да он у меня есть изначально

Цитата:

обработчик щелчка и затем все что внутри появится будет доступно как я понимаю по event.target.
если вам не сложно, можно примерчик маленький.

kostyanet 26.11.2014 15:39

document.getElementById('all_tovar').innerHTML = data;

То есть список как хтмл что ли приходит? Ну зашибись. Ну ищите тогда чудесное преследование, или как там - делегирование в сферического коня.

Сделайте разметку под интерфейс, сделайте родителей, скройте что еще не имеет значения, получайте данные в json, делайте детей родителям и не придется искать пятое колесо зайцу.

То есть каноничный способ только через аякс. Вместо перезагрузок с рендером - подгрузка с рендером.

sloyi 26.11.2014 15:43

:thanks: ладно спасибо большое за помощь попробую как нибудь разобраться;)

kostyanet 26.11.2014 15:44

Кстати, говорят на js есть такая хуерага как ShadowDom. Дом Теней внатури, ну, то есть ob_start().

Цитата:

Сообщение от sloyi
если вам не сложно, можно примерчик маленький.

Не могу сообразить как в песочнице организовать XMLHttpRequest. Можно примерчик маленький? event.target можете прямо сейчас у себя отследить в консоли на любом щелчке.

sloyi 26.11.2014 15:45

я уже делал такое и все нормально работало


примерно как то так
$('.all-tovar').on('dblclick', '.save-but', function() {
	alert('Привет');
});


но сейчас почему то он не работает

а консоль говорит

TypeError: $(...).on is not a function


$('.all-tovar').on('dblclick', '.save-but', function() {

kostyanet 26.11.2014 15:46

В принципе щелчок можно повесить прямо на body и следить по цели откуда он пришел.

kostyanet 26.11.2014 15:46

Цитата:

Сообщение от sloyi
TypeError: $(...).on is not a function

Жиклер засорился. Проверьте версию и все такое.

sloyi 26.11.2014 15:49

Цитата:

Жиклер засорился. Проверьте версию и все такое.

я извеняюсь но я вас не понял

sloyi 26.11.2014 16:08

блиииииииииииииин ты гений тоьлко сейчас увидел =DDDDD у меня сдесь была подключена библиотека 1.7.1 а данная функция работает только с версии 1.7.2

поставил новую версию и все заработало

огромное спасибо что помог


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