Сложное обновление AJAX с двумя элементами select

У меня есть форма с двумя элементами выбора, где пользователи могут выбрать вариант продукта (например, красную, зеленую, синюю рубашку) и количество.

При изменении варианта/количества я делаю 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;
}
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
114
2

Ответы 2

Я думаю, вы хотели бы сделать это поэтапно, так что 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. Итак, я приведу вам пример того, как вы можете этого добиться.

HTML

Прежде всего, не забудьте указать значения для ваших параметров выбора, ваши значения для 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

Что касается 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');
        }
      });
   }
});

Другие вопросы по теме