JavaScript贷款计算器

今天花了两个小时模仿书上代码用JS制作了JavaScript贷款计算器,时间有些长,但相比以前,自己细心了不少,每天进步一点点,量的积累达到质的飞跃

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
<style type="text/css">
.output{
    font-weight:bold;}
#payment{
    text-decoration:underline;}
#graph{
    border:1px solid black;}
th,td{
    vertical-align:top;}
</style>
<script type="text/javascript">
function calculate(){
    //查找文档中用于输入输出的元素
    var amount=document.getElementById("amount");
    var apr=document.getElementById("apr");
    var years=document.getElementById("years");
    var zipcode=document.getElementById("zipcode");
    var payment=document.getElementById("payment");
    var total=document.getElementById("total");
    var totalinterest=document.getElementById("totalinterest");
    
    //假设输入合法将从input元素中获取输入数据
    //将百分比格式转换为小数格式,且从年利率转换为月利率
    //将年度赔付转换为月度赔付
    var principle=parseFloat(amount.value);
    var interest=parseFloat(apr.value)/100/12;
    var payments=parseFloat(years.value)*12;

var x=Math.pow(1+interest,payments);
    var monthly=(principle * x * interest)/(x-1);

//如果结果没有超过javascript能表示的数字范围,且用户的输入也正确
      //这里所展示的结果就是合法的
    if(isFinite(monthly)){
        //将数据填充至输出字段的位置,四舍五入到小数点后两位数字
        payment.innerHTML=monthly.toFixed(2);
        total.innerHTML=(monthly * payments).toFixed(2);
        totalinterest.innerHTML=((monthly * payments)-principle).toFixed(2);
         
         //将用户数据保存下来,以便在下次访问时也能取到数据
         save(amount.value,apr.value,years.value,zipcode.value);
         try{
             getLenders(amount.value,apr.value,years.value,zipcode.value);
             }catch(e){}
            
             //用图表展示贷款余额,利息和资产收益
                 chart(principle,interest,monthly,payments);
    }
                 else{
                     //计算结果不是数字或者无穷大,意味着输入的数据是非法的或是不完整的
                     //清空之前的输出数据
                    payments.innerHTML="";//清空元素的文本内容
                    total.innerHTML=""
                    totalinterest.innerHTML="";
                    chart();//不传参数就清空图表
                 }
    
    }
    
    function save(amount,apr,years,zipcode){
        if(window.localStorage){
            localStorage.loan_amount=amount;
            localStorage.loan_apr=apr;
            localStorage.loan_years=years;
            localStorage.loan_zipcode=zipcode;
            }
        }
        
        window.onload=function(){
            if(window.localStorage && localStorage.loan_amount){
                document.getElementById("amount").value=localStorage.loan_amount;
                document.getElementById("apr").value=localStorage.loan_apr;
                document.getElementById("years").value=localStorage.loan_years;
                document.getElementById("zipcode").value=localStorage.loan_zipcode;
                }
            };
            
            function getLenders(amount,apr,years,zipcode){
                if(!window.XMLHttpRequest) return;
                var ad=document.getElementById("lenders");
                if(!ad) return;
                var url="getLenders.php"+"?amt=" +encodeURIComponent(amount)+"&apr="+encodeURIComponent(apr)+"&yrs="+encodeURIComponent(years)+"&zip="+encodeURIComponent(zipcode);
                
                //通过XMLHttpRequest对象来提取返回数据
                var req=new XMLHttpRequest();
                req.open("GET",url);
                req.send(null);
                
                req.onreadystatechange=function(){
                    if(req.readyState==4 && req.status==200){
                        var response=req.responseText;
                        var lenders=JSON.parse(response);
                        var list="";
                        for(var i=0;i<lenders.length;i++){
                            list +="<li><a href=‘" + lenders[i].url +"‘>" +lenders[i].name +"</a>";
                            }
                            ad.innerHTML="<ul>" + list + "</ul>";
                        }
                    }
                }
                
                function chart(principle,interest,monthly,payments){
                    var graph=document.getElementById("graph");
                    graph.width=graph.width;//清除且重置画布
                    //若不传入参数,或浏览器不返回,则直接返回
                    if(arguments.length==0 || !graph.getContext) return;
                    var g=graph.getContext("2d");
                    var width=graph.width,
                    height=graph.height;
                    
                    function paymentToX(n){
                        return n * width/payments;
                        }
                    function amountToY(a){
                        return height-(a*height/(monthly * payments *1.05));
                        }
                        g.moveTo(paymentToX(0),amountToY(0));
                        g.lineTo(paymentToX(payments),amountToY(payments * monthly));
                        g.lineTo(paymentToX(payments),amountToY(0));
                        g.closePath();
                        g.fillStyle="#f88";
                        g.fill();
                        g.font="12 bold sans-serif";
                        g.fillText("Total Interest Payment",20,20);
                        
                        var equity=0;
                        g.beginPath();
                        g.moveTo(paymentToX(0),amountToY(0));
                        for(var p=1;p<=payments;p++){
                            var thisMonthsInterest=(principle-equity) * interest;
                            equity +=(monthly-thisMonthsInterest);
                            g.lineTo(paymentToX(p),amountToY(equity));
                            }
                            g.lineTo(paymentToX(payments),amountToY(0));
                            g.closePath();
                            g.fillStyle="green";
                            g.fill();
                            g.fillText("Total Equity",20,35);
                            
                            var bal=principle;
                            g.beginPath();
                            g.moveTo(paymentToX(0),amountToY(bal));
                            for(var p=1;p<=payments;i++){
                                var thisMonthsInterest=bal * interest;
                                bal -=(monthly-thisMonthsInterest);
                                g.lineTo(paymentToX(p),amountToY(bal));
                                }
                                g.lineWidth=3;
                                g.stroke();
                                g.fillStyle="black";
                                g.fillText("Loan Balance",20,50);
                                
                                g.textAlign="center";
                                var y=amountToY(0);
                                for(var year=1;year * 12 <=payments;year++){
                                    var x=paymentToX(year * 12);
                                    g.fillRect(x-0.5,y-3,1,3);
                                    if(year==1) g.fillText("Year",x,y-5);
                                    if(year % 5 ==0 && year * 12 !==payments)
                                    g.fillText(Sring(year),x,y-5);
                                    }
                                    
                                    //将赔付的金额标记在右边界
                                    g.textAlign="right";//文字右对齐
                                    g.textBaseline="middle";//文字垂直对其
                                    var ticks=[monthly * payments,principle];//所用的两个点
                                    var rightEdge=paymentToX(payments);//设置X坐标
                                    for(var i=0;i<ticks.length;i++){//对每两个大做循环
                                        var y=amountToY(ticks[i]);//计算每个标记的Y轴坐标
                                        g.fillRect(rightEdge-3,y-0.5,3,1);//绘制标记
                                        g.fillText(String(ticks[i].toFixed(0)),rightEdge-5,y);//绘制文本
                                        }
                    }
</script>
</head>

<body>
<table>
<tr>
<th>Enter Loan Data:</th>
<td></td>
<th>Loan Balance,Cumulative Equity,and Interest Payments</th>
</tr>
<tr>
<td>Amount of the Loan($):</td>
<td><input id="amount" onChange="calculate();"></td>
<td rowspan="8">
<canvas id="graph" width="400" height="250"></canvas>
</td>
</tr>
<tr>
<td>Annual interest(%):</td>
<td><input id="apr" onChange="calculate();"></td>
</tr>
<tr>
<td>Repayment period(years):</td>
<td><input id="years" onChange="calculate();"></td>
<tr><td>Zipcode(to find lenders):</td>
<td><input id="zipcode" onChange="calculate();"></td>
<tr><th>Approximate Payments:</th>
<td><button onClick="calculate();">Calculate</button></td>
</tr>
<tr>
<td>Monthly payment:</td>
<td>$<span class="output" id="payment"></span></td>
</tr>
<tr>
<td>Total payment:</td>
<td>$<span class="output" id="total"></span></td>
</tr>
<tr>
<td>Total interest:</td>
<td>$<span class="output" id="totalinterest"></span></td>
</tr>
<tr>
<th>Sponsors:</th>
<td colspan="2">Apply for your loan with one of these fine lenders:
<div id="lenders"></div>
</td>
</tr>
</tr>
</tr>
</table>
</body>
</html>

效果图:

时间: 2024-10-27 11:33:43

JavaScript贷款计算器的相关文章

Javascript权威指南——第一章Javascript概述

示例:javascript贷款计算器 相关技术: 1.如何在文档中查找元素: 2.如何通过表单input元素来获取用户的输入数据: 3.如何通过文档元素来设置HTML内容: 4.如何将数据存储在浏览器中: 5.如何使用脚本发起HTTP请求: 6.如何利用<canvas>元素绘图. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4

51CTO下载-JavaScript免豆

资料名称资料地址JS刷新页面[源码]http://down.51cto.com/data/45292667.成绩表排序(2)-CJ-JavaScript视频教程http://down.51cto.com/data/422466OpenLayers 英文原版本API文档http://down.51cto.com/data/443003类似谷歌图片的图片展示代码[源码]http://down.51cto.com/data/446663Ext2.2API中文版(最终完成版)http://down.51

javascript权威指南学习笔记1

打开这本书,进入到javascript的世界.以前都是看各种视频,感觉什么收获也没有,反而弄得脑袋混乱,希望能够按照这本书的节奏掌握javascript这门语言,为我的前端学习打下基础. 学习前准备:web浏览器(F12用来唤醒和关闭firebug界面,ctrl+shift+j用来唤醒错误工作台,console.log()调试辅助) 本书分为4个部分:Javascript语言核心:客户端Javascript:Javascript核心参考:客户端Javascript参考.今天主要学了第一部分.主要

Javascript中call的使用

call 方法应用于:Function 对象调用一个对象的一个方法,以另一个对象替换当前对象.call([thisObj[,arg1[, arg2[,   [,.argN]]]]])参数:thisObj 可选项.将被用作当前对象的对象. arg1, arg2, , argN 可选项.将被传递方法参数序列. 说明:call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象.如果没有提供 thisObj 参数,那么 G

你不知道的javascript 之 &gt;&gt;

?远大于符号 在数学公式中,">>"代表远大于符号,表示一个数远大于另一个数,如76>>3,-2>>-99等.庞加莱与波莱尔1901年首先使用了它,很快被数学界所接受,沿用至今. 折叠编辑本段右移运算符 在许多计算机编程语言(例如:C语言.C++语言.Java语言.JavaScript语言.Pascal语言等)中,">>"代表右移运算符,就相当于"shr".该运算符为双目运算符,结合方向为从左到右,

初识JavaScript

JavaScript简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能.因为JavaScript兼容于ECMA标准,因此也称为ECMAScript. ECMAScript,描述了该语javascript组成言的语法和基本对象. 文档对象模型(DOM),描述处理网页内容的方法

最全解析如何正确学习JavaScript指南,必看!

划重点 鉴于时不时,有同学私信问我:怎么学前端的问题.这里统一回复一下,如下次再遇到问我此问题同学,就直接把本文链接地址发给你了. "前端怎么学"应该因人而异,别人的方法未必适合自己.就说说我的学习方法吧:我把大部分时间放在学习js上了.因为这个js的学习曲线,先平后陡.项目实践和练习啥的,我不说了,主要说下工作之外的时间利用问题.我是怎么学的呢,看书,分析源码.个人这几天统计了一下,前端书籍目前看了50多本吧,大部分都是js的.市面上的书基本,差不多都看过. 第一个问题:看书有啥好处

JavaScript数据类型检测

一.JavaScript 数据类型 1.基本数据类型(6种) Undefined Null Boolean Number String Symbol (ES6新增) 2.引用数据类型: Object 二.数据类型检测 1. typeof 可以检测除null 外的基本类型.null 和所有对象的typeof都是"object", 不能用于检测用户自定义类型. 比如Date, RegExp, Array, DOM Element的类型都是"object". var s

JavaScript的进阶之路(二)函数简介,变量、作用域和内存问题

<h3>ECMAScript中函数不存在函数签名的概念,没有重载</h3><h3>无需指定返回值,可以在任何时候返回任何值.未指定返回值的函数,返回的是一个特殊的undefined值</h3> <script type="text/javascript"> function sayHi(){ console.log("Hi"); }; sayHi(); function sayName(name,age){