Возможно я уже глаз замылил - но косяк уже меня раздражает. В общем каждый раз, после внесения изменений - выбор количества пользователей, оплата сертификатом или, в данном случае, поиск купона который дает скидку в 20% или не дает скидку. У input установлен data-percent = "0" - ищем купон на сервере в ajax приходит ответ - установить data-percent="20" или нет, после этого вызываем функцию калькуляции которая собирает все данные по форме и пересчитывает. При первом открытии страницы - в поле купона ввожу номер от балды и получаю естественно data-percent = "0" - происходит калькуляция - все хорошо. Теперь ввожу верный номер купона - получаю data-percent = "20" - происходит калькуляция и все не хорошо потому, что откуда-то скрипт берет у data-percent - 0 и калькулирует. Точно такая же история наоборот - загрузил страницу - впервый раз ищу реальный купон - получаю data-percent = "20" и любой последующий за ним запрос - в DOM и стеке я вижу data-percent = "0" - но скрипт откуда-то уверенно берет 20 Прикреплю чуть кода и скрин из консоли где видно, что у атрибута стоит value 0 но в результате amount я вижу 20 это поиск купона Код (Javascript): this.applicationCouponSearch = function (form) { var coupon = $(form).find('input[name="use_coupon"]'); //Устанавливаем процент скидки в 0, пока не придет ответ из поиска $(coupon).attr('data-percent',0); var url = ls.routerUrl('admin') + 'gr_coupon_search/' + $(coupon).val(); var params = $(form).serializeArray(); ls.progressStart(); ls.ajax(url, params, function (response) { ls.progressDone(); if (!response) { ls.msg.error(null, 'System error #1001'); } else { ls.msg.notice(response.sMsgTitle, response.sMsg); $(coupon).attr('data-percent',response.percent); ls.applicationCalcPriceTotal(form); } }); }; Это калькуляция Код (Javascript): this.applicationCalcPriceTotal = function(form){ if(!form){ var form = $('.modal-body form'); } var price = $(form).find('select[name="time"] option:selected').data('price'); var team = $(form).find('select[name="team"]').val(); var payment_method_id = $(form).find('select[name="payment_method_id"] option:selected').val(); var discount = $(form).find('select[name="discount"] option:selected'); var result = price; //От команды отнимаем 6 чел и остаток умножаем на 5, для получения суммы за лишних людей if(team > 6){ var teamResult = (team-6) * 5; result = result + teamResult; } //Дополнительные условия скидок //если ид скидки равен ид купона - устанавливаем размер скидки исходя из data атрибута полученного из поиска по номеру купона if(discount = id_coupon_discount){ discount = $(form).find('input[name="use_coupon"]'); } var amount = $(discount).data('amount');//скидка в рублях var percent = $(discount).data('percent');//скидка в процентах //отсюда калькуляция if(amount){ result = price - amount; }else if(percent){ result = price - ((price / 100) * percent); } $(form).find('input[name="total_price"]').val(result) }
@rewuxiin, а ничего, что для установки значений вы используете метод .attr(), а для получения .data()? Код (Javascript): // Измените эту строку $(coupon).attr('data-percent',0); // на следующую $(coupon).data('percent',0); И в других местах, где похожая ситуация
хм. это настолько существенные вещи? т.е. если я создал атрибут через .attr то мне теперь только и работать с .attr?
@rewuxiin, нет, через attr() - нормально реагирует. Вот если-бы .prop() использовали - тогда да... .data() не читала бы это значение. Присмотритесь лучше к 23-й строке выложенного кода "калькуляции".
такс, я исправился - но по прежнему я вижу в стеке 20, а в $(discount).data('percent') - получаю 0 ;(( Код (Javascript): this.applicationCalcPriceTotal = function(form){ if(!form){ var form = $('.modal-body form'); } var price = $(form).find('select[name="time"] option:selected').data('price'); var team = $(form).find('select[name="team"]').val(); var payment_method_id = $(form).find('select[name="payment_method_id"] option:selected').val(); var discount = $(form).find('select[name="discount"]').val(); var result = price; //От команды отнимаем 6 чел и остаток умножаем на 5, для получения суммы за лишних людей if(team > 6){ var teamResult = (team-6) * 5; result = result + teamResult; } //Дополнительные условия скидок //если ид скидки равен ид купона - устанавливаем размер скидки исходя из data атрибута полученного //из поиска по номеру купона if(+discount === id_coupon_discount){ discount = $(form).find('input[name="use_coupon"]'); } var amount = $(discount).data('amount');//скидка в рублях var percent = $(discount).data('percent');//скидка в процентах //отсюда калькуляция if(amount){ result = price - amount; }else if(percent){ result = price - ((price / 100) * percent); } $(form).find('input[name="total_price"]').val(result) }
@rewuxiin, вероятно, нельзя выполнять калькуляцию до того, как отработает асинхронный ajax-запрос на процент по указанному купону.
Напишите в 21-й строке первого кода: console.log($(coupon).attr('data-percent'), response.percent); Что покажет консоль?
и там-же проверьте значение $(form).find('input[name="use_coupon"]').data('percent'); /или .attr('data-percent')/
а вот тут прикол: console.log($(form).find('input[name="use_coupon"]').data('percent')); - выдает 0 console.log($(form).find('input[name="use_coupon"]').attr('data-percent')); - выдает 20 это что-то из области магии наследия proto? которое я уже благополучно подзабыл. нужно опять идти на Learn.javascript
странно. если там data выставлена, то должно выдавать правильное число. мм а как оно устанавливается? через data или через attr?
Создаю его с помощью .attr, т.к. изначально этого атрибута не существует Код (Javascript): $(coupon).attr('data-percent',response.percent);
так я так и делал, но дело в том, что это не работает. у меня в DOM у <input name="use_coupon"> атрибут не создавался, потому я стал использовать .attr ни вот так $(coupon).attr('data-percent',response.percent); ни так $('input[name="use_coupon"]').data('percent',response.percent); data-percent - не создается (
не создавался - очень размытое понятие если сделать .data('ajaja', 42) и потом сразу .data('ajaja') то покажет 42?
хм. да, есть результат. но изменения в DOM нет. и как я полагаю - при следующей калькуляции js не обнаружит этот data?
я думаю, ты просто не видишь это изменение, но оно работает и можно на него полагаться. а как ты проверяешь, что изменение есть или нет в дом?
да, я уже это проверил - работает. я предполагал, что в инструментах вкладка Elements должна содержать все обновленные данные. по крайней мере обычное Html содержимое созданное с помощью Js - там отображается
ну на самом деле значение какого-то поля элемента из jquery и значение поля элемента из дом - это разные вещи. Jquery может его хранить где-то в другом месте, т.к. jquery может просто использовать элемент как ключ к обычному массиву в js, в котором уже содержатся значения, чтобы не тормозить при смене атрибутов. --- Добавлено --- т.е. юзай .data('string') чтобы прочесть и .data('string', value) чтобы установить и не парься