#javascript #cart
Вопрос:
Мне нужно решение о том, как решить эту проблему. функция цикла javascript плохо работает в функции возврата AJAX.
var selectedColor = ''; var selectedSize = ''; var selectedQuantity = ''; var productID = ''; var indexCount; $('.up-cart').on('click', function() { var cartRows = $('.cartRows').length; for (indexCount = 0; indexCount lt;= cartRows; indexCount ) { $('.myOrderSettings [name="selectedColor' indexCount '"]').each(function() { if ($(this).prop("checked")) { if (selectedColor == "") { selectedColor = $(this).val(); } else { selectedColor = ',' $(this).val(); } } }); $('.myOrderSettings [name="selectedSize' indexCount '"]').each(function() { if ($(this).prop("checked")) { if (selectedSize == "") { selectedSize = $(this).val(); } else { selectedSize = ',' $(this).val(); } } }); $('.myOrderSettings [name="selectedQuantity' indexCount '"]').each(function() { if ($(this).val() lt; 1) { selectedQuantity = '1'; alertMe("Your order quantity has been set to 1", 5000); } if (parseInt($(this).val()) gt; parseInt($(this).attr('max'))) { selectedQuantity = $(this).attr('max'); alertMe("We have " $(this).attr('max') " of this product. Your order quantity has been set to " $(this).attr('max'), 5000); } else { selectedQuantity = $(this).val(); } }); productID = $('.myOrderSettings [name="productID' indexCount '"]').val(); $.ajax({ url: "lt;?php echo base_url() ?gt;cart/updateCart", type: "post", dataType: "json", data: { selectedColor: selectedColor, selectedSize: selectedSize, selectedQuantity: selectedQuantity, productID: productID }, success: function(data) { console.log(indexCount); $('.myOrderSettings .t-total' indexCount).html(formatMoney(parseInt(data.cart_amount))); } }); calculateTotalAmount(); selectedColor = ""; selectedSize = ""; selectedQuantity = ""; productID = ""; } });
Результат на консоли, который я получаю в консоли, равен 6, в то время как у меня всего 5 строк. Это мешает мне возвращать результат соответственно объектам. Проверьте результат в консоли
Комментарии:
1. Что вы пытались сделать, чтобы решить эту проблему? Это проблема JS или проблема PHP?
2.
lt;=
изменение наlt;
«потому0 while lt; 6
что» равно 6 итерациям, но0 while lt;= 6
равно 7 итерациям.3. Это проблема X/Y. НЕ включайте ajax в цикл. Вместо этого соберите значения и сделайте ОДИН ajax
4. Также используйте карту jQuery для получения цветов и размеров:
const selectedColor = $('.myOrderSettings [name="selectedColor' indexCount '"]:checked').map(function() { return this.value }).get().join(", ");
5. Большое спасибо за предложение карты. Это сработало. Но, пожалуйста, не могли бы вы мне это объяснить?
Ответ №1:
Я только что решил эту проблему, я заметил, что асинхронность не была установлена в значение false, так что вот мое решение. но другие решения были бы приветствованы.
var selectedColor = ''; var selectedSize = ''; var selectedQuantity = ''; var productID = ''; var indexCount; $('.up-cart').on('click', function() { var cartRows = $('.cartRows').length; for (indexCount = 0; indexCount lt;= cartRows; indexCount ) { $('.myOrderSettings [name="selectedColor' indexCount '"]').each(function() { if ($(this).prop("checked")) { if (selectedColor == "") { selectedColor = $(this).val(); } else { selectedColor = ',' $(this).val(); } } }); $('.myOrderSettings [name="selectedSize' indexCount '"]').each(function() { if ($(this).prop("checked")) { if (selectedSize == "") { selectedSize = $(this).val(); } else { selectedSize = ',' $(this).val(); } } }); $('.myOrderSettings [name="selectedQuantity' indexCount '"]').each(function() { if ($(this).val() lt; 1) { selectedQuantity = '1'; alertMe("Your order quantity has been set to 1", 5000); } if (parseInt($(this).val()) gt; parseInt($(this).attr('max'))) { selectedQuantity = $(this).attr('max'); alertMe("We have " $(this).attr('max') " of this product. Your order quantity has been set to " $(this).attr('max'), 5000); } else { selectedQuantity = $(this).val(); } }); productID = $('.myOrderSettings [name="productID' indexCount '"]').val(); $.ajax({ url: "lt;?php echo base_url() ?gt;cart/updateCart", type: "post", dataType: "json", async: false, data: { selectedColor: selectedColor, selectedSize: selectedSize, selectedQuantity: selectedQuantity, productID: productID }, success: function(data) { console.log(indexCount); $('.myOrderSettings .t-total' indexCount).html(formatMoney(parseInt(data.cart_amount))); } }); calculateTotalAmount(); selectedColor = ""; selectedSize = ""; selectedQuantity = ""; productID = ""; } });
Ответ №2:
Это происходит потому, что вы выполняете итерацию от 0 до cartRows
. Это должно быть от 0 до одного меньше, чем cartRows
.
.... for (indexCount = 0; indexCount lt; cartRows; indexCount ) { //Your code }
cartRows
хранение length
$('.cartRows')
. В Javascript .length
возвращает количество элементов, присутствующих в массиве. При повторении цикл for должен повторяться $('.cartRows').lenght
несколько раз.
Поскольку вы начинаете индекс с 0 до lt;= $('.cartRows').length
, ваш цикл for будет повторяться длиной 1 число раз (из-за lt;=
)