一个JavaScript实现的贷款计算器

  1. 基于JavaScript实现的贷款计算器: 

  2. <!DOCTYPE html>  
  3. <html>  
  4. <head>  
  5.     <title>JavaScript Loan Calculator</title>  
  6.     <style>  
  7.         .output{font-weight:bold;}  
  8.         #payment{text-decoration:underline;}  
  9.         #graph{border:solid black 1px;}  
  10.         th,td{vertical-align:center;}  
  11.     </style>  
  12.   
  13. </head>  
  14. <body>  
  15.     <table>  
  16.         <tr>  
  17.             <th>Enter Loan Data:</th>  
  18.             <td></td>  
  19.             <th>Loan Balance,Cumulative Equity,and Interest Payments</th>  
  20.         </tr>  
  21.         <tr>  
  22.             <td>Amount of the loan($):</td>  
  23.             <td><input id='amount' onchange='calculate();'></td>  
  24.             <td rowspan=8>  
  25.                 <canvas id='graph' width='470' height='250'></canvas>  
  26.             </td>  
  27.         </tr>  
  28.          <tr>  
  29.             <td>Annual interest(%):</td>  
  30.             <td><input id='apr' onchange='calculate();'></td>             
  31.         </tr>  
  32.          <tr>  
  33.             <td>Repayment period(years):</td>  
  34.             <td><input id='years' onchange='calculate();'></td>             
  35.         </tr>  
  36.          <tr>  
  37.             <td>Zipcode(to find lenders):</td>  
  38.             <td><input id='zipcode' onchange='calculate();'></td>             
  39.         </tr>  
  40.          <tr>  
  41.             <td>Approximate Payments:</td>  
  42.             <td><button onclick='calculate();'>Calculate</button></td>             
  43.         </tr>  
  44.          <tr>  
  45.             <td>Monthly Payments:</td>  
  46.             <td>$<span class='output' id='payment'></span></td>             
  47.         </tr>  
  48.          <tr>  
  49.             <td>Total Payments:</td>  
  50.             <td>$<span class='output' id='total'></span></td>             
  51.         </tr>  
  52.          <tr>  
  53.             <td>Total Interest:</td>  
  54.             <td>$<span class='output' id='totalinterest'></span></td>             
  55.         </tr>  
  56.          <tr>  
  57.             <th>Sponsors:</th>  
  58.             <td colspan=2>  
  59.                 Apply for your loan width one of these fine lenders:  
  60.                 <div id='lenders'><div>  
  61.             </td>                
  62.         </tr>  
  63.     </table>  
  64.     <script type="text/javascript">  
  65.         "use strict";  
  66.         function $(id){  
  67.             return document.getElementById(id);  
  68.         }  
  69.           
  70.         function calculate (){  
  71.             var amount = $('amount');  
  72.             var apr = $('apr');  
  73.             var years = $('years');  
  74.             var zipcode = $('zipcode');  
  75.             var payment = $('payment');  
  76.             var total = $('total');  
  77.             var totalinterest = $('totalinterest');  
  78.              
  79.             var principal = parseFloat(amount.value);  
  80.             var interest = parseFloat(apr.value)/100/12;  
  81.             var payments = parseFloat(years.value)*12;  
  82.             
  83.             var x = Math.pow(1+interest ,payments);// power method.  
  84.             var monthly = (principal * x * interest)/(x-1);  
  85.               
  86.             if(isFinite(monthly)){  
  87.                 payment.innerHTML = monthly.toFixed(2);  
  88.                 total.innerHTML = (monthly*payments).toFixed(2);  
  89.                 totalinterest.innerHTML = ((monthly*payments)-principal).toFixed(2);                  
  90.                 save(amount.value,apr.value,years.value,zipcode.value);              
  91.                 try{  
  92.                     getLenders(amount.value,apr.value,years.value,zipcode.value);  
  93.                 }catch(e){}                  
  94.                 chart(principal,interest,monthly,payments);   
  95.             }else{                  
  96.                 payment.innerHTML = "";  
  97.                 total.innerHTML = "";  
  98.                 totalinterest.innerHTML = "";  
  99.                 chart();  
  100.             }  
  101.         }  
  102.           
  103.         function save(amount,apr,years,zipcode){  
  104.             if(window.localStorage){  
  105.                 localStorage.loan_amount = amount;  
  106.                 localStorage.loan_apr = apr;  
  107.                 localStorage.loan_years = years;  
  108.                 localStorage.loan_zipcode = zipcode;  
  109.             }  
  110.         }  
  111.           
  112.         window.onload = function(){  
  113.             if(window.localStorage&&localStorage.loan_amount){  
  114.                 $('amount').value = localStorage.loan_amount;  
  115.                 $('apr').value = localStorage.loan_apr;  
  116.                 $('years').value = localStorage.loan_years;  
  117.                 $('zipcode').value = localStorage.loan_zipcode;  
  118.             }  
  119.         }  
  120.           
  121.         function getLenders(amount,apr,years,zipcode){  
  122.             if(!window.XMLHttpRequest)return ;              
  123.             var ad = $('lenders');  
  124.             if(!ad)return;  
  125.               
  126.             var url = 'getLenders.php' +   
  127.                       '?amt='+ encodeURIComponent(amount)+  
  128.                       '&apr='+ encodeURIComponent(apr)+  
  129.                       '&yrs='+ encodeURIComponent(years)+  
  130.                       '&zip='+ encodeURIComponent(zipcode);  
  131.               
  132.             var req = new XMLHttpRequest();  
  133.             req.open('GET',url);  
  134.             req.send(null);  
  135.               
  136.             req.onreadystatechange = function(){  
  137.                 if(req.readyState==4 && req.status == 200){  
  138.                     var response = req.responseText;  
  139.                     var lenders = JSON.parse(response);                      
  140.                     var list = '';  
  141.                     for(var i=0;i<lenders.length;i++){  
  142.                         list += '<li><a href="' + lenders[i].url +'">'+  
  143.                                 lenders[i].name + '</a>';  
  144.                     }  
  145.                     ad.innerHTML = 'ul' + list + 'ul';  
  146.                 }  
  147.             }  
  148.         }  
  149.           
  150.           
  151.         function chart(principal,interest,monthly,payments){  
  152.             var graph = $('graph');  
  153.             graphgraph.width = graph.width;              
  154.             if(arguments.length==0|| !graph.getContext)return ;  
  155.               
  156.             var g = graph.getContext('2d');  
  157.             var width = graph.width,  
  158.                 height = graph.height;  
  159.                   
  160.             function paymentToX(n){  
  161.                 return n*width/payments;  
  162.             }  
  163.             function amountToY(a){  
  164.                 return height - (a*height/(monthly*payments*1.05));  
  165.             }  
  166.               
  167.             g.moveTo(paymentToX(0),amountToY(0));  
  168.             g.lineTo(paymentToX(payments),amountToY(monthly*payments));  
  169.             g.lineTo(paymentToX(payments),amountToY(0));  
  170.             g.closePath();  
  171.               
  172.             g.fillStyle = '#f88';  
  173.             g.fill();  
  174.             g.font="bold 12px sans-serif";  
  175.             g.fillText("Total Interest Payments",20,20);  
  176.               
  177.             var equity = 0;  
  178.             g.beginPath();  
  179.             g.moveTo(paymentToX(0),amountToY(0));  
  180.             for(var  p=1;p<=payments;p++){  
  181.                 var m = (principal - equity)*interest;  
  182.                 equity += (monthly - m);  
  183.                 g.lineTo(paymentToX(p),amountToY(equity));  
  184.             }   
  185.             g.lineTo(paymentToX(payments),amountToY(0));  
  186.             g.closePath();  
  187.             g.fillStyle = 'green';  
  188.             g.fill();  
  189.             g.font="bold 12px sans-serif";  
  190.             g.fillText("Total Equity",20,35);  
  191.               
  192.               
  193.             var bal = principal;  
  194.             g.beginPath();  
  195.             g.moveTo(paymentToX(0),amountToY(bal));  
  196.             for(var  p=1;p<=payments;p++){  
  197.                 var m = bal*interest;  
  198.                 bal -= (monthly - m);  
  199.                 g.lineTo(paymentToX(p),amountToY(bal));  
  200.             }   
  201.             g.lineWidth = 1;  
  202.             g.stroke();              
  203.             g.fillStyle = 'black';  
  204.             g.fillText("Total Balance",20,50);  
  205.               
  206.               
  207.             g.textAlign = 'center';  
  208.             var y = amountToY(0);  
  209.             for(var year=1; year*12<=payments;year++){  
  210.                 var x = paymentToX(year*12);  
  211.                 g.fillRect(x-0.5,y-3,1,3);  
  212.                 if(year==1) g.fillText("Year",x,y-5);  
  213.                 if(year % 5 ==0 && year *12 !== payments){  
  214.                     g.fillText(String(year),x,y-5);  
  215.                 }  
  216.             }  
  217.               
  218.             g.textAlign = "right";  
  219.             g.textBaseline = 'middle';  
  220.             var ticks = [ monthly * payments ,principal];  
  221.             var rightEdge = paymentToX(payments);  
  222.             for(var i=0;i<ticks.length;i++){  
  223.                 var y = amountToY(ticks[i]);  
  224.                 g.fillRect(rightEdge-3,y-0.5,3,1);  
  225.                 g.fillText(String(ticks[i].toFixed(0)),rightEdge-5,y);  
  226.             }  
  227.         }  
  228.      
  229.       
  230.     </script>  
  231. </body>  
  232. </html>
效果图:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值