Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Активные темы » Нужна помощь доработать скрипт пересчета цены от количества

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Ron2323



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите если кто сможет, мне нужно доработать jquery скрипт пересчета цены от количества товара на странице сайта. Он работает в теме с товаром, мне нравится что сразу показывает пересчет без задержки обработки, но нужно что бы скрипт производил одновременно два вычисления после одного нажатия на кнопку. Я пробовал очень много вариантов корректировки скрипта, но он всё равно считает или одну или другую позицию, но никак не две одновременно. Что в коде может быть неправильно?
Вот сам код:
 
<span id="price_here">5500</span><span hidden="hidden" id="price_here">5500</span><span id="sum_here1"></span>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
 
<script>
function qminus(el, min) {
var e = $(el);
var compare = parseInt(e.val());
var i = ((compare - 1) < min) ? min : compare - 1;
e.val(i);
show_price($('#sum_here1'), $('#price_here1'), i);
}
function qplus(el, max) {
var e = $(el);
var compare = parseInt(e.val());
var i = ((compare + 1) > max) ? max : compare + 1;
e.val(i);
show_price($('#sum_here1'), $('#price_here1'), i);
}
function check_qty(el, min, max) {
var compare = parseInt(el.val());
if (compare < min) {
el.val(min);
alert(min + ' is minimal qty');
}
if (compare > max) {
el.val(max);
alert(max + ' is maximum qty');
}
show_price($('#sum_here1'), $('#price_here1'), el.val());
}
function show_price(el, pr, ch) {
var sum = pr.html() * ch;
el.html(sum);
}
</script>  
<script>  
function qminus(el, min) {
var e = $(el);
var compare = parseInt(e.val());
var i = ((compare - 1) < min) ? min : compare - 1;
e.val(i);
show_price($('#sum_here'), $('#price_here'), i);
}
function qplus(el, max) {
var e = $(el);
var compare = parseInt(e.val());
var i = ((compare + 1) > max) ? max : compare + 1;
e.val(i);
show_price($('#sum_here'), $('#price_here'), i);
}
function check_qty(el, min, max) {
var compare = parseInt(el.val());
if (compare < min) {
el.val(min);
alert(min + ' is minimal qty');
}
if (compare > max) {
el.val(max);
alert(max + ' is maximum qty');
}
show_price($('#sum_here'), $('#price_here'), el.val());
}
function show_price(el, pr, ch) {
var sum = pr.html() * ch;
el.html(sum);
}
</script>
<button onclick="qminus('#qty');" class="SyncButton" id="minus">
<i class="ones"> Кол-во</i>
</button>
<input type="number" value="1" style="width:30px" onchange="check_qty($(this),1,100);" name="qty" class="brudlo" id="qty" value="<? echo $qty ?>" />&#9654;
<button onclick="qplus('#qty');" id="plus"><i class="dvas">Цена монтажа</i>
</button>&nbsp;<span id="sum_here"></span>

Всего записей: 46 | Зарегистр. 01-05-2017 | Отправлено: 23:26 05-02-2024 | Исправлено: Ron2323, 11:31 06-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ron2323

Цитата:
два вычисления после одного нажатия на кнопку

расшифруйте.
 
вызывайте обе функции при нажатии

Код:
<button onclick="qplus('#qty');qminus('#qty');" id="plus">

Всего записей: 15150 | Зарегистр. 20-09-2014 | Отправлено: 00:52 06-02-2024 | Исправлено: Mavrikii, 00:56 06-02-2024
Ron2323



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо за подсказку, но я наверно не совсем правильно описал суть проблемы. Мне необходимо что бы два вычисления в ('#price_here') и ('#price_here1') обрабатывал скрипт одновременно и выводил результаты вычислений на странице в<span id="sum_here"></span> и соответственно в <span id="sum_here1"></span>, а скрипт производит вычисления только или в одном или в другом id. Что может быть скрытой проблемой?

Всего записей: 46 | Зарегистр. 01-05-2017 | Отправлено: 11:01 06-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ron2323
ну, для начала - каждый id должен быть уникальным на странице.
у вас два с price_here
 
второе - прописывать вручную каждый id вы запаритесь, особенно если форма динамическая и количество элементов может быть произвольным.
 
у вас там два раза описана одна функция qminus - это неправильно вообще.
 
я пока не понимаю чего именно вы пытаетесь добиться - простым языком объяснить можете? какой результат должен быть в каждой sum_here и price_here?

Всего записей: 15150 | Зарегистр. 20-09-2014 | Отправлено: 11:21 06-02-2024
Ron2323



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нет они не одинаковые, один id  #price_here а второй id  #price_here1, просто вы цифру один не заметили, а результат должен быть в каждой sum_here и price_here1 должен быть разным, т.к. можно менять результат конечного вычисления каждого id в операторе el.html(sum);

Всего записей: 46 | Зарегистр. 01-05-2017 | Отправлено: 11:42 06-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ron2323

Цитата:
Нет они не одинаковые, один id  #price_here а второй id  #price_here

я сказал об этом

Цитата:
<span id="price_here">5500</span><span hidden="hidden" id="price_here">5500</span><

 

Цитата:
а результат должен быть в каждой sum_here и price_here1 должен быть разным, т.к. можно менять результат конечного вычисления каждого id в операторе el.html(sum);

хорошо.. но лучше не возиться с отдельными id для каждой пары, ведь их может быть любое количество.
сделаем так, пусть будет общий родитель с определенным классом и обойдемся без id (необязательно div, нужно как то подчеркнуть, что это одна пара.
 
<div class='price-group'>
<span class='price-here'>5500</span><span class='sum-here'></span>
</div>
тогда

Код:
<script>  
function qminus(el, min) {
var e = $(el);
var compare = parseInt(e.val());
var i = ((compare - 1) < min) ? min : compare - 1;
e.val(i);
show_price(i);
}
function qplus(el, max) {
var e = $(el);
var compare = parseInt(e.val());
var i = ((compare + 1) > max) ? max : compare + 1;
e.val(i);
show_price(i);
}
function check_qty(el, min, max) {
var compare = parseInt(el.val());
if (compare < min) {
el.val(min);
alert(min + ' is minimal qty');
}
if (compare > max) {
el.val(max);
alert(max + ' is maximum qty');
}
show_price(el.val());
}
function show_price(ch) {
    $('.price-group').each(function() {
        $('.sum-here', this).text(
            $('.price-here', this).text() * ch
        );
    });
}
</script>

не проверял, просто навскидку

Всего записей: 15150 | Зарегистр. 20-09-2014 | Отправлено: 11:54 06-02-2024 | Исправлено: Mavrikii, 12:11 06-02-2024
Ron2323



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо вам за помощь, но я окончательно запутался, ваша версия скрипта так же делает вычисления только в по одному значению, но не по двум одновременно, вот поэтому я и пытался результаты разнести по разным id, а один из исходных данных, которые скрипт берет для вычисления, я поместил в span hidden="hidden" (<span id="price_here">5500</span><span hidden="hidden" id="price_here">5500</span><span id="sum_here1"></span>), что бы скрипт выводил второй результат вычислений в span id="sum_here1".
Да забыл написать в своем вопросе на форуме ссылку на библиотеку jquery, что бы можно было проверять работоспособность скрипта:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Всего записей: 46 | Зарегистр. 01-05-2017 | Отправлено: 12:27 06-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ron2323

Цитата:
<span id="price_here">5500</span><span hidden="hidden" id="price_here">5500</span>

я вам сказал, нельзя использовать два элемента с одинаковым id
 

Цитата:
ваша версия скрипта так же делает вычисления только в по одному значению, но не по двум одновременно,

подробно опишите все, без указания элементов. какие данные есть, какие операции хотите совершить, какой нужен результат. без привязки к id и остальному.

Всего записей: 15150 | Зарегистр. 20-09-2014 | Отправлено: 01:15 07-02-2024
Ron2323



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В принципе скрипт должен выполнять простую (но двойную) операцию. В поле отображения (как в вашей версии скрипта <span class='price-here'>5500</span>) есть определённое любое число, скрипт должен брать это число (допустим 5500), как исходное для вычислений, и в зависимости от выбираемого количества товара 1,2,3,4 и далее... (при нажатии на кнопку <button onclick="qplus('#qty');">) увеличивать это число просто прибавлением на 5500 (как в данном примере) и изменять его значение сразу в <span id="sum_here1">на 11000</span> и так далее + 5500 при каждом нажатии на кнопку, но при этом в другом <span id="sum_here"></span> где уже присвоен другой id (id="sum_here" когда вы не заметили что они разные id="sum_here1") должна вычисляться сумма скидки товара, путем умножения числа 11000, потом 22000.. м так далее на коэффициент 0,15 и то же самое происходить при каждом нажатии <button onclick="qplus('#qty');">. При этом эти оба результата вычислений должны выводится одновременно, вот в принципе что требуется достичь, но у меня ни как это не получается.

Всего записей: 46 | Зарегистр. 01-05-2017 | Отправлено: 11:03 07-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ron2323

Цитата:
id="sum_here" когда вы не заметили что они разные id="sum_here1"

я все заметил, это вы не поняли о чем я, хоть и цитировал кусок кода.  
 
вот так и нужно, подробно, чтобы можно было написать и код удобно. потому что, изначально, можно подумать, что у вас много строк товаров и для кождой строки нужно делать вычисления по кнопке, а не просто один тип товара, его количество и расчет скидки.
 
если полей строко ограниченное количество, не предвидится неопределенное количество новых, то можно использовать и id
 
https://jsfiddle.net/f56Legwt/

Код:
<span id='price'>5500</span>&nbsp;<span id='sum'></span>  
<button type='button' class='SyncButton' id='minus'>
<i class='ones'> Кол-во</i>
</button>
<input type='number' value='1' min='1' max='100' style='width:50px' name='qty' class='brudlo' id='qty'/>&#9654;
<button type='button' id='plus'><i class='dvas'>Цена монтажа</i>
</button>&nbsp;
<span id='discount'></span>

 

Код:
$(function() {
    var qty = $('#qty');
    qty.on('change', function() {
       var val = +qty.val(), mn = qty.attr('min'), mx = qty.attr('max');
       if (val < mn) {
           qrt.val(mn);
           alert(mn + ' is the minimum');
       } else if (val > mx) {
           qty.val(mx);
           alert(mx + ' is the maximum')
       }
       
       // update prices
       var sum = $('#price').text() * qty.val();
       $('#sum').text(sum);
       $('#discount').text(sum * 0.15);
    }).trigger('change');
    $('#minus').on('click', function() {
       qty.val(+qty.val() - 1).trigger('change');
    });
    $('#plus').on('click', function() {
       qty.val(+qty.val() + 1).trigger('change');
    });
});

 
0.15 прописано вручную, но можно так же задать как атрибует элемента #qty или какого иного.
удобнее же код читается и понимается?
 
для сокращения обращений к qty ввел переменную, +перед чем либо - перевод из строки в число.

Всего записей: 15150 | Зарегистр. 20-09-2014 | Отправлено: 01:30 08-02-2024 | Исправлено: Mavrikii, 10:09 08-02-2024
Ron2323



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте.  
Спасибо, что смогли попробовать подработать скрипт, но тоже этот вариант не так функционален как требуется. Вот у меня уже есть рабочий вариант этого скрипта (под требуемый расчёт), только я не могу никак устранить пару багов,  
1. Первый баг, что когда нажимаешь кнопку <button onclick="qplus('#qty'); qplus1('#qty');"><i>Цена монтажа</i></button> то скрипт в счётчике  количества (вычислений) сразу перескакивает с цифры 1 на 3, потом на 5 и т.д через две позиции при каждом нажатии "Цена монтажа", но при этом считает суммы правильно.  
2. Второй баг, заключается в том, что когда, сначала нажмёшь кнопку "Цена монтажа" (сумма считается), а потом когда нажимаешь на кнопку "Кол-во" (которая имеет функцию "назад", и должна уменьшать обратно сумму вычислений) <button onclick="qminus('#qty'); qminus1('#qty');" id="minus"><i> Кол-во</i></button> то скрипт не уменьшает сумму на 5500, а наоборот единоразово её увеличивает на 5500, но при этом в поле суммы "Цена монтажа" всё остается без изменений.  
Помогите пожалуйста разобраться с данными проблемами.
Вот код  этого скрипта:
 
<span id="price_here" hidden="hidden">5500</span><span id="sum_here">5500</span>
<button onclick="qminus('#qty'); qminus1('#qty');" id="minus"><i> Кол-во</i></button>
<input type="number" value="1" style="width:30px" onchange="check_qty($(this),1,100);" name="qty" id="qty" value="<? echo $qty ?>" /><button onclick="qplus('#qty'); qplus1('#qty');"><i>Цена монтажа</i></button>
<span id="sum_here1"></span>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
function qminus1(el, min) {
    var e = $(el);
    var compare = parseInt(e.val());
    var i = ((compare - 1) < min) ? min : compare - 0;
    e.val(i);
    show_price1($('#sum_here1'), $('#price_here'), i);
}
 
function qplus1(el, max) {
    var e = $(el);
    var compare = parseInt(e.val());
    var i = ((compare + 1) > max) ? max : compare + 1;
    e.val(i);
    show_price1($('#sum_here1'), $('#price_here'), i);
}
 
function check_qty1(el, min, max) {
    var compare = parseInt(el.val());
    if (compare < min) {
        el.val(min);
        alert(min + ' is minimal qty');
    }
    if (compare > max) {
        el.val(max);
        alert(max + ' is maximum qty');
    }
    show_price1($('#sum_here1'), $('#price_here'), el.val());
 
}
 
function show_price1(el, pr, ch) {
    var sum = pr.html() * ch;
    el.html(sum*0.02);
}
 
</script>
<script>
function qminus(el, min) {
    var e = $(el);
    var compare = parseInt(e.val());
    var i = ((compare - 1) < min) ? min : compare - 0;
    e.val(i);
    show_price($('#sum_here'), $('#price_here'), i);
}
 
function qplus(el, max) {
    var e = $(el);
    var compare = parseInt(e.val());
    var i = ((compare + 1) > max) ? max : compare + 1;
    e.val(i);
    show_price($('#sum_here'), $('#price_here'), i);
}
 
 
function show_price(el, pr, ch) {
    var sum = pr.html() * ch;
    el.html(sum);
}
</script>

Всего записей: 46 | Зарегистр. 01-05-2017 | Отправлено: 13:43 08-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ron2323

Цитата:
но тоже этот вариант не так функционален как требуется.

это чем же? я написал, как раз, так, как нужно. без вызова javascript в свойствах тега.
 

Цитата:
Первый баг, что когда нажимаешь кнопку <button onclick="qplus('#qty'); qplus1('#qty');"><i>Цена монтажа</i></button> то скрипт в счётчике  количества (вычислений) сразу перескакивает с цифры 1 на 3, потом на 5 и т.д через две позиции при каждом нажатии "Цена монтажа", но при этом считает суммы правильно.

потому что вы два раза увеличиваете счетчик в каждой функции.
 

Цитата:
Помогите пожалуйста разобраться с данными проблемами.
 

я написал код, лучше, правильнее, удобнее, читаемее.
 

Код:
function show_price(ch) {
    var sum = $('#sum_here1').html() * ch;
    $('#price_here').html(sum);
    $('#sum_here').html(sum*0.02);
}

и все, вам просто в функции обновления цен нужно сразу считать скидку и ее отображать.
так как передаются одни и те же элементы, то не нужно лишнего указывать в аргументах функции.
везде вызов show_price заменить, оставив последний аргумент.
 

Код:
<button onclick="qplus('#qty')">

здесь не нужен второй вызов, я написал так ранее только потому, что из вашего объяснения не было понятно чего хотите добиться
 
используйте мой код, он работает так, как нужно. если "не хватает функциональности", я ее добавлю.
тот способ, которым пытаетесь вы, устарел много много лет назад.

Всего записей: 15150 | Зарегистр. 20-09-2014 | Отправлено: 20:56 08-02-2024 | Исправлено: Mavrikii, 21:07 08-02-2024
Ron2323



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте.
Хорошо, извините пожалуйста, что я не сразу понял, то что вы мне ранее посоветовали, и что что в <button onclick="qplus('#qty'); qplus1('#qty');"> в два раза увеличивается счетчик срабатывания в каждой функции. Я поработаю с вашим скриптом, что бы его внедрить в сайт, т.к. он более удобный и компактный, для размещения на сайте. Еще раз спасибо вам за помощь. Желаю Вам всего самого наилучшего, удачи во всем и всех благ!

Всего записей: 46 | Зарегистр. 01-05-2017 | Отправлено: 21:14 08-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ron2323
ваш вариант
https://jsfiddle.net/96naudrt/1/
тут только поменяйте где какой id, как вам точно нужно
называть их нужно так, чтобы было однозначно понятно что к чему относится

Код:
function show_price(ch) {
    var sum = $('#price_here').html() * ch;
    $('#sum_here').html(sum);
    $('#sum_here1').html(sum * 0.02);
}

Всего записей: 15150 | Зарегистр. 20-09-2014 | Отправлено: 21:21 08-02-2024
Ron2323



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте.
Выражаю вам ещё раз большую благодарность, за содействие в доработке скрипта. Всё заработало просто превосходно! Я хотел попробовать внести в скрипт такую особенность, как вычитание суммы которая вычисляется в поле <span id="sum_here">5500</span> чтобы постоянно отнималась сумма из поля "Цена монтажа" <span id="sum_here1"></span> (они динамически меняются при каждом нажатии кнопки <button onclick="qplus('#qty',100)">). Хотел попробовать реализовать это простым: $('#sum_here').html(sum * 0.98);
$('#sum_here1').html(sum * 0.02);
всё работает как требуется, только когда после любых вычислений возвращаешься назад (при нажатии на "Кол-во") до цифры количества 1, то скрипт показывает цифру в поле <span id="sum_here">5500</span> не 5500, а уже 5390. В принципе это не критично, но если есть изящный способ этот баг устранить, то может подскажите как?
 
И еще хотел бы еще раз у вас посоветоваться, может вы знаете, какое можно прописать регулярное выражение в редакторах Notepad++ или Sublime, что бы умножать на определённый коэффициент числовые значения (цифры без запятых, дробей и т.п., просто обычные цифры) находящиеся в большом количестве html страниц например 5500 между тегами как в том же <span id="price_here" hidden="hidden">5500</span>. Я читал, что в Notepad++ массово изменять цифровые значения не так то просто, может в Sublime, это можно проще сделать (без особых сложностей) т.к. про работу в Sublime в интернете очень мало информации. Еще раз спасибо, что с скриптом помогли мне.

Всего записей: 46 | Зарегистр. 01-05-2017 | Отправлено: 10:04 09-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ron2323

Цитата:
т.к. про работу в Sublime в интернете очень мало информации.

спросить нужно в теме об этой программе. вообще регулярки работают с текстом, без мат вычислений.
Sublime Text
 

Цитата:
до цифры количества 1, то скрипт показывает цифру в поле <span id="sum_here">5500</span> не 5500, а уже 5390

так и должно же быть. 5500 - скидка.
сами написали

Цитата:
чтобы постоянно отнималась сумма из поля


Всего записей: 15150 | Зарегистр. 20-09-2014 | Отправлено: 10:14 09-02-2024
Ron2323



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да всё правильно вы написали, "так и должно же быть. 5500 - скидка. сами написали". Но только после нажатий на<button> и возвращения назад до цифры количества 1, скрипт показывает цифру в поле <span id="sum_here">5500</span> 5390, всё это справедливо для любых вычислений скидки от основной стоимости товара 5500 на количество товара больше или равно 2, но на количество товара в единичном экземпляре, скидок быть не должно. А скрипт изначально (после загрузки hrml страницы и скрипта соответственно) показывает что основная сумма 5500, а скидка 0, но после нажатий, возвращаешься на 1 и сумма уже 5390.

Всего записей: 46 | Зарегистр. 01-05-2017 | Отправлено: 12:51 09-02-2024
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ron2323

Цитата:
всё это справедливо для любых вычислений скидки от основной стоимости товара 5500 на количество товара больше или равно 2, но на количество товара в единичном экземпляре, скидок быть не должно.

ну так нет же телепатов, елки палки. вы, когда спрашиваете нечто подобное, формилируйте все и полностью.
 

Цитата:
показывает что основная сумма 5500

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

Код:
function show_price(ch) {
    var sum = $('#price_here').html() * ch,
          coeff = +ch > 1 ? 0.02 : 0;
    $('#sum_here').html(sum * (1 - coeff));
    $('#sum_here1').html(sum * coeff);
}

Всего записей: 15150 | Зарегистр. 20-09-2014 | Отправлено: 20:41 09-02-2024
Ron2323



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Еще раз хочу сказать большое спасибо Вам Mavrikii, вот тереть скрипт заработал идеально так как требуется. Если на этом форуме можно как ни будь поставить Вам оценку (то напишите только как это сделать), и я с радостью поставлю Вам самую наивысшую!

Всего записей: 46 | Зарегистр. 01-05-2017 | Отправлено: 23:13 09-02-2024
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » Активные темы » Нужна помощь доработать скрипт пересчета цены от количества


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru