@Sadko_MVS

Вернуть программу в исходное состояние методом reset?

Есть такой вот "калькулятор"
Стоит задача при клике на кнопку "сбросить" вернуть все в исходное состояние.
Перелопатил массу инфы, как "обнулить" поля ввода когда они "завернуты" в форму нашел, но как вернуть все в исходное состояние не могу сообразить.
исходный код - https://codepen.io/vadim-sadkowskij/pen/YzzMMBj
Прошу сильно не судить, поскольку только осваиваю JS))
  • Вопрос задан
  • 807 просмотров
Решения вопроса 2
like-a-boss
@like-a-boss
Признайся,тебяТянетНаКодМужика,ты—программный гей
.reset() сбрасывает форму, поскольку у вас не форма, то незачем и пытаться его прикрутить.
Отметил + изменения. Я не стал их впихивать в метод, сами воткнёте куда надо.

'use strict';
let start = document.getElementById('start'), 
    cancel = document.getElementById('cancel'),
    btnPlus = document.getElementsByTagName('button'), 
    incomePlus = btnPlus[0],
    expensesPlus = btnPlus[1], 
    depositCheck = document.querySelector('#deposit-check'), 
    additionalIncomeItem = document.querySelectorAll('.additional_income-item'), 
    budgetDayValue = document.getElementsByClassName('budget_day-value')[0],
    budgetMonthValue = document.getElementsByClassName('budget_month-value')[0],
    expensesMonthValue = document.getElementsByClassName('expenses_month-value')[0],
    accumulatedMonthValue = document.getElementsByClassName('accumulated_month-value')[0],
    additionalIncomeValue = document.getElementsByClassName('additional_income-value')[0],
    additionalExpensesValue = document.getElementsByClassName('additional_expenses-value')[0],
    incomePeriodValue = document.getElementsByClassName('income_period-value')[0],
    targetMonthValue = document.getElementsByClassName('target_month-value')[0],
    salaryAmount = document.querySelector('.salary-amount'),
    incomeTitle = document.querySelector('.income-title'),
    expensesTitle = document.querySelector('.expenses-title'),
    expensesItems = document.querySelectorAll('.expenses-items'),
    additionalExpenses = document.querySelector('.additional_expenses'),
    additionalExpensesItem = document.querySelector('.additional_expenses-item'),
    periodSelect = document.querySelector('.period-select'),
    periodAmount = document.querySelector('.period-amount'),
    targetAmount = document.querySelector('.target-amount'),
    incomeItems = document.querySelectorAll('.income-items'),
    main = document.querySelector('.main'); // +
         

let appData = {
    budget: 0,
    budgetDay: 0,
    budgetMonth: 0,
    income: {},
    incomeMonth: 0,
    addIncome: [],
    expenses: {},
    expensesMonth: 0,
    addExpenses: [],
    deposit: false,
    persentDeposit: 0,
    momeyDeposit: 0,
    start: function(){

        appData.budget = +salaryAmount.value;
        
        appData.getExpenses();
        appData.getIncome();
        appData.getExpensesMonth();
        appData.getIncomeMonth();
        appData.getAddExpenses();
        appData.getAddIncome();
        appData.getBudget();
        appData.changeRange();
        appData.blocking();

        appData.showResult();

        

    },
    activBtn: function() {
        if (salaryAmount.value !== '') {
            start.removeAttribute('disabled');
            //start.disablede('disabled');
        }
      },

   

    showResult:function(){
        budgetMonthValue.value = appData.budgetMonth;
        budgetDayValue.value = Math.ceil(appData.budgetDay);
        expensesMonthValue.value = appData.expensesMonth;
        additionalExpensesValue.value = appData.addExpenses.join(', ');
        additionalIncomeValue.value = appData.addIncome.join(', ');
        targetMonthValue.value = Math.ceil(appData.getTargetMonth()); //округление в большую сторону
        periodSelect.addEventListener('change', function(){
            incomePeriodValue.value = appData.calcPeriod();
        });

    }, 

    blocking: function(){
        document.querySelectorAll('input[type=text]').forEach(function(item){
            item.disabled = true;
        });
        start.style.display = 'none';
        cancel.style.display = 'block';
    },

    addExpensesBlock: function(){
        let cloneExpensesItem = expensesItems[0].cloneNode(true);
        expensesItems[0].parentNode.insertBefore(cloneExpensesItem, expensesPlus);
        expensesItems = document.querySelectorAll('.expenses-items');
        if(expensesItems.length === 3){
            expensesPlus.style.display = 'none';
        }
    },
    addIncomeBlock: function(){
        let cloneIncomeItem = incomeItems[0].cloneNode(true);
        incomeItems[0].parentNode.insertBefore(cloneIncomeItem, incomePlus);
        incomeItems = document.querySelectorAll('.income-items');
        if(incomeItems.length === 3){
            incomePlus.style.display = 'none';
        }
    },
    getExpenses: function(){
        expensesItems.forEach(function(item){
            let itemExpenses = item.querySelector('.expenses-title').value;
            let cachExpenses = item.querySelector('.expenses-amount').value;
            if(itemExpenses !== '' && cachExpenses !== ''){
                appData.expenses[itemExpenses] = cachExpenses;
            }
        });
    },
    getIncome: function(){
        incomeItems.forEach(function(item){
            let itemIncome = item.querySelector('.income-title').value;
            let cachIncome = item.querySelector('.income-amount').value;
            if(itemIncome !== '' && cachIncome !== ''){
                appData.income[itemIncome] = cachIncome;
            }
        });


        /*if(confirm('Есть ли у Вас дополнительный источник заработка?')){
            let itemIncome = prompt('Какой?', 'Репетитор');
            let cachIncome = prompt('Сумма дополнительного дохода?', '10000');
            appData.income[itemIncome] = cachIncome;
        }
        for(let key in appData.income){
            appData.incomeMonth += +appData.income[key];
        }*/
    },
    
    changeRange: function(){
        periodAmount.textContent = periodSelect.value;
    },

    getAddExpenses: function(){
        let addExpenses = additionalExpensesItem.value.split(',');
        addExpenses.forEach(function(item){
            item = item.trim(); //убирает пробелы в начале и в конце
            if (item !== ''){
                appData.addExpenses.push(item); 
            }
        });
    },
    getAddIncome: function(){
        additionalIncomeItem.forEach(function(item){
            let itemValue = item.value.trim();
            if (itemValue !== ''){
                appData.addIncome.push(itemValue);
            }
        });
    },

    getExpensesMonth: function(){ //Сумма всех расходов за месяц
        for (let key in appData.expenses){
            appData.expensesMonth += +appData.expenses[key];
        }
    },
    getIncomeMonth: function(){ //Сумма всех расходов за месяц
        for (let key in appData.income){
            appData.incomeMonth += +appData.income[key];
        }
    },
    
    getBudget: function(){
        //Месячный бюджет (доход - сумма расходов)
        appData.budgetMonth = appData.budget + appData.incomeMonth - appData.expensesMonth;  
        //Дневной бюдже (Месячный бюджет разделенный на 30 дней)
        appData.budgetDay = appData.budgetMonth/30; 
    },

    getTargetMonth: function(){
        return targetAmount.value / appData.budgetMonth;
    },
    getStatusIncome: function(){
        if (appData.budgetDay >= 800){
            console.log('Высокий уровень дохода');
        } else if(appData.budgetDay < 800 && appData.budgetDay >= 300){
            console.log('Средний уровень дохода');
        } else if(appData.budgetDay < 300 && appData.budgetDay >= 0){
            console.log('Низкий уровень дохода');
        } else {console.log('Что-то пошло не так');
        }
    },
    calcPeriod: function(){
        return appData.budgetMonth * periodSelect.value;
    }

};

salaryAmount.addEventListener('keyup', appData.activBtn);
  
salaryAmount.addEventListener('keyup', appData.checkLength);

start.addEventListener('click', appData.start);

expensesPlus.addEventListener('click', appData.addExpensesBlock);

incomePlus.addEventListener('click', appData.addIncomeBlock);

periodSelect.addEventListener('change', appData.changeRange);

cancel.onclick = function() { // +
  var inputs = main.querySelectorAll('input');
      for (var i = 0; i < inputs.length; i++) {
        inputs[i].value = '';
      }
}
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
Можно пройтись по всем текстовым инпутам в секции и дать им value=""
function reset() {
  [...document.querySelectorAll('section.main input[type="text"]')]
    .forEach( el => el.value='' )
  ;
}


Пара общих замечаний
  • Вместо
    document.getElementsByClassName('budget_day-value')[0]

    лаконичнее document.querySelector('.budget_day-value')
  • Пояснительный текст к каждому input'у семантически корректнее оборачивать в тег <label>, и либо указывать id инпута в атрибуте for="", либо включать инпут внутрь этого лейбла. Так клик по названию поля сделает фокус внутри этого поля.

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы