• js 贷款计算器


    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>贷款计算器</title>
        <style>
            .output{font-weight: bold;}
            #payment {text-decoration: underline;}
            #graph{border: solid black 1px;}
            th,td{vertical-align: top;}
        </style>
    </head>
    <body>
        <table>
            <tr>
                <th>Enter Loan Data:</th>
                <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>Annul interset (%):</td>
                <td><input id="apr" onchange="calculate();" /></td>
            </tr>
            <tr>
                <td>Repayment period(years):</td>
                <td><input id="years" onchange="calculate();" /></td>
            </tr>
            <tr>
                <td>Zipcode (to find lenders):</td>
                <td><input id="zipcode" onchange="calculate();" /></td>
            </tr>
            <tr>
                <td>Approximate Payments:</td>
                <td><button onchange="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="total" id="total"></span></td>
            </tr>
            <tr>
                <td>Total interset:</td>
                <td>$<span class="output" id="totalinterset"></span></td>
            </tr>
            <tr><th>Sponsors:</th><td colspan="2">Apply for you loan with one of these fine lenders:
                <div id="lenders"></div>
            </td></tr>
        </table>
    </body>
    <script>
        "use strict"; //如果浏览器支持,则开启ECMAScript 5 的严格模式
        function calculate(){
            console.log(3);
            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 totalinterset = document.getElementById("totalinterset");
            
            //将年度转换为月度赔付数据
            var principal = 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 = (principal * x * interest) / (x - 1);
    
            if (isFinite(monthly)){
                //数据填充
                payment.innerHTML = monthly.toFixed(2);
                total.innerHTML = (monthly * payments).toFixed(2);
                totalinterset.innerHTML = ((monthly * payments) - principal).toFixed(2);
                //保存用户数据到浏览器 用户下次访问也能读取显示
                save(amount.value,apr.value,years.value,zipcode.value);
                //找到用户信息后展示,但是忽略网络错误
                try{
                    getLenders(amount.value,apr.value,years.value,zipcode.value);
                }catch(e){}
                //展示图表
                chart(principal,interest,monthly,payments);
            }else{
                payment.innerHTML = "";
                total.innerHTML = "";
                totalinterset.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);
    
            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(principal,interset,monthly,payments){
                console.log(0);
                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(monthly*payments));
                //在至右下方
                g.lineTo(paymentToX(payments),amountToY(0));
                //将结尾链接至开头
                g.closePath();
                //亮红色
                g.fillStyle = "#f88";
                //填充
                g.fill();
                //定义字体
                g.font = "bold 12px sans-serif";
                //将文字绘制到图中
                g.fillText("Total Interset Payments",20,20);
    
                var equity = 0;
                g.beginPath();
                g.moveTo(paymentToX(0),amountToY(0));
                for(var p = 1; p <= payments ; p++ ){
                    var thisMothsInterest = (principal - equity) *interset;
                    equity += (monthly - thisMothsInterest);
                    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 = principal;
                g.beginPath();
                g.moveTo(paymentToX(0),amountToY(bal));
                for( var p=1;p<=payments;p++){
                    var thisMothsInterest = bal * interset;
                    bal -= (monthly - thisMothsInterest);
                    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(String(year),x,y-5);
                    }
                }
    
                g.textAlign = "right";
                g.textBaseline = 'middle';
                var ticks = [monthly*payments,principal];
                var rightEdge = paymentToX(payments);
                for(var i=0;i<ticks.length;i++){
                    var y = amountToY(ticks[i]);
                    g.fillRect(rightEdge - 3,y-0.5,3,1);
                    g.fillText(String(ticks[i].toFixed(0)),rightEdge-5,y);
                }
            }
    
    </script>
    </html>
    
  • 相关阅读:
    [vue Debugger] sourcemap
    [vuex]持久化存储
    [vuex]字典值封装到vuex缓存
    [vue]常用指令集合
    VSCode插件集合
    [element-ui] 表格点击出现编辑效果实现
    [pdf] 插件实现pdf上传预览、打印
    [html] 特殊字符
    [element-ui] 穿梭框对象重复不添加方案
    Redis持久化
  • 原文地址:https://www.cnblogs.com/ikai/p/12774269.html
Copyright © 2020-2023  润新知