Javascript для индекса цикла, начинающегося с максимального числа

#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;= )