Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Выбор элемента из списка (https://javascript.ru/forum/dom-window/70345-vybor-ehlementa-iz-spiska.html)

Янковиц 29.08.2017 09:06

Выбор элемента из списка
 
Добрый день. Есть следующий js:
jQuery('body').on('click', ' .quo span', function(){
		col = jQuery('.basketForm .quo .form-control').val();
		id = jQuery('.basketForm .quo .form-control').attr('data-id');
		jQuery.ajax({
			url  : '/wp-admin/admin-ajax.php',
			type : 'POST',
			cache: false,
			data: ({
				action : 'change_product',
				col : col,
				id : id,
			}),
			success: function(data){
				jQuery('.order-form').html(data);
			}
		});
	});


И часть таблички с двумя пунктами:
// первый
<td class="quo" data-label="Количество:" data-value="1" data-id="226">
	<span class="down">-</span>
	<input maxlength="15" type="text" onkeyup="buttonOff()" class="form-control" data-id="226" name="update_226" value="1">
	<span class="up">+</span>
</td>
// второй
<td class="quo" data-label="Количество:" data-value="1" data-id="236">
	<span class="down">-</span>
	<input maxlength="15" type="text" onkeyup="buttonOff()" class="form-control" data-id="226" name="update_226" value="1">
	<span class="up">+</span>
</td>


Как правильно получить переменные id и col того пункта, значения которого меняю? Сейчас, берет данные только из первого .quo .form-control, даже если работаю со вторым. Понимаю, что ответ на поверхности, но как правильно? Спасибо.

Nexus 29.08.2017 09:43

var $con=jQuery(this).parents('.quo').find('.form-control'),
    col=$con.val(),
    id=$con.attr('data-id');

Янковиц 29.08.2017 09:47

Спасибо большое. Работает на ура...

laimas 29.08.2017 09:47

Янковиц,
думайте сами - элементы span увеличивают/уменьшают количество, вернее "по задумке так", но обработчик же .on('click', ' .quo span', function() этого вообще не делает. К тому же почему обработчик делегирован BODY, эти элементы что динамически добавляются на страницу?
jQuery('.basketForm .quo .form-control') - это коллекция элементов, а обращение к свойству элемента и вернет для первого. А должно быть не так, но сначала бы разобраться с бардаком, что выше описан.

laimas 29.08.2017 09:48

Nexus,
не правильно.

Янковиц 29.08.2017 09:52

Цитата:

Сообщение от laimas (Сообщение 463007)
Янковиц,
думайте сами - элементы span увеличивают/уменьшают количество, вернее "по задумке так", но обработчик же .on('click', ' .quo span', function() этого вообще не делает. К тому же почему обработчик делегирован BODY, эти элементы что динамически добавляются на страницу?
jQuery('.basketForm .quo .form-control') - это коллекция элементов, а обращение к свойству элемента и вернет для первого. А должно быть не так, но сначала бы разобраться с бардаком, что выше описан.

Элементы подгружаются динамически.

laimas 29.08.2017 09:54

А где тогда изменение значения поля? И что при каждом изменении поля запрос на сервер?

Nexus 29.08.2017 09:56

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

С тобою написанным согласен, но сказать, что мой код некорректен не могу, т.к. он решает проблему, но не устраняет глупостей уже написанного кода.

Upd. я бы сделал примерно так, не тестил.
jQuery('body').on('click','.quo span',function(){
	var	$t=jQuery(this),
		$con=$t.parents('.quo').find('.form-control');
		col=$con.val();
		id=$con.attr('data-id');
	
	if($t.hasClass('up'))
		col++;
	else
		col--;
	
	$con.val(col);
	var form_control=$con.get(0);
	if(!!form_control.__timer)
		clearTimeout(form_control.__timer);
	
	form_control.__timer=setTimeout(function(){
		form_control.__timer=false;
		
		jQuery.ajax({
			url:'/wp-admin/admin-ajax.php',
			type:'POST',
			cache:false,
			data:({
				action:'change_product',
				col:col,
				id:id,
			}),
			success:function(data){
				jQuery('.order-form').html(data);
			}
		});
	},250);
});

Янковиц 29.08.2017 18:26

На счет "глупостей написанного", не могу согласиться, ведь, вы не до конца понимаете логику работы. Уже написанный код. И, да при каждом изменении, запрос на сервер. Это ведь корзинка заказа.

laimas 29.08.2017 18:51

Цитата:

Сообщение от Янковиц
при каждом изменении, запрос на сервер. Это ведь корзинка заказа

Совсем не обязательно каждое изменение сопровождать запросом. Но это ладно, а ведь у вас поле ввода, то есть не обязательно щелкать минус плюс, может быть удобнее клавиши и указать быстро, тогда как?

laimas 30.08.2017 00:35

Цитата:

Сообщение от Nexus
Upd. я бы сделал примерно так

Я бы так не делал :)

Nexus 30.08.2017 11:49

Цитата:

Сообщение от laimas
Я бы так не делал

Предложи свой вариант :)

laimas 30.08.2017 12:59

Nexus,
потом, сейчас некогда, могу только сказать, что в поле возможен и ручной ввод, блокировать такой, это бить по рукам пользователя, если выбор предполагает пусть даже макс. до 10.
А это означает, что нужно отслеживать изменения в поле ввода и по этому событию делать запрос сервера.
А вот любовь определять класс, чтобы а++ или а--, это вообще, когда можно оперировать цифрами 1 и -1 без всяких if.

Nexus 30.08.2017 13:26

Цитата:

Сообщение от laimas
А вот любовь определять класс, чтобы а++ или а--, это вообще, когда можно оперировать цифрами 1 и -1 без всяких if.

Не понял как ты собираешься избавиться от проверки на наличие класса и откуда ты взял цифры 1 и -1...
Жду код, в общем.

laimas 30.08.2017 14:22

Цитата:

Сообщение от Nexus
Не понял как ты собираешься избавиться от проверки на наличие класса и откуда ты взял цифры 1 и -1

https://javascript.ru/forum/jquery/7...tml#post462385

Nexus 30.08.2017 14:52

laimas, жду код :)

laimas 30.08.2017 15:14

Цитата:

Сообщение от Nexus
жду код

некогда, пока некогда, да и показывать то будет до бессовестного мало, ибо ничего наворачивать и не придется ;)

Nexus 30.08.2017 15:16

Цитата:

Сообщение от laimas (Сообщение 463123)
некогда, пока некогда, да и показывать то будет до бессовестного мало, ибо ничего наворачивать и не придется ;)

Главное чтобы не так:
https://javascript.ru/forum/jquery/7...tml#post463120

laimas 30.08.2017 17:12

Что именно не так, ждете от меня типа?

if($t.hasClass('up'))
        col++;
    else
        col--;


Такого уж точно не стану делать.

Nexus 31.08.2017 09:45

laimas, https://javascript.ru/forum/jquery/7...tml#post462385
Тут вы, безусловно, красиво все решили, но для вопрошающего ваш код бесполезен на 146%.
Поясню: структура у автора отличалась от предложенной, а код не решал его проблемы вовсе.

laimas 02.09.2017 05:24

Цитата:

Сообщение от Nexus
структура у автора отличалась от предложенной

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

Я и написал, если вы от меня ждали if(who are you) ... ++ ... --, то зря.


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