JS笔记(2)一个综合各方面的例子
通过这个例子思考下列问题
• 1 怎么得到文档中的元素?
答:使用document.getElementById("ID")
• 怎么的到用户的输入,从输入元素里面.
答:通过元素的.value获得
• 怎么设置文档中某一个元素的内容
答:通过 elment.innerHTML ="";
• 怎么存储数据在浏览器下.
答:用window.localStorage,擦这个html5才支持吧
• 怎么用脚本请求页面.
答:用XMLHttpRequest对象。
• 如何用<canvas> 元素画图.
答:var g = canvas.getContext("2d");
g.beginPath(),moveto,endPath(); g.stroke(); g.fillRect(); g.fillText()等。
例子:
贷款计算器
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>JavaScript Loan Calculator</title> 5 <style> /* This is a CSS style sheet: it adds style to the program output */ 6 .output { font-weight: bold; } /* Calculated values in bold */ 7 #payment { text-decoration: underline; } /* For element with id="payment" */ 8 #graph { border: solid black 1px; } /* Chart has a simple border */ 9 th, td { vertical-align: top; } /* Don't center table cells */ 10 </style> 11 </head> 12 <body> 13 <!-- 14 This is an HTML table with <input> elements that allow the user to enter data 15 and <span> elements in which the program can display its results. 16 These elements have ids like "interest" and "years". These ids are used 17 in the JavaScript code that follows the table. Note that some of the input 18 elements define "onchange" or "onclick" event handlers. These specify strings 19 of JavaScript code to be executed when the user enters data or clicks. 20 --> 21 <table> 22 <tr><th>Enter Loan Data:</th> 23 <td></td> 24 <th>Loan Balance, Cumulative Equity, and Interest Payments</th></tr> 25 <tr><td>Amount of the loan ($):</td> 26 <td><input id="amount" onchange="calculate();"></td> 27 <td rowspan=8> 28 <canvas id="graph" width="400" height="250"></canvas></td></tr> 29 <tr><td>Annual interest (%):</td> 30 <td><input id="apr" onchange="calculate();"></td></tr> 31 <tr><td>Repayment period (years):</td> 32 <td><input id="years" onchange="calculate();"></td> 33 <tr><td>Zipcode (to find lenders):</td> 34 <td><input id="zipcode" onchange="calculate();"></td> 35 <tr><th>Approximate Payments:</th> 36 <td><button onclick="calculate();">Calculate</button></td></tr> 37 <tr><td>Monthly payment:</td> 38 <td>$<span class="output" id="payment"></span></td></tr> 39 <tr><td>Total payment:</td> 40 <td>$<span class="output" id="total"></span></td></tr> 41 1.2 Client-Side JavaScript | 13 <tr><td>Total interest:</td> 42 <td>$<span class="output" id="totalinterest"></span></td></tr> 43 <tr><th>Sponsors:</th><td colspan=2> 44 Apply for your loan with one of these fine lenders: 45 <div id="lenders"></div></td></tr> 46 </table> 47 <!-- The rest of this example is JavaScript code in the <script> tag below --> 48 <!-- Normally, this script would go in the document <head> above but it --> 49 <!-- is easier to understand here, after you've seen its HTML context. --> 50 <script> 51 "use strict"; // Use ECMAScript 5 strict mode in browsers that support it 52 /* 53 * This script defines the calculate() function called by the event handlers 54 * in HTML above. The function reads values from <input> elements, calculates 55 * loan payment information, displays the results in <span> elements. It also 56 * saves the user's data, displays links to lenders, and draws a chart. 57 */ 58 function calculate() { 59 // Look up the input and output elements in the document 60 var amount = document.getElementById("amount"); 61 var apr = document.getElementById("apr"); 62 var years = document.getElementById("years"); 63 var zipcode = document.getElementById("zipcode"); 64 var payment = document.getElementById("payment"); 65 var total = document.getElementById("total"); 66 var totalinterest = document.getElementById("totalinterest"); 67 68 // Get the user's input from the input elements. Assume it is all valid. 69 // Convert interest from a percentage to a decimal, and convert from 70 // an annual rate to a monthly rate. Convert payment period in years 71 // to the number of monthly payments. 72 var principal = parseFloat(amount.value); 73 var interest = parseFloat(apr.value) / 100 / 12; 74 var payments = parseFloat(years.value) * 12; 75 // Now compute the monthly payment figure. 76 var x = Math.pow(1 + interest, payments); // Math.pow() computes powers 77 var monthly = (principal*x*interest)/(x-1); 78 // If the result is a finite number, the user's input was good and 79 // we have meaningful results to display 80 if (isFinite(monthly)) { 81 // Fill in the output fields, rounding to 2 decimal places 82 payment.innerHTML = monthly.toFixed(2); 83 total.innerHTML = (monthly * payments).toFixed(2); 84 totalinterest.innerHTML = ((monthly*payments)-principal).toFixed(2); 85 // Save the user's input so we can restore it the next time they visit 86 save(amount.value, apr.value, years.value, zipcode.value); 87 88 // Advertise: find and display local lenders, but ignore network errors 89 try { // Catch any errors that occur within these curly braces 90 getLenders(amount.value, apr.value, years.value, zipcode.value); 91 } 92 14 | Chapter 1: Introduction to JavaScript catch(e) { /* And ignore those errors */ } 93 // Finally, chart loan balance, and interest and equity payments 94 chart(principal, interest, monthly, payments); 95 } 96 else { 97 // Result was Not-a-Number or infinite, which means the input was 98 // incomplete or invalid. Clear any previously displayed output. 99 payment.innerHTML = ""; // Erase the content of these elements 100 total.innerHTML = "" 101 totalinterest.innerHTML = ""; 102 chart(); // With no arguments, clears the chart 103 } 104 } 105 // Save the user's input as properties of the localStorage object. Those 106 // properties will still be there when the user visits in the future 107 // This storage feature will not work in some browsers (Firefox, e.g.) if you 108 // run the example from a local file:// URL. It does work over HTTP, however. 109 function save(amount, apr, years, zipcode) { 110 if (window.localStorage) { // Only do this if the browser supports it 111 localStorage.loan_amount = amount; 112 localStorage.loan_apr = apr; 113 localStorage.loan_years = years; 114 localStorage.loan_zipcode = zipcode; 115 } 116 } 117 // Automatically attempt to restore input fields when the document first loads. 118 window.onload = function() { 119 // If the browser supports localStorage and we have some stored data 120 if (window.localStorage && localStorage.loan_amount) { 121 document.getElementById("amount").value = localStorage.loan_amount; 122 document.getElementById("apr").value = localStorage.loan_apr; 123 document.getElementById("years").value = localStorage.loan_years; 124 document.getElementById("zipcode").value = localStorage.loan_zipcode; 125 } 126 }; 127 // Pass the user's input to a server-side script which can (in theory) return 128 // a list of links to local lenders interested in making loans. This example 129 // does not actually include a working implementation of such a lender-finding 130 // service. But if the service existed, this function would work with it. 131 function getLenders(amount, apr, years, zipcode) { 132 // If the browser does not support the XMLHttpRequest object, do nothing 133 if (!window.XMLHttpRequest) return; 134 // Find the element to display the list of lenders in 135 var ad = document.getElementById("lenders"); 136 if (!ad) return; // Quit if no spot for output 137 1.2 Client-Side JavaScript | 15 // Encode the user's input as query parameters in a URL 138 var url = "getLenders.php" + // Service url plus 139 "?amt=" + encodeURIComponent(amount) + // user data in query string 140 "&apr=" + encodeURIComponent(apr) + 141 "&yrs=" + encodeURIComponent(years) + 142 "&zip=" + encodeURIComponent(zipcode); 143 // Fetch the contents of that URL using the XMLHttpRequest object 144 var req = new XMLHttpRequest(); // Begin a new request 145 req.open("GET", url); // An HTTP GET request for the url 146 req.send(null); // Send the request with no body 147 // Before returning, register an event handler function that will be called 148 // at some later time when the HTTP server's response arrives. This kind of 149 // asynchronous programming is very common in client-side JavaScript. 150 req.onreadystatechange = function() { 151 if (req.readyState == 4 && req.status == 200) { 152 // If we get here, we got a complete valid HTTP response 153 var response = req.responseText; // HTTP response as a string 154 var lenders = JSON.parse(response); // Parse it to a JS array 155 // Convert the array of lender objects to a string of HTML 156 var list = ""; 157 for(var i = 0; i < lenders.length; i++) { 158 list += "<li><a href='" + lenders[i].url + "'>" + 159 lenders[i].name + "</a>"; 160 } 161 // Display the HTML in the element from above. 162 ad.innerHTML = "<ul>" + list + "</ul>"; 163 } 164 } 165 } 166 // Chart monthly loan balance, interest and equity in an HTML <canvas> element. 167 // If called with no arguments then just erase any previously drawn chart. 168 function chart(principal, interest, monthly, payments) { 169 var graph = document.getElementById("graph"); // Get the <canvas> tag 170 graph.width = graph.width; // Magic to clear and reset the canvas element 171 // If we're called with no arguments, or if this browser does not support 172 // graphics in a <canvas> element, then just return now. 173 if (arguments.length == 0 || !graph.getContext) return; 174 // Get the "context" object for the <canvas> that defines the drawing API 175 var g = graph.getContext("2d"); // All drawing is done with this object 176 var width = graph.width, height = graph.height; // Get canvas size 177 // These functions convert payment numbers and dollar amounts to pixels 178 function paymentToX(n) { return n * width/payments; } 179 function amountToY(a) { return height-(a * height/(monthly*payments*1.05));} 180 // Payments are a straight line from (0,0) to (payments, monthly*payments) 181 g.moveTo(paymentToX(0), amountToY(0)); // Start at lower left 182 g.lineTo(paymentToX(payments), // Draw to upper right 183 amountToY(monthly*payments)); 184 16 | Chapter 1: Introduction to JavaScript g.lineTo(paymentToX(payments), amountToY(0)); // Down to lower right 185 g.closePath(); // And back to start 186 g.fillStyle = "#f88"; // Light red 187 g.fill(); // Fill the triangle 188 g.font = "bold 12px sans-serif"; // Define a font 189 g.fillText("Total Interest Payments", 20,20); // Draw text in legend 190 // Cumulative equity is non-linear and trickier to chart 191 var equity = 0; 192 g.beginPath(); // Begin a new shape 193 g.moveTo(paymentToX(0), amountToY(0)); // starting at lower-left 194 for(var p = 1; p <= payments; p++) { 195 // For each payment, figure out how much is interest 196 var thisMonthsInterest = (principal-equity)*interest; 197 equity += (monthly - thisMonthsInterest); // The rest goes to equity 198 g.lineTo(paymentToX(p),amountToY(equity)); // Line to this point 199 } 200 g.lineTo(paymentToX(payments), amountToY(0)); // Line back to X axis 201 g.closePath(); // And back to start point 202 g.fillStyle = "green"; // Now use green paint 203 g.fill(); // And fill area under curve 204 g.fillText("Total Equity", 20,35); // Label it in green 205 // Loop again, as above, but chart loan balance as a thick black line 206 var bal = principal; 207 g.beginPath(); 208 g.moveTo(paymentToX(0),amountToY(bal)); 209 for(var p = 1; p <= payments; p++) { 210 var thisMonthsInterest = bal*interest; 211 bal -= (monthly - thisMonthsInterest); // The rest goes to equity 212 g.lineTo(paymentToX(p),amountToY(bal)); // Draw line to this point 213 } 214 g.lineWidth = 3; // Use a thick line 215 g.stroke(); // Draw the balance curve 216 g.fillStyle = "black"; // Switch to black text 217 g.fillText("Loan Balance", 20,50); // Legend entry 218 // Now make yearly tick marks and year numbers on X axis 219 g.textAlign="center"; // Center text over ticks 220 var y = amountToY(0); // Y coordinate of X axis 221 for(var year=1; year*12 <= payments; year++) { // For each year 222 var x = paymentToX(year*12); // Compute tick position 223 g.fillRect(x-0.5,y-3,1,3); // Draw the tick 224 if (year == 1) g.fillText("Year", x, y-5); // Label the axis 225 if (year % 5 == 0 && year*12 !== payments) // Number every 5 years 226 g.fillText(String(year), x, y-5); 227 } 228 // Mark payment amounts along the right edge 229 g.textAlign = "right"; // Right-justify text 230 g.textBaseline = "middle"; // Center it vertically 231 var ticks = [monthly*payments, principal]; // The two points we'll mark 232 var rightEdge = paymentToX(payments); // X coordinate of Y axis 233 for(var i = 0; i < ticks.length; i++) { // For each of the 2 points 234 var y = amountToY(ticks[i]); // Compute Y position of tick 235 1.2 Client-Side JavaScript | 17 g.fillRect(rightEdge-3, y-0.5, 3,1); // Draw the tick mark 236 g.fillText(String(ticks[i].toFixed(0)), // And label it. 237 rightEdge-5, y); 238 } 239 } 240 </script> 241 </body> 242 </html>