鱼C论坛

 找回密码
 立即注册
查看: 2563|回复: 1

[学习笔记] Javascript第一天学习之路

[复制链接]
发表于 2018-4-18 10:28:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
前言:
       今天是第一天正式学javascript.. 也是有好些语言基础的底子下
        其实早就看不二老湿的html5了, 只是跟着文字版敲完了html css 没有跟着学javascript...
        当然主要因为是懒....本来以为我不会接触太多这些前端..然后沉迷上了python爬虫
        也间接学了很多html 和 很多网络知识..  发现爬虫想解掉js加密反爬 得要牢固一下js
        爬虫还是得懂很多前端知识...和数据库知识  数据库还好 以前有接触 感觉冥冥之中向全栈工程师靠近了  

第一天嘛..都是学些javascript历史,,和一些基本用法..

        (1)var类型 定义变量为任何类型
                如:  
                        注意的是 赋值得用分号 代表语句结束. 也许很常见 但是javascript不像c++ java..它也并不是每条句子都用分号..但是赋值一般会用分号.(也就是说没意义的可以不加分号)
                        var a = "string";
                        var b = 1;
                        var c = 1.0;
                        var d = [1,2,3,4];
                        var e = {
                                type:"对象",
                                topic:"哈哈哈"
                                };
                       
                        通过花括号定义的为对象,,,对象是名/值对的集合, 基本跟python的字典类型一模一样....
                       
        (2)对象属性
                如:
                        e.topic 或 e.type 可以直接访问已有属性

                        也可以创建一个新的属性并赋初值:  e.author = "咸鱼"; e[author] = "咸鱼";
                        它的属性也可以是对象...e.content = {}
                        学过python的字典的都知道字典的值可以为任意类型..这个用在javascript对象的值对里也是一个道理
       
        (3)定义函数
                如:        参数可选,这里不多作介绍..函数一个道理
                        function(){
                                .....
                        }

        (4)对象方法:
                如下列代码演示:
               
  1. function Point(x,y){
  2.                 this.x = x;
  3.                 this.y = y;
  4. }
  5. var p = new Point(1,1);

  6. //  new method
  7. Point.prototype.r = function(){
  8.                 return Math.sqrt(this.x *this.x + this.y*this.y)
  9. };

  10. // method call
  11. p.r()
复制代码

       
        其中prototype为定义函数方法.. r是函数名称
       
        (算法运算不多作介绍 基本一致)
        (5)内置方法:
                var a = [];
                a.push(1,2,3) //加入值
                a.reverse(); //倒转
                等等.....

        (6)介绍客户端javascript
                javascript一般都内嵌网页比较多吧..
               
                所以这第一天的看写代码开始吧..
                基于javascript实现的贷款计算器:
               
  1. <!DOCTYPE html>
  2. <html>
  3.         <head>
  4.                 <title>JavaScript Loan Calculator</title>
  5.                 <style>
  6.                         /*这是一个css样式表: 定义了程序输出的样式*/
  7.                         /* 计算结果定义为粗体 */
  8.                         .output{
  9.                                 font-weight: bold;
  10.                         }
  11.                         /* 定义id="payment"的元素样式 下划线 */
  12.                         #payment{
  13.                                 text-decoration: underline;
  14.                         }
  15.                         /* 图表有一个1像素的边框 */
  16.                         #graph{
  17.                                 border: solid black 1px;
  18.                         }
  19.                         /* 表格单元格对齐方式为顶端对齐 */
  20.                         th, td{
  21.                                 vertical-align: top;
  22.                         }
  23.                 </style>
  24.         </head>
  25.         <body>
  26.                 <!--
  27.                         这是一个HTML表格, 其中包含<input>元素可以用来输入数据.
  28.                         程序将在<span>元素中显示计算结果,这些元素都具有类似"interset"和"years"的id.
  29.                         这些id将在表格下面的javascript代码中用到.我们注意到,
  30.                         有一些input元素定义了"onchange"或"onclick"事件处理程序,
  31.                         以便用户在输入数据或者点击inputs时执行指定的javascript代码段.
  32.                 -->
  33.                 <table>
  34.                         <tr>
  35.                                 <th>Enter Loan Data:</th>
  36.                                 <td></td>
  37.                                 <th>Loan Balance, Cumulative Equity, and Interest Payments</th>
  38.                         </tr>
  39.                         <tr>
  40.                                 <td>Amount of the loan ($):</td>
  41.                                 <td><input id="amount" onchange="calculate();"></td>
  42.                                 <td rowspan=8>
  43.                                         <canvas id="graph" width="400" height="250"></canvas>
  44.                                 </td>
  45.                         </tr>
  46.                         <tr>
  47.                                 <td>Annual interest (%):</td>
  48.                                 <td><input id="apr" onchange="calculate();"></td>
  49.                         </tr>
  50.                         <tr>
  51.                                 <td>Repayment period (years):</td>
  52.                                 <td><input id="years" onchange="calculate();"></td>
  53.                         </tr>
  54.                         <tr>
  55.                                 <td>Zipcode (to find lenders):</td>
  56.                                 <td><input id="zipcode" onchange="calculate();"></td>
  57.                         </tr>
  58.                         <tr>
  59.                                 <th>Approximate Payments:</th>
  60.                                 <td><button onclick="calculate();">Calculator</button></td>
  61.                         </tr>
  62.                         <tr>
  63.                                 <td>Monthly payment:</td>
  64.                                 <td>$<span class="output" id="payment"></span></td>
  65.                         </tr>
  66.                         <tr>
  67.                                 <td>Total payment:</td>
  68.                                 <td>$<span class="output" id="total"></span></td>
  69.                         </tr>
  70.                         <tr>
  71.                                 <td>Total interest:</td>
  72.                                 <td>$<span class="output" id="totalinterest"></span></td>
  73.                         </tr>
  74.                         <tr>
  75.                                 <th>Sponsors:</th>
  76.                                 <td colspan=2>
  77.                                         Apply for your loan with one of these fine lenders:
  78.                                 <div id="lenders"></div>
  79.                                 </td>
  80.                         </tr>
  81.                 </table>
  82.                 <!--
  83.                         随后是javascript代码, 这些代码内嵌在了一个<script>标签里
  84.                         通常情况下, 这些代码代码应当放在<head>标签中
  85.                         将javascript代码放在HTML代码之后仅仅是为了便于理解
  86.                 -->
  87.                 <script>
  88.                         "use strict"; //如果浏览器支持 开启(javascript)ECMAScript 5的严格模式
  89.                         /*
  90.                                 这里的代码定义caculate()函数, 在HTML代码中绑定事件处理程序时会调用它
  91.                                 这个函数从<input>元素中读取数据, 计算货款赔付信息, 并将结果显示在<span>元素中
  92.                                 同样, 这里还保存了用户数据、展示了放贷人链接并绘制出了图表

  93.                         */
  94.                         function calculate(){
  95.                                 //查找文档中用于输入输出的元素
  96.                                 var amount = document.getElementById("amount");
  97.                                 var apr = document.getElementById("apr");
  98.                                 var years = document.getElementById("years");
  99.                                 var zipcode = document.getElementById("zipcode");
  100.                                 var payment = document.getElementById("payment");
  101.                                 var total = document.getElementById("total");
  102.                                 var totalinterest = document.getElementById("totalinterest");
  103.                                
  104.                                 // 假设所有的输入都是合法的, 将从input元素中获取输入数据
  105.                                 // 将百分比格式转换为小数格式, 并从年利率转换为月利率
  106.                                 // 将年度赔付转换为月度赔付
  107.                                 var principal = parseFloat(amount.value);
  108.                                 var interset = parseFloat(apr.value) / 100 / 12;
  109.                                 var payments = parseFloat(years.value) * 12;
  110.                                
  111.                                 // 现在计算月度赔付的数据
  112.                                 var x = Math.pow(1 + interset, payments);
  113.                                 var monthly = (principal * x * interset) / (x - 1);
  114.                                
  115.                                 // 如果结果没有超过javascript能表示的数字范围, 且用户的输入也正确
  116.                                 // 这里所显示的结果就是合法的
  117.                                 if(isFinite(monthly)){
  118.                                         // 将数据填充至输出字段的位置, 四舍五入到小数点后两位数字
  119.                                         payment.innerHTML = monthly.toFixed(2);
  120.                                         total.innerHTML = (monthly * payments).toFixed(2);
  121.                                         totalinterest.innerHTML = ((monthly * payments) - principal).toFixed(2);
  122.                                        
  123.                                         // 将用户的输入数据保存下来, 这样在下次访问时也能取到数据
  124.                                         save(amount.value, apr.value, years.value, zipcode.value);
  125.                                        
  126.                                         // 找到并展示本地放贷人, 但忽略网络错误
  127.                                         try{
  128.                                                 getLenders(amount.value, apr.value, year.value, zipcode.value);
  129.                                         }catch(e){}
  130.                                        
  131.                                         // 最后, 用图表展示贷款余额、利息和资产收益
  132.                                         chart(principal, interset, monthly, payments);
  133.                                 }
  134.                                 else{
  135.                                         // 计算结果不是数字或者是无穷大, 意味着输入数据是非法或不完整的
  136.                                         // 清空之前的输出数据
  137.                                        
  138.                                         payment.innerHTML = ""; // 清空元素的文本内容
  139.                                         total.innerHTML = "";
  140.                                         totalinterest.innerHTML = "";
  141.                                         chart(); // 不传参数的话就算清除图表
  142.                                 }
  143.                                
  144.                         }
  145.                         // 将用户的输入保存至localStorage对象的属性中
  146.                         // 这些属性在再次访问时还会继续保持在原位置
  147.                         // 如果你再浏览器中按照file://URL的方式直接打开本地文件,
  148.                         // 则无法再某些浏览器中使用存储功能(如: firefox)
  149.                         // 而通过HTTP打开文件是可行的
  150.                         function save(amount, apr, years, zipcode){
  151.                                 if(window.localStorage){
  152.                                         localStorage.loan_amount = amount;
  153.                                         localStorage.loan_apr = apr;
  154.                                         localStorage.loan_years = years;
  155.                                         localStorage.loan_zipcode = zipcode;
  156.                                 }
  157.                         }
  158.                         // 在文档首次加载时, 将会尝试还原输入字段
  159.                         window.onload = function(){
  160.                                 // 如果浏览器支持本地存储并且上次保存的值是存在的
  161.                                 if(window.localStorage && localStorage.loan_amount){
  162.                                         document.getElementById("amount").value = localStorage.loan_amount;
  163.                                         document.getElementById("apr").value = localStorage.loan_apr;
  164.                                         document.getElementById("years").value = localStorage.loan_years;
  165.                                         document.getElementById("zipcode").value = localStorage.loan_zipcode;
  166.                                 }
  167.                         };
  168.                        
  169.                         // 将用户的输入发送至服务器端代码(理论上)
  170.                         // 将返回一个本地放贷人的链接列表, 在这个例子中并没有实现这种查找放贷人的服务
  171.                         // 但如果该服务存在, 该函数会使用它
  172.                         function getLenders(amount, apr, years, zipcode){
  173.                                 // 如果浏览器不支持XMLHttpRequest对象, 则退出
  174.                                 if(!window.XMLHttpRequest) return;
  175.                                 // 找到要显示放贷人列表的元素
  176.                                 var ad = document.getElementById("lenders");
  177.                                 if(!ad) return; // 如果返回为空,则退出
  178.                                 // 将用户的输入数据进行URL编码, 并作为查询参数附加在URL里
  179.                                 // 处理数据的URL地址  使用查询串中的数据
  180.                                 var url = "getLenders.php" + "?amt=" + encodeURIComponent(amount) +
  181.                                                 "&apr=" + encodeURIComponent(apr) + "&yrs=" + encodeURIComponent(years) +
  182.                                                 "&zip=" + encodeURIComponent(zipcode);
  183.                                
  184.                                 // 通过XMLHttpRequest对象来提取返回数据
  185.                                 var req = new XMLHttpRequest();  // 发起一个新的请求
  186.                                 req.open("GET", url); // 通过URL发起一个HTTP GET请求
  187.                                 req.send(null); //不带任何正文发送这个请求
  188.                                
  189.                                 // 在返回数据之前, 注册一个事件处理函数, 这个处理函数
  190.                                 // 将会在服务器的响应返回至客户端的时候调用
  191.                                 // 这种异步编程模型在客户端javascript中是非常常见的
  192.                                 req.onreadystatechange = function(){
  193.                                         if(req.readyState == 4 && req.status == 200){
  194.                                                 // 如果代码运行到这里, 说明我们得到了一个合法且完整的http响应
  195.                                                 var response = req.responseText; // HTTP响应是以字符串的形式呈现的
  196.                                                 var lenders = JSON.parse(response); // 将其解析为JS数组
  197.                                                
  198.                                                 // 将数组中的放贷人对象转换为HTML字符串形式
  199.                                                 var list = "";
  200.                                                 for(var i = 0; i < lenders.length; i++){
  201.                                                         list += "<li><a href='" + lenders[i].url + "'>" +
  202.                                                                         lenders[i].name + "</a>";
  203.                                                 }
  204.                                                
  205.                                                 // 将数据在HTML元素中呈现出来
  206.                                                 ad.innerHTML = "<ul>" + list + "</ul>";
  207.                                         }
  208.                                 }
  209.                         }
  210.                         // 在HTML<canvas>元素中用图表展示月度贷款余额、利息和资产收益
  211.                         // 如果不传入参数的话, 则清空之前的图表数据
  212.                         function chart(principal, interest, monthly, payments){
  213.                                 var graph = document.getElementById("graph"); // 得到<canvas>标签
  214.                                 graph.width = graph.width; // 用一种巧妙的手法清楚并重置画布
  215.                                
  216.                                 // 如果不传入参数, 或者浏览器不支持画布, 则直接返回
  217.                                 if(arguments.length == 0 || !graph.getContext) return;
  218.                                
  219.                                 // 获得画布元素的"context"对象, 这个对象定义了一组绘画API
  220.                                 var g = graph.getContext("2d"); // 所有的绘画操作都将基于这个对象
  221.                                 var width = graph.width, height = graph.height; // 获得画布大小
  222.                                
  223.                                
  224.                                 // 这里的函数作用是将付款数字和美元数据转换为像素
  225.                                 function paymentToX(n){
  226.                                         return n * width / payments;
  227.                                 }
  228.                                 function amountToY(a){
  229.                                         return height - (a * height / (monthly * payments * 1.05));
  230.                                 }
  231.                                
  232.                                 // 付款数据是一条从(0,0)到(payments, monthly * payments)的直线
  233.                                 g.moveTo(paymentToX(0), amountToY(0)); // 从左下方开始
  234.                                 g.lineTo(paymentToX(payments), amountToY(monthly * payments)); // 绘至右上方
  235.                                 g.lineTo(paymentToX(payments), amountToY(0)); // 再至右下方
  236.                                 g.closePath(); // 将结尾连接至开头
  237.                                 g.fillStyle = "#f88"; // 亮红色
  238.                                 g.fill(); // 填充矩形
  239.                                 g.font = "bold 12px sans-serif"; // 定义一种字体
  240.                                 g.fillText("Total Interest Payments", 20, 20);
  241.                                
  242.                                 // 很多资产数据并不是线性的, 很难将其反映至图表中
  243.                                 var equity = 0;
  244.                                 g.beginPath(); // 开始绘制新图形
  245.                                 g.moveTo(paymentToX(0), amountToY(0)); // 从左下方开始
  246.                                 for(var p = 1; p <= payments; p++){
  247.                                         // 计算出每一笔赔付的利息
  248.                                         var thisMonthsInterest = (principal - equity) * interest;
  249.                                         equity += (monthly - thisMonthsInterest); // 得到资产额
  250.                                         g.lineTo(paymentToX(p), amountToY(equity)); // 将数据绘制到画布上
  251.                                        
  252.                                 }
  253.                                 g.lineTo(paymentToX(payments), amountToY(0)); // 将数据线绘制至x轴
  254.                                 g.closePath(); // 将线条结尾连接至线条开头
  255.                                 g.fillStyle = "green"; // 使用绿色绘制图形
  256.                                 g.fill(); // 曲线之下的部分均填充
  257.                                 g.fillText("Total Equity", 20, 35);
  258.                                
  259.                                 // 再次循环, 月数据显示为黑色粗线条
  260.                                 var bal = principal;
  261.                                 g.beginPath();
  262.                                 g.moveTo(paymentToX(0), amountToY(bal));
  263.                                 for(var p = 1; p <= payments; p++){
  264.                                         var thisMonthsInterest = bal * interest;
  265.                                         bal -= (monthly - thisMonthsInterest); // 得到资产额
  266.                                         g.lineTo(paymentToX(p), amountToY(bal)); // 将直线连接至某店
  267.                                        
  268.                                 }
  269.                                 g.lineWidth = 3; // 将直线宽度加粗
  270.                                 g.stroke(); // 绘制余额的曲线
  271.                                 g.fillStyle = "black"; // 使用黑色字体
  272.                                 g.fillText("Loan Balance", 20, 50); // 图例文字
  273.                                
  274.                                 // 将年度数据在X轴做标记
  275.                                 g.textAlign = "center"; // 文字居中对齐
  276.                                 var y = amountToY(0); // Y坐标设为0
  277.                                 for(var year = 1; year * 12 <= payments; year++){
  278.                                         // 遍历每年
  279.                                         var x = paymentToX(year * 12); // 计算标记位置
  280.                                         g.fillRect(x - 0.5, y - 3, 1, 3); // 开始绘制标记
  281.                                         if(year == 1) g.fillText("Year", x, y - 5); // 在坐标轴做标记
  282.                                         if(year % 5 == 0 && year * 12 !== payments)
  283.                                                 g.fillText(String(year), x, y - 5);
  284.                                 }
  285.                                
  286.                                 // 将赔付数额标记在右边界
  287.                                 g.textAlign = "right"; // 文字右对齐
  288.                                 g.textBaseline = "middle"; // 文字垂直居中
  289.                                 var ticks = [monthly * payments, principal]; // 我们将要用到的两个点
  290.                                 var rightEdge = paymentToX(payments);
  291.                                 for(var i = 0; i < ticks.length; i++){
  292.                                         // 对每两个点做循环
  293.                                         var y = amountToY(ticks[i]); // 计算每个标记的Y坐标
  294.                                         g.fillRect(rightEdge - 3, y - 0.5, 3, 1); // 绘制标记
  295.                                         g.fillText(String(ticks[i].toFixed(0)), rightEdge - 5, y);
  296.                                 }
  297.                        
  298.                         }
  299.                        
  300.                        
  301.                 </script>
  302.         </body>

  303. </html>
复制代码

                       
没错..300左右行代码..
今天写完这个的时候 还是很多粗心错误..
还好会用web调试器.
调完成功.. canvas数据线也相应出来 大功告成
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-18 11:09:01 | 显示全部楼层
很棒呦,建议发在web区,学习笔记
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 05:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表