2012年9月20日星期四

《JavaScript权威指南》第六版阅读笔记(一):JavaScript概述

《JavaScript权威指南》第六版阅读笔记(一):JavaScript概述

  最近开始阅读《JavaScript权威指南》第六版,这次阅读的主要目地是进一步把基础打牢,对以前的学习复习和检查。

  第一章是JavaScript概述,没什么好说的,只把本章最后一个综合示例(贷款计算器)动手敲了一遍:

  代码如下:

<!DOCTYPE html><html><head>    <meta charset="utf-8"/>    <title>Demo</title>    <style type="text/css">        .output{            font-weight:bold;        }        #payment{            text-decoration:underline;        }        #graph{            border:1px solid black;        }        th,td{            vertical-align:top;        }    </style></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 type="text" 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 type="text" id="apr" onchange="calculate();"/></td>        </tr>        <tr>            <td>Repayment penod(year):</td>            <td><input type="text" id="years" onchange="calculate();"/></td>        </tr>        <tr>            <td>Zipcode(to find lenders):</td>            <td><input type="text" id="zipcode" onchange="calculate();"/></td>        </tr>        <tr>            <td>Approximate Payments:</td>            <td><input type="button" value="Calculate" onclick="calculate();"/></td>        </tr>        <tr>            <td>Monthly payment:</td>            <td>$<span  id="payment"></span></td>        </tr>        <tr>            <td>Total payment:</td>            <td>$<span  id="total"></span></td>        </tr>        <tr>            <td>Total interest:</td>            <td>$<span  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>    </table>    <script>        "use strict";        function $(id){            return document.getElementById(id);        }        function calculate(){            var amount=$("amount"),                apr=$("apr"),                years=$("years"),                zipcode=$("zipcode"),                payment=$("payment"),                total=$("total"),                totalinterest=$("totalinterest"),                principal=parseFloat(amount.value),                interest=parseFloat(apr.value)/100/12,                payments=parseFloat(years.value)*12,                x=Math.pow(1+interest,payments),                monthly=(principal * x * interest)/(x-1);            if(isFinite(monthly)){                payment.innerHTML = monthly.toFixed(2);                total.innerHTML = (monthly * payments).toFixed(2);                totalinterest.innerHTML= ((monthly * payments) - principal).toFixed(2);                save(amount.value,apr.value,years.value,zipcode.value);                try{                    getLenders(amount.value,zpr.value,years.value,zipcode.value);                } catch(e){                }                chart(principal,interest,monthly,payments);            } else {                payment.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){                $("amount").value = localStorage.loan_amount;                $("apr").value = localStorage.loan_apr;                $("years").value = localStorage.loan_years;                $("zipcode").value = localStorage.loan_zipcode;            }        }        function getLenders(amount,zpr,years,zipcode){            if(window.return;                        var ad=$("lenders");            if(!ad)                return;                        var url="genLenders.php"+                "?amt="+encodeURIComponent(amount)+                "&apr="+encodeURIComponent(zpr)+                "&yrs="+encodeURIComponent(years)+                "&zip="+encodeURIComponent(zipcode);                        var req=new "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, j = lenders.length; i<j; i++){                        list+="<li><a href='"+lenders[i].url+"'>" + lenders[i].name + "</a></li>";                    }                    ad.innerHTML = "<ul>" + list + "</ul>";                }            }        }        function chart(principal, interest, monthly, payments){            var graph=$("graph");            //graph.width=graph.wdith;            if(arguments.length == 0 || !graph.getContext)                return;                        var g=graph.getContext("2d"),                width=graph.width,                height=graph.height;                        g.clearRect(0, 0, width, 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.fill;            g.fill();            g.fillText("Total Interest Payments",20,20);            var equity=0;            g.beginPath();            g.moveTo(paymentToX(0),amountToY(0));            for(var p=1;p<= payments; p++){                var thisMonthsInterest = (principal - equity) * interest;                equity += (monthly - thisMonthsInterest);                g.lineTo(paymentToX(p),amountToY(equity));;            }            g.lineTo(paymentToX(payments),amountToY(0));            g.closePath();            g.fill;            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 thisMonthsInterest=bal*interest;                bal-=(monthly - thisMonthsInterest);                g.lineTo(paymentToX(p),amountToY(bal));            }            g.lineWidth=3;            g.stroke();            g.fill;            g.fillText("Loan Black",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></body></html>

  运行效果:

  要注意的是书上的代码中有一行:

graph.width=graph.wdith;//用一种巧妙的手法清除并重置画布

  这一行代码经测试不能达到清除并重置画布的效果,反而使右达的图像只是一条垂直的黑线,所以我换成了:

g.clearRect(0, 0, width, height);

  也没找到勘误表,不在道这个地方是不是有印刷错误,如果有知道的朋烦请告知。:)


TAG: