Нужна помощь по jquery

Davahkiin

Постоялец
Регистрация
20 Мар 2014
Сообщения
90
Реакции
4
Есть таблица с товаром, в ней поле с radio кнопками, в зависимости от выбранной отображает нужную стоимость доставки и считает общую сумму. Но если товаров несколько то скрипт не работает, поскольку совпадают названия radio button и переменной куда выводиться сумма. Можно как то в jquery сделать что бы скрипт отдельно работал к примеру для каждой новой строки таблицы?
Код:
$('input[name="quantity"],input[name="delivery"]').change(function() {
        var col_price_delivery = $('.col-price-delivery');
        $(document).find('.col-total').each(function() {
            var q1 = $(this).prev().prev().prev().prev().prev().prev().find('input[name="q1"]').val();
            q1 = q1.replace(/[^0-9\.]/g, '');
            var q10 = $(this).prev().prev().prev().prev().prev().prev().find('input[name="q10"]').val();
            var q100 = $(this).prev().prev().prev().prev().prev().prev().find('input[name="q100"]').val();
            var quantity = $(this).prev().prev().prev().prev().prev().find('input[name="quantity"]').val();
            var checked_option_radio = $('input:radio[name=delivery]:checked').val();
                        if (checked_option_radio==1)
                    {
                        delivery_price = 0;               
                    } else if(checked_option_radio==2) {
                        delivery_price = 0;
                    }
                    else if(checked_option_radio==3) {
                        if (quantity >= 100){
                            delivery_price = $('input:[name=d100]').val();
                                } else if (quantity >= 10) {
                            delivery_price = $('input:[name=d10]').val();
                                } else if (quantity >= 1) {
                            delivery_price = $('input:[name=d1]').val();
                                }  
                       delivery_price = parseInt(delivery_price.replace(/[^0-9\.]/g, ''), 10);
                    } else if(checked_option_radio==4) {
                        if (quantity >= 100){
                            delivery_price = $('input:[name=d100-low]').val();
                                } else if (quantity >= 10) {
                            delivery_price = $('input:[name=d10-low]').val();
                                } else if (quantity >= 1) {
                            delivery_price = $('input:[name=d1-low]').val();
                                }
                        delivery_price = parseInt(delivery_price.replace(/[^0-9\.]/g, ''), 10);
                     
                    }
            var sum = '';
            var currency_l = '<?php echo $symbol_left; ?>';
            var currency_r = '<?php echo $symbol_right; ?>';
            if (q10 && q100) {
                q10 = q10.replace(/[^0-9\.]/g, '');

                q100 = q100.replace(/[^0-9\.]/g, '');
                if (quantity < 10) {
                    sum = q1 * quantity + delivery_price;
                } else if (quantity >= 100) {
                    sum = q100 * quantity + delivery_price;
                } else if (quantity >= 10) {
                    sum = q10 * quantity + delivery_price;
                }
        } else {
            sum = q1 * quantity;
        }
        if (currency_l) {
                $(this).text(currency_l + sum);
            } else {
                $(this).text(sum + currency_r);
            }
         });
$(document).find('.col-total-delivery-row').each(function() {
            var currency_l = '<?php echo $symbol_left; ?>';
            var currency_r = '<?php echo $symbol_right; ?>';
            if (currency_l) {
                            $(this).text(currency_l + delivery_price);
                        } else {
                            $(this).text(delivery_price + currency_r);
                        }
});
$(document).find('input[name=delivery_price]').each(function() {
    $(this).val(delivery_price);
});

    });
 
а есть возможность влиять на html? а то сооружать такие горы на jquery, луше уже ближайший контейнер нагенерить с именем + индекс
 
да возможность менять html есть, как понять ближайший контейнер нагенерить с именем + индекс?
 
да возможность менять html есть, как понять ближайший контейнер нагенерить с именем + индекс?
подход такой, самое правильное и быстрое это генерация необходимых id для элементов которые участвуют в калькуляции по алгоритму:
<input type='radio' name='shipping_name_1' id='shipping_id_1' class='shipping_radio shipping_radio_1'>
<input type='radio' name='shipping_name_2' id='shipping_id_2' class='shipping_radio shipping_radio_2'>
....
<input type='radio' name='shipping_name_n' id='shipping_id_n' class='shipping_radio shipping_radio_n'>

обвернуть в <div id='shipping_container' class='shipping_container shipping_container_1'>
тогда очень быстро и с минимум кода jquery можна найти и выбрать либо элемент лиюо масив элементов непосредственно для калькуляции
 
Может нужно давать новый ID или 'name' каждому радио кнопке по этому принципу?
Для просмотра ссылки Войди или Зарегистрируйся
name нельзя (он при запросе на сервер имеет важную роль), а id вполне, даже можно использовать аттрибут типа так
<input type='radio' name='xxx' id='yyy' shipping='какото там знаковый признак'>
и по тому аттрибуту можно выбрать, а вообще способ с аттрибутом вообще супер универсальный - можно запихнуть что угодно и кому угодно. оно будет иметь значение на клиенте, и абсолютно никакого для сервера.
 
name нельзя (он при запросе на сервер имеет важную роль), а id вполне, даже можно использовать аттрибут типа так
<input type='radio' name='xxx' id='yyy' shipping='какото там знаковый признак'>
и по тому аттрибуту можно выбрать, а вообще способ с аттрибутом вообще супер универсальный - можно запихнуть что угодно и кому угодно. оно будет иметь значение на клиенте, и абсолютно никакого для сервера.
спасибо немного помогло, изменил немного выборку по radio button
Код:
var checked_option_radio = $(this).prev().prev().find(".col-price-delivery input[type='radio']:checked").val();
, теперь находит выбранный radio в каждом td таблицы, но все равно при нескольких товарах сбивается калькулятор( переменные sum и delivery_price берет общие, их нельзя сделать как то уникальными для каждой строки таблицы?.
 
вам лучше вынести калькуляцию по продукту в отдельную функцию, а в итерации пробегать по продуктах и вызывать калькуляцию по продукту, потом всё сохранять в переменную, так вы код немного упростите
 
Последнее редактирование:
Назад
Сверху