Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Что-то вроде спиннера (https://javascript.ru/forum/dom-window/50702-chto-vrode-spinnera.html)

Pavel_G 08.10.2014 06:25

Что-то вроде спиннера
 
Доброе утро, подскажите как реализовать, есть вот такой HTML:

<div id="qty-spinner" class="qty">
   <i data-helper="reduce" class="qty__helper reduce"></i>
   <input type="text" id="product_qty_{{ item.item.id }}" class="item-qty" value="{{ item.item.quantity }}">
   <i data-helper="add" class="qty__helper add"></i>
</div>


В двух словах - этот блок в корзине магазина, он позволяет увеличить кол-во экземпляров товара, либо уменьшить.
нужно при клике на
<i data-helper="reduce" class="qty__helper reduce"></i>
отнять 1 от числа в input, а по клику на
<i data-helper="add" class="qty__helper add"></i>
соответственно увеличить на 1.

Заранее спасибо

ksa 08.10.2014 08:29

Как вариант...

<!DOCTYPE html>
<html>
<head>
<script src='http://code.jquery.com/jquery-latest.js'></script>
<!--
<link rel='stylesheet type=text/css href=tmp.css' />
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
$(function (){
	$('.reduce').click(function (){
		var o=$(this).next();
		var val=parseInt(o.val());
		if (val>0) {
			o.val(val-1);
		};
	});
	$('.add').click(function (){
		var o=$(this).prev();
		var val=parseInt(o.val());
		o.val(val+1);
	});
});
</script>
</head>
<body>
<div id="qty-spinner" class="qty">
   <i data-helper="reduce" class="qty__helper reduce">-</i>
   <input type="text" id="product_qty" class="item-qty" value="4">
   <i data-helper="add" class="qty__helper add">+</i>
</div>
</body>
</html>
</html>

Pavel_G 08.10.2014 08:43

Спасибо!

utb 08.10.2014 09:39

ksa,
со всем уважением, но
var o=$(this).next();

сломается сразу как добавим элемент, не ?
бест практик, что нам говорит кто знает ?
Мне в голову приходит только
1 - взять по id или классу (уникальный ввиде .js_blabla) - но если в корзине несколько товаров - они генерируют одинаковый код, что уже не очень
2 - взять родителя и в нем найти нужный инпут, но тут надо следить за тем, чтобы кнопки и инпут были на 1 уровне

Кто что скажет ? наверное, есть элегантное решение

ksa 08.10.2014 10:06

Цитата:

Сообщение от utb
Мне в голову приходит только

Могу сказать только одно - каждый дрочет как он хочет... :D

utb 08.10.2014 10:27

ksa,
:lol:
ну да)) извратиться можно по-всякому.

я просто думал, есть какой-нибудь лучший вариант или паттерн)

рони 08.10.2014 11:21

:)
<!DOCTYPE html>
<html>
<head>
<script src='http://code.jquery.com/jquery-latest.js'></script>
<style type='text/css'>
</style>
<script type='text/javascript'>
$(function (){
	$('.qty__helper').click(function (event){
	    event.stopPropagation();
		var o=$(this).siblings('.item-qty');
		var val=parseInt(o.val());
        val += $(this).hasClass("add") ? 1 : val == 0 ? 0 : -1;
	   	o.val(val);
	});
});
</script>
</head>
<body>
<div id="qty-spinner" class="qty">
   <i data-helper="reduce" class="qty__helper reduce">-</i>
   <input type="text" id="product_qty" class="item-qty" value="4">
   <i data-helper="add" class="qty__helper add">+</i>
</div>
</body>
</html>

ksa, а у вас молоко убежало в конце кода

ksa 08.10.2014 11:36

Цитата:

Сообщение от рони
а у вас молоко убежало в конце кода

:blink:
Вроде работающий скрипт...

danik.js 08.10.2014 12:02

<!DOCTYPE html>

<input type="number" min="0" value="4" />

<script src='http://code.jquery.com/jquery-latest.min.js'></script>
<script src="http://afarkas.github.io/webshim/js-webshim/minified/polyfiller.js">
<script>
webshim.polyfill('forms forms-ext');
</script>

danik.js 08.10.2014 12:06

Кстати, с этой штукой можно вполне использовать HTML5 поля типов date, time, month, color и тд. А также кастомизировать их.
Демки: http://jsfiddle.net/trixta/VNuct/

рони 08.10.2014 12:19

Цитата:

Сообщение от ksa
Вроде работающий скрипт...

многовато будет ))) строка 34и 35 пост 2

Pavel_G 08.10.2014 12:36

только вот как заставить меняться и value?

ksa 08.10.2014 13:09

Цитата:

Сообщение от рони
строка 34и 35 пост 2

Аааа. Да это из-за копирования чужого ХТМЛя...

kostyanet 09.10.2014 11:02

danik.js wrote "Демки: http://jsfiddle.net/trixta/VNuct/"

Через жопу работает. Ставлю маркер на месяц, кручу вверх - шняга наматывает день. Посмотрите в Хроме или в Опере как оно нормально устроено. Я про дату.

Кстати, интересная хрень. Да, ОС у меня локализована через CP, ну и браузеры тоже все на оригинальном языке - и это значит мне надо локальную дату показывать в британской манере? Или это не зависит от ОС и браузера?

kostyanet 09.10.2014 11:18

Цитата:

if (val>0) {
o.val(val-1);
};

Это непоколебимо. У ТС в стопицот раз больше сущностей чем надо - ну где-то натырил, а у советчика как эти сущности приспособить не поднялась рука их все прибить.

Этого достаточно:

<div class="qty">
<input type="text" min="0" max="1000000" step="1" >
</div>


:before и :after изображают кнопки, padding инпута выдвигает валуе чтоб оно кнопками не закрывалось, а обработчик на _инпуте_ тупо замеряет размер прилетевшего элемента и как 2 пальца определяет какая "кнопка" нажата. Берет соответствующий step и, если нажата декрементная делает его унарно негативным. В финале банальное сложение с текущим валуе и клип по min max.

danik.js 09.10.2014 16:17

Цитата:

Сообщение от kostyanet
Через жопу работает. Ставлю маркер на месяц, кручу вверх - шняга наматывает день. Посмотрите в Хроме или в Опере как оно нормально устроено. Я про дату.

Знаю. Нужно исправлять. Но у меня нет на это времени. У разработчика видимо тоже.

Цитата:

Сообщение от kostyanet
Да, ОС у меня локализована через CP, ну и браузеры тоже все на оригинальном языке - и это значит мне надо локальную дату показывать в британской манере? Или это не зависит от ОС и браузера?

Какие есть пути решения?

kostyanet 09.10.2014 19:50

Надо посмотреть умеет ли JQuery форматировать даты. Проблематика там с ограничением - нельзя ввести днюху на 16 лет раньше текущей даты. ;)


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