Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Увеличить/уменишить число при клике на кнопку (https://javascript.ru/forum/events/66017-uvelichit-umenishit-chislo-pri-klike-na-knopku.html)

smart-create 21.11.2016 13:29

Увеличить/уменишить число при клике на кнопку
 
Добрый день! Я не давно на этом форуме и вообще в JS, по этому сразу попрошу не бросаться тапками если вопрос покажется слишком простым:)

У меня есть блок - количество товара в корзине, вот его разметка:

<div class="col-lg-2 col-md-2 col-sm-2 hidden-xs number-update">
	<h2>
		<span id="number-prev" class="number-actual" onClick="numberPrev()">- </span>
		<span id="valueNumber">2</span>
		<span id="number-next" class="number-actual" onClick="numberNext()"> +</span>
	</h2>
</div>
<div class="col-lg-2 col-md-2 col-sm-2 hidden-xs number-update">
        <!-- Далее такие же блоки в n-ом количестве -->
</div>


Как вы уже догадались мне нужно что бы при нажатии на + или - количество либо увеличивалось либо уменьшалось.

Я хочу реализовать это с помощью 2 соответствующих функций, вот их начало:

function numberPrev(){
	$('.number-update').click(function(){
		var numberValue = $(this).find("#valueNumber").text();
		console.log(numberValue);
	})
}
	
function numberNext(){
	$('.number-update').click(function(){
		var numberValue = $(this).find("#valueNumber").text();
		console.log(numberValue);
	})
}


Сейчас, проблема в том что я не могу "по человечески" обратиться к значению которое содержится в span у которого #valueNumber - это и есть количество. Проблема следующего характера, при выполнении этих функции, значение из "valueNumber" берется не 1 раз, а трижды, то есть из-за того что в функции присутствует:
"$('.number-update').click(function()"

Она выводит по значению с каждой функции, а потом только (третьим номером), то значение которое мне и правда нужно.
Вообще я понимаю что вся загвоздка в:
"$('.number-update').click(function()"

Но как ее заменить для того что бы смело использовать "$(this)", я не могу разобраться уже второй день.

Заранее благодарен за любую помощь

ksa 21.11.2016 13:37

Цитата:

Сообщение от smart-create
Я хочу реализовать это с помощью 2 соответствующих функций

Нужно использовать одну функцию, но с параметром... ;)

ksa 21.11.2016 13:39

Цитата:

Сообщение от smart-create
Далее такие же блоки в n-ом количестве

У тебя все однотипные элементы имеют одинаковый ИД? :blink:
А ведь ИД должен быть уникальным на странице. :nono:
Т.ч. самое время начать использовать атрибут class.

ksa 21.11.2016 13:59

Цитата:

Сообщение от smart-create
Но как ее заменить для того что бы смело использовать "$(this)", я не могу разобраться уже второй день.

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

<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<script src='http://code.jquery.com/jquery-latest.js'></script>
<!--
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
.number-actual {
	cursor: pointer;
}
</style>
<script type='text/javascript'>
$(function (){
	$('.number-prev').click(function (){
		inc(this.parentNode,-1);
	});
	$('.number-next').click(function (){
		inc(this.parentNode,1);
	});
	function inc(Obj,Val){
		Obj=$(Obj).find('.valueNumber');
		var val=parseInt(Obj.text());
		if (val==0 && Val==-1) {
			return;
		};
		Obj.text(val+Val);
	};
});
</script>
</head>
<body>
<div class="col-lg-2 col-md-2 col-sm-2 hidden-xs number-update">
	<h2>
		<span class="number-actual number-prev">- </span>
		<span class="valueNumber">2</span>
		<span class="number-actual number-next"> +</span>
	</h2>
</div>
<div class="col-lg-2 col-md-2 col-sm-2 hidden-xs number-update">
	<h2>
		<span class="number-actual number-prev">- </span>
		<span class="valueNumber">2</span>
		<span class="number-actual number-next"> +</span>
	</h2>
</div>
</body>
</html>

smart-create 21.11.2016 14:30

То что нужно! Огромное спасибо!

Но есть другая проблема, почти мистическая. Внутри блока корзины "$('.number-prev').click(function ()", не работает, такое ощущение что кнопки + и - просто неактивны, хотя это не так.

Вынес свою разметку за корзину, просто на страницу, все заработало. Не могу понять в чем причина. Могли бы помочь? Может есть какой-то запрос для отладки который покажет что именно в корзине блокирует "$('.number-prev').click(function ()"

ksa 21.11.2016 14:55

Цитата:

Сообщение от smart-create
Не могу понять в чем причина.

Так может на момент навешивания событий этих элементов просто нет на странице...
Они еще не подгружены.

ksa 21.11.2016 14:57

Цитата:

Сообщение от smart-create
Может есть какой-то запрос для отладки который покажет что именно в корзине блокирует "$('.number-prev').click(function ()"

Пробуй так...

$(function (){
	alert('prev - '+$('.number-prev').length);
	alert('next - '+$('.number-next').length);
	$('.number-prev').click(function (){
		inc(this.parentNode,-1);
	});
	$('.number-next').click(function (){
		inc(this.parentNode,1);
	});
	function inc(Obj,Val){
		Obj=$(Obj).find('.valueNumber');
		var val=parseInt(Obj.text());
		if (val==0 && Val==-1) {
			return;
		};
		Obj.text(val+Val);
	};
});

Смотри чего покажет...

smart-create 21.11.2016 15:24

Вы гений. Действительно в момент загрузки скрипта, элементов на странице просто не существует. Возможно это как-то обойти?

ksa 21.11.2016 16:40

Цитата:

Сообщение от smart-create
Возможно это как-то обойти?

Нужно использовать "делегирование"
https://habrahabr.ru/post/70760/
https://learn.javascript.ru/event-delegation

smart-create 22.11.2016 14:43

ksa, добрый день, я прошу прощения, но я практически нечего не понял из статей которые вы прислали. Вернее даже не так, я перечитал их огромное количество раз, понял зачем нужно делегирование, но не понял как оно применимо к моему случаю:(

Если Вас не затруднить пожалуйста, помогите разобраться новичку


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