У меня есть форма с двумя элементами выбора, где пользователи могут выбрать вариант продукта (например, красную, зеленую, синюю рубашку) и количество.
При изменении варианта/количества я делаю AJAX-запрос, чтобы получить цену.
Сложность в том, что каждый вариант имеет свою цену и свое количество. Например, красные рубашки стоят 10 долларов США и минимальное количество 5 (10, 15…). Зеленые рубашки стоят 15 долларов, но их количество начинается с 3 (6, 9…).
(Цвет/рубашка просто пример, реальные продукты - это блоки управления уличными фонарями :-)
Проблема в том, что когда по умолчанию установлены «красный» и «5», а я меняю на «зеленый», цена показывает 75 долларов США (запрос AJAX был зеленым + 5). Но зеленый имеет только количество 3, 6, 9 и т. д.
Я мог бы вернуть минимальное количество из моего запроса AJAX, но тогда пользователь не может обновить цену при изменении выбора количества.
Единственное решение, которое я вижу, это две функции doSubmit() и две функции submitAjax(). Но это означало бы, что у меня много повторяющегося кода.
HTML
<form action = "" id = "product_selection">
<select name = "product_variation">
<option value = "r">Red</option>
<option value = "g">Green</option>
<option value = "b">Blue</option>
</select>
<select name = "product_quantity">
<option value = "">10</option>
<option value = "">20</option>
<option value = "">30</option>
</select>
</form>
JavaScript
// Product variation, quantity select dropdown
var product_selection = document.querySelector('#product_selection');
var product_variation = document.querySelector('#product_variation');
var product_quantity = document.querySelector('#product_quantity');
// Event listener to submit the form on change
product_selection.addEventListener('submit', submitAjax);
product_variation.addEventListener('change', doSubmit);
product_quantity.addEventListener('change', doSubmit);
// Submit form
function doSubmit(event) {
product_selection.dispatchEvent(new Event('submit')); // product_selection.submit();
}
// Handle ajax submit
function submitAjax(event) {
// Stop default form submit
event.preventDefault();
// Ajax request
$.ajax({
url: '/static/public/ajax/get_product_data.php',
type: 'POST',
data: $('#product_selection').serialize(),
success: function(result) {
if (result == 0) {
alert('Sorry');
} else {
setProductData(result);
}
},
error: function(jqxhr, status, exception) {
alert('Sorry');
}
})
}
// Update product details
function setProductData(result) {
$('#product_price').html(result.price_gross);
// Remove current quantity options
var product_quantity = document.getElementById("product_quantity");
for(i = product_quantity.options.length - 1 ; i >= 0 ; i--) {
product_quantity.remove(i);
}
// … reapply new quantity options
var c = 0;
for (var i = result.minimum; i <= result.maximum; i+=result.graduation) {
product_quantity.options[c] = new Option(i + ' ' + pwjs.product.unit, i);
if (result.product_quantity == i) {
var setselectedIndex = c;
}
c++;
}
// product_quantity.selectedIndex = setselectedIndex;
}






Я думаю, вы хотели бы сделать это поэтапно, так что product_variation.addEventListener('change', doSomethingElse);
тогда ваш выбор будет примерно таким:
<select name = "product_variation">
<option data-increment = "5" value = "r">Red</option>
<option value = "g">Green</option>
<option data-increment = "3" value = "b">Blue</option>
</select>
затем, когда product_variation изменится, doSomethingElse перестроит product_quantity выбор, чтобы принять increment значение выбранного product_variation
Насколько я вижу, вы используете jQuery. Итак, я приведу вам пример того, как вы можете этого добиться.
Прежде всего, не забудьте указать значения для ваших параметров выбора, ваши значения для product_quantity были пустыми. Кроме того, я бы порекомендовал вам создать дополнительный тег параметра, который будет выбран по умолчанию, и вы сможете проверить свою форму позже.
<form action = "" id = "product_selection" name = "product_selection">
<select name = "product_variation">
<option value = "">Select color</option>
<option value = "r">Red</option>
<option value = "g">Green</option>
<option value = "b">Blue</option>
</select>
<select name = "product_quantity">
<option value = "">Select quantity</option>
<option value = "10">10</option>
<option value = "20">20</option>
<option value = "30">30</option>
</select>
</form>
Что касается JavaScript, я рекомендую вам добавить прослушиватель событий для вашего последнего ввода, то есть product_quantity.
$("#product_selection").submit(function(e){
e.preventDefault();
var inputs = document.product_selection;
if ( inputs.product_variation.value != "" && inputs.product_quantity.value != "" ){
$.ajax({
url: '/static/public/ajax/get_product_data.php',
type: 'POST',
data: $('#product_selection').serialize(),
success: function(result) {
if (result == 0) {
alert('Sorry');
} else {
setProductData(result);
}
},
error: function(jqxhr, status, exception) {
alert('Sorry');
}
});
}
});