#javascript #jquery
#javascript #jquery
Вопрос:
У меня есть простой html-код с формой:
<span class="price"></span>
Enter amount:
<input type="text" class="form-control amount" name="amount" value="500">
<!--Next input fields are hidden by Bootstrap class "hide"-->
<input type="text" name="minimal-amount" class="hide minimal-amount" value="500">
<input type="text" name="oneprice" class="hide oneprice" value="0.20">
<script>
$(".amount").on("change", function(){
var am = $(".amount").val();
var min = $(".minimal-amount").val()
if(am<min){
$(".amount").val($(".minimal-amount").val());
}else{
var am = $(".amount").val();
var oneP = $(".oneprice").val();
var finalPrice = am*oneP;
$(".price").html(finalPrice);
}
});
</script>
Идея этого кода очень проста. Когда пользователь вводит amount
цифры в поле, мой скрипт должен проверить, если то, что пользователь вводит, меньше минимально доступного значения в minimal-amount
поле, скрипт изменяет значение amount
поля на значение по умолчанию minimal-amount
.
Но проблема в том, что идентификатор, который я просто добавляю 0
в amount
поле (и его значение становится 5000), все в порядке, но когда я меняю значение amount
поля на 1000, скрипт изменяет значение amount
поля на значение по умолчанию, как будто оно их уменьшает minimul-amount
.
Что я делаю не так, и как я могу исправить эту проблему?
P.S. Пример этого кода вы можете найти здесь — http://friendfi.me/tests/amount.php
Ответ №1:
Вы должны проанализировать значение перед использованием. Потому .val()
что вернет только строковый тип.
$(".amount").on("change", function(){
var am = parseFloat($(".amount").val());
var min = parseFloat($(".minimal-amount").val());
if(am<min){
$(".amount").val($(".minimal-amount").val());
}else{
var am = $(".amount").val();
var oneP = $(".oneprice").val();
var finalPrice = am*oneP;
$(".price").html(finalPrice);
}
});
Комментарии:
1. @Satpal извините, я вас не понял. можете ли вы объяснить?
2. Также вызов
$(".minimal-amount").val()
дважды кажется глупым, когда у вас уже есть значениеmin
.3. parseInt должен принимать исходное значение:
parseInt("1234", 10)
4. @Satpal нет. Нет ничего похожего на parseDouble. Я отредактировал ответ
5. @Ingmars, да
radix is an optional argument.
, но важно. Читать davidwalsh.name/parseint-radix
Ответ №2:
В этом коде много ошибок. Вот рабочий JSBin: http://jsbin.com/qilob/2/edit?html ,js, вывод
Основные моменты
Вам нужно инициализировать DOM, прежде чем вы сможете с ним работать. Обертывание этого в функции, переданной в jQuery, заставит его подождать, пока страница не завершит загрузку, прежде чем манипулировать ею.
$(function() { ... });
Используйте кэшированные значения, поскольку элементы не сильно изменятся.
Это избавляет от необходимости многократного анализа селекторов. Это также экономит
на наборе текста и удобочитаемости.
var $amount = $("#amount");
var $minimalAmount = $("#minimal-amount");
var $onePrice = $("#oneprice");
var $finalPrice = $("#price");
При синтаксическом анализе строки в Int вам нужно использовать parseInt
var amount = parseInt($amount.val(), 10);
И наоборот, при разборе строки с плавающей точкой вам нужно использовать parseFloat
var price = parseFloat($onePrice.val());
JavaScript не может хорошо обрабатывать арифметику с плавающей запятой.
ошибки округления — это плохо, особенно когда речь идет о деньгах, нам нужно
переместить десятичный знак, чтобы предотвратить ошибки округления в более значимых
частях значения цены.
var total = (amount * (price * 100)) / 100;
Посмотрите на это в действии в JSBin.