Задать вопрос
@Riiri

Как правильно сменить текст кнопки после отправки товара в корзину?

После успешной отправки товара в корзину мне нужно чтобы текст кнопки поменялся на "В корзине", но к сожалению функция срабатывает только после второго клика по кнопки, а без функции click она не работает.
Сама кнопка находится в цикле foreach.
Код php
<td>
			<?if(count($arElement["OFFERS"]) > 0):?>
				<?foreach ($arElement["OFFERS"] as $offer): ?>
					<div class="button456" >
						<button id="but<?=$offer["ID"]?>" onclick="add2basket(<?=$offer["ID"]?>)">To the basket</button>
						</div>
					<?endforeach?>

					<?else:?>
					<div class="button111">
					<button class="but123"  id="but<?=$arElement["ID"]?>" onclick="add2basket(<?=$arElement["ID"]?>)">To the basket</button>
				</div>
				<?endif?>

		</td>

Код js
<script type="text/javascript">
	function add2basket(ID) {
	$.ajax({
		type: "POST",
		url: "/ajax/add_tobasket.php",
		dataType: 'html',
		data: {
			PRODUCT_ID: ID,
			QUANTITY: $(".quantity" + ID).val(),
		},

		success: function (data) {
//так срабатывает только после второго клика							
$(document).on('click', 'button', function(){
	$(this).closest('button').text("In the basket")
});
	$(this).closest('button').text("In the basket");//а так не срабатывает вообще
		},
	});
}
</script>
  • Вопрос задан
  • 122 просмотра
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 2
@Sadovikow
в success: function(data) вы первым кликом добавляете событие – при нажатии на кнопку, менять текст. А уже при втором нажатии это событие применяется.

Я бы передавал не только ID в функцию, а и всю DOM-сущность (саму кнопку).
<button data-id="<?=$offer["ID"]?>" id="but<?=$offer["ID"]?>" onclick="add2basket(this)">To the basket</button>


function add2basket(e) {
var button = $(e);
var ID = button.attr('data-id');
  $.ajax({
    type: "POST",
    url: "/ajax/add_tobasket.php",
    dataType: 'html',
    data: {
      PRODUCT_ID: ID,
      QUANTITY: $(".quantity" + ID).val(),
    },

    success: function (data) {
     button.closest('button').text("In the basket");
  });
}


Прошу прощения, если есть ошибки в коде, главное донести мысль. Проблема лишь в том, что в success вы заводите событие при первом клике, но не вызываете изменение в кнопке
Ответ написан
Комментировать
Liatano
@Liatano
Вы вешаете обработчик на кнопку, когда система УЖЕ попыталась добавить в корзину товар. В случае "success" нужно посмотреть, что приходит в "data" и в зависимости от содержимого менять содержимое кнопки. Например пришла ошибка и товар не был добавлен в корзину, тогда писать "в корзине" - нельзя.
Если в принципе на ошибки пофиг, то тогда вне зависимости от "data" сразу меняем надпись. Т.е. $(document).on('click' - не нужно.
Как найти, что за кнопка была нажата? В функцию приходит "ID" продукта, по нему находим кнопку на странице и заменяем кнопку. Либо можно найти , где вызывается функция add2basket(ID) и менять там, но этот вариант хуже, т.к. мы не будем знать,а был ли вообще ответ от сервера.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы