Задать вопрос
@Alexey1307

Как вывести результат «на лету»?

Пишу pet-проект - календарь бронирований! Сейчас если ввести даты заезда и выезда, количество номеров, и предоплату (необязательна для ввода), по нажатию кнопки "Рассчитать" - выведется сумма к оплате. Вопрос в следующем: можно ли сделать вывод "суммы к оплате" на лету, то есть чтоб не было необходимости в нажатии кнопки?
Код на codepen
  • Вопрос задан
  • 93 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Вместо click'а у кнопки обрабатывайте input у формы:

- document.querySelector('.calculate').addEventListener('click', function () {
+ document.querySelector('form').addEventListener('input', function () {

UPD. Сам обработчик - как-то не круто всё выглядит:

let select = document.querySelector('select').selectedIndex;
let selectValue = select + 1; // selectedIndex считается с 0, поэтому +1

Зачем индекс? У option'ов указаны value, так что можно смотреть значение select'а.

let dateStart = document.querySelector('.start_date').value;
let dateEnd = document.querySelector('.end_date').value;

Ради получения значений нет необходимости искать элементы - ссылки на них есть в свойстве elements формы, в качестве ключа выступают значения атрибутов id и name. Также можно создать FormData, и доставать нужное уже оттуда.

let out_3 = document.querySelector('.out_3');

Аналогично - искать элемент не надо, ссылка на output внутри него есть в elements формы.

for (let i = dateStart; i <= dateEnd; i = i + 24 * 60 * 60 * 1000) {

Цикл не нужен. Вычитаем одну дату из другой, делим на количество миллисекунд в дне, получаем таким образом количество дней.

Исправляем:

document.querySelector('form').addEventListener('input', function() {
  const { elements } = this;
  const data = new FormData(this);
  const keys = [ 'enterDate', 'outDate', 'countRooms', 'prepayment' ];

  const basePayment = 2000;
  const [ enter, out, rooms, prepayment ] = keys.map(k => data.get(k) /* или elements[k].value */);
  const days = enter && out && enter < out
    ? (new Date(out) - new Date(enter)) / (24 * 60 * 60 * 1000)
    : 0;

  elements.payment.textContent = `${basePayment * days * rooms - prepayment} р`;
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы