• 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>
  • 相关阅读:
    Codeforces #533 div2 做题记录
    算法竞赛模板 打印素数表
    算法竞赛模板 计算组合数
    Educational Codeforces Round 34 (Rated for Div. 2)
    ACM感悟 -----sdust
    Codeforces Round #450 (Div. 2)
    EOJ Monthly 2017.12
    Wannafly挑战赛5
    二分图匹配
    今日颓废
  • 原文地址:https://www.cnblogs.com/shenfengok/p/2579202.html
Copyright © 2020-2023  润新知