본문 바로가기

Mini Projects

3. Loan Calculator (JavaScript)

- UI

 

 

 

 

값 입력 후 loading

 

 

 

계산

 

 

 

 

html 처음에

    <style>
      #loading, #results {
        display:none;
      }
    </style>

처음에 로딩과 결과 화면은 display:none으로

 

 

 

// Listen for submit
document.getElementById('loan-form').addEventListener('submit', function(e){
  // Hide results
  document.getElementById('results').style.display = 'none';
  
  // Show loader
  document.getElementById('loading').style.display = 'block';

  setTimeout(calculateResults, 2000);

  e.preventDefault();
});

submit 버튼을 눌렀을 때, 결과는 여전히 none이지만 loading 이미지를 block으로하고

2초 뒤 결과 화면 보여주는 calculateResults 함수

 

 

// Calculate Results
function calculateResults(){
  console.log('Calculating...');
  // UI Vars
  const amount = document.getElementById('amount');
  const interest = document.getElementById('interest');
  const years = document.getElementById('years');
  const monthlyPayment = document.getElementById('monthly-payment');
  const totalPayment = document.getElementById('total-payment');
  const totalInterest = document.getElementById('total-interest');

  const principal = parseFloat(amount.value);
  const calculatedInterest = parseFloat(interest.value) / 100 / 12;
  const calculatedPayments = parseFloat(years.value) * 12;

  // Compute monthly payment
  const x = Math.pow(1 + calculatedInterest, calculatedPayments);
  const monthly = (principal*x*calculatedInterest)/(x-1);

  if(isFinite(monthly)) {
    monthlyPayment.value = monthly.toFixed(2);
    totalPayment.value = (monthly * calculatedPayments).toFixed(2);
    totalInterest.value = ((monthly * calculatedPayments)-principal).toFixed(2);

    // Show results
    document.getElementById('results').style.display = 'block';

    // Hide loader
    document.getElementById('loading').style.display = 'none';

  } else {
    showError('Please check your numbers');
  }
}

 

calculateResults 함수에서는 필요한 UI 요소 다 가져오고, 결과 값 계산 후

results를 block으로 loading을 none으로

 

 

 

error인 경우 showError 함수

// Show Error
function showError(error){
  // Hide results
  document.getElementById('results').style.display = 'none';
  
  // Hide loader
  document.getElementById('loading').style.display = 'none';

  // Create a div
  const errorDiv = document.createElement('div');

  // Get elements
  const card = document.querySelector('.card');
  const heading = document.querySelector('.heading');

  // Add class
  errorDiv.className = 'alert alert-danger';

  // Create text node and append to div
  errorDiv.appendChild(document.createTextNode(error));

  // Insert error above heading
  card.insertBefore(errorDiv, heading);

  // Clear error after 3 seconds
  setTimeout(clearError, 3000);
}

 

error 창 뜰때는 result와 loading 다 뜨면 안되니까 display:none이 되도록 설정.

error 메시지를 담을 div를 만들고 errorDiv의 className = 'alert alert-danger'

이 errorDiv의 textNode에 메시지를 넣고

card안 heading 앞에 errorDiv를 넣어준다.

그리고 3초 후 claerError 함수

 

 

// Clear error
function clearError(){
  document.querySelector('.alert').remove();
}

'Mini Projects' 카테고리의 다른 글

News Grid (4) - Header Showcase  (0) 2020.07.06
News Grid (3) Basic CSS  (0) 2020.07.06
News Grid (2) Nav Bar (HTML)  (0) 2020.07.06
News Grid (1) Setup & Favicon  (0) 2020.07.06
2. Task List (JavaScript)  (0) 2020.06.22