JS学习随手笔记

  • ===================字符串=====================
  • 字符串中间的空格也是要算长度的。
  • 每一个字符都可以返回对应的Unicode 编码
  • 文字的简单加密都是通过charCodeAt()方法得到 Unicode 编码(一个数字), 再减掉一定的值,最后用fromCharCode()方法将前者转为字符,就完成了加密。
  • 字符串之间比较大小,先比较第一位的  Unicode 编码 大小!
  • split()切割字符串会把他们放进一个数组。
  • 用字符串的方法可以完成一个查找并替换文本的功能。
  • 字符串的长度 不能设置!! 只能读取!
  • 颠倒字符串 先将字符串 切割成数组,用数组的颠倒方法 ,最后将 数组 转换成字符串就好。
  • ===================JSON和数组=====================
  • json的格式   var json = {'name':'leoo','age':29};
  • 读取:  json .name            json['name']
  • 设置:  json .name = '李旺'      json['name'] = '李旺' 
  • json 中可以包数组    var json = {'name':[1,2,3,5]};
  • 数组中包json    var arr= [ {'name':[1,2,3,5]}, {'name':[1,2,3,5]}]; 
  • 用下标可以很方便的读取 设置值。。。
  • 遍历json    使用 for( var attr in json){  alert(attr);  //得到的是所有的json 的 键  
  •  alert(json[attr]);  //得到所有的json的每一个键的值。  }
  • json 没有长度属性
  • 数组 和 对象 也可以用 for in 来遍历
  • 快速清空一个数组的内容可以用  arr.leng = 0
  • push() 和 unshift()方法返回一个数组新的长度值,   unshift()返回值IE67不支持。
  • pop() 和 shift() 方法分别删除数组最后一个  和  第一个 值, 并返回删除的值。
  • splice()方法可以删除   替换   增加  数组值操作, 返回值是被删除的值, 如果没有删除,返回值就是空!
  • sort()方法默认是将数组的每一个值变成字符串后进行比较。 如果要进行数组 的数字比较,可以在sort()中传递一个函数,列如:
    1 var arr2 =[4,3,8,78,92,5];
    2 arr2.sort(function(a , b){
    3    return a-b;  //   a - b 如果大于 是正数  ,a 和 b调换位置,负数 和 0,则/                  //不动  =》  从小到大的排序       b - a 则是从大到小排序。
    4 })
    //还有很多其他的 排序方法 : 希尔 、 快速 等等。。。

    随机排序, 使用 return Math.random()-0.5; 原理是一会 交换位置, 一会不交换位置,实现随机排序。

  • 随机数0-1  Math.round(Math.random())
  • 随机数0-10  Math.round(Math.random()*10)
  • 随机数5-10  Math.round(Math.random()*5+5)
  • 随机数公式 x - y   Math.round(Math.random()*(y-x)+x)
  • 随机数公式 0 - x   Math.round(Math.random()*x)
  • 随机数公式 1 - x   Math.ceil(Math.random()*x)
  • ===================Dom=====================
  • 元素的子节点 用  元素.children 属性,不用 childNodes 会包含文本节点!!
  • 元素第一个子节点 元素.firstElementChild   IE 6  7 8  用firstChild  但是,当元素没有元素子节点 而有文本节点的时候,会报错,  所以,推荐使用  children[0] 找第一个元素子节点
  • 操作兄弟节点和操作子节点需要注意文本节点的问题。
  • 父节点  parentNode   只有一个,不是集合         offsetParent 得到向上查找第一个有定位父节点   IE7以下,如果当前元素没有定位,默认是body,有则是html  。标准浏览器 IE8都是body。  IE 7及 以下,如果 haslayout被触发,则会指向这个元素 。
  • 获取指定元素的指定属性值 obj.getAttribute('value');  设置属性 obj.setAttribute(attr,value);     删除指定属性  obj.removeAttribute(attr); 
  • ie6 7 8下自定义的元素属性可以用  obj.name  obj[name]形式取得。 
  • ================BOM=======================
  • •可视区尺寸
    –document.documentElement.clientWidth
    –document.documentElement.clientHeight
    •滚动距离
    –document.body.scrollTop/scrollLeft
    –document.documentElement.scrollTop/scrollLeft
    •内容高度
    –document.body.scrollHeight
    •文档高度
    –document.documentElement.offsetHeight
    –document.body.offsetHeight
  • ================BOM=======================
  • 事件对象兼容的写法  var ev = ev || window.event;
  • onmousemove  是在指定的时间内执行一次(如果目标发生了位置移动)
  • 给元素添加的是事件处理函数,而不是事件。
  • 事件冒泡机制:  当一个元素发生一个事件(例如:click 事件)的时候,他会把发生的这个事件 传递给 父级,其父级接收到后,又向上传递给其父级,一直到 document ,这个过程叫冒泡。   当其父级,或者其 祖先元素也同样绑定了 click 事件处理函数的话, 就会执行这些事件处理函数。 (元素是否绑定事件处理函数不影响其冒泡) 
  • 例如谷歌的下拉菜单:    点击按钮的时候,下拉的菜单显示。  点击页面上除 按钮  外的其他地方,下拉菜单消失(原因: 给document 绑定了点击事件处理函数,当我们点击页面中任何一个元素的时候,都会把 点击事件 最终传递给 document 接收到  ,而document 元素又绑定了一个点击事件处理函数,于是,就执行了,下拉菜单消失)。那么同样的,当我们点击按钮的时候,点击事件也会向上传递给  document 接收到 ,他也会执其绑定的仪的点击事件处理函数===》 就是让下拉菜单隐藏 ,这个时候,我们得让点击按钮的时候,阻止事件冒泡。
  • 阻止事件冒泡:event.canceBubble = true;
  • 有的时候,可以利用事件冒泡机制,只给其父亲绑定事件处理函数而实现效果。(例如:包含结构的下拉菜单,  只给其父级LI 绑定事件处理函数即可,而不是给按钮。)
  • 事件绑定的两种方法: 1.   obj.onclick = fn1;   2.  标准以及IE9+:  obj.addEventListenner('click',fn2,false);    IE9以下:  obj.addachEvent('onclick',fn2); 
  •  1 //给一个对象绑定一个事件处理函数的第一种形式
     2 //obj.onclick = fn;
     3 function fn1() {
     4     alert(this);
     5 }
     6 function fn2() {
     7     alert(2);
     8 }
     9 
    10 //document.onclick = fn1;
    11 //document.onclick = fn2;    //会覆盖前面绑定fn1
    12 
    13 //给一个对象的同一个事件绑定多个不同的函数
    14 //给一个元素绑定事件函数的第二种形式
    15 
    16 /*
    17 ie:obj.attachEvent(事件名称,事件函数);
    18     1.没有捕获
    19     2.事件名称有on
    20     3.事件函数执行的顺序:标准ie-》正序   非标准ie-》倒序
    21     4.this指向window
    22 标准:obj.addEventListener(事件名称,事件函数,是否捕获);
    23     1.有捕获
    24     2.事件名称没有on
    25     3.事件执行的顺序是正序
    26     4.this触发该事件的对象
    27 */
    28 
    29 /*document.attachEvent('onclick', function() {
    30     fn1.call(document);
    31 });
    32 document.attachEvent('onclick', fn2);*/
    33 
    34 //是否捕获 : 默认是false    false:冒泡 true:捕获
    35 
    36 /*document.addEventListener('click', fn1, false);
    37 document.addEventListener('click', fn2, false);*/
    38 
    39 function bind(obj, evname, fn) {
    40     if (obj.addEventListener) {
    41         obj.addEventListener(evname, fn, false);
    42     } else {
    43         obj.attachEvent('on' + evname, function() {
    44             fn.call(obj);
    45         });
    46     }
    47 }
    48 
    49 bind(document, 'click', fn1);
    50 bind(document, 'click', fn2);

     我们调用函数的时候一般用  fn();   其实这样也可以调用:fn.call();   call()是每一个函数下早已经定义好的方法,其默认第一个参数,可以改变 函数内部this的指向。

    1 //call 函数下的一个方法,call方法第一个参数可以改变函数执行过程中的内部this的指向,call方法第二个参数开始就是原来函数的参数列表
    2 
    3 function fn1(a, b) {
    4 alert(this);
    5 alert(a + b);
    6 }
    7 
    8 //fn1();    //window
    9 fn1.call(null, 10, 20);    //调用函数    fn1() == fn1.call()

     事件捕获: 第二种事件绑定处理函数的最后一个参数:  false  和  true  用来分别区分 设置 事件出去  的时候 触发,和事件进去的时候触发。 (事件触发的顺序是, 就像敲键盘一样,  有一个 先按下 (进去)然后再 弹起(出来)的过程。)

  •  1 window.onload = function() {
     2         
     3     var oDiv1 = document.getElementById('div1');
     4     var oDiv2 = document.getElementById('div2');
     5     var oDiv3 = document.getElementById('div3');
     6     
     7     function fn1() {
     8         alert( this.id );
     9     }
    10     
    11     /*oDiv1.onclick = fn1;
    12     oDiv2.onclick = fn1;
    13     oDiv3.onclick = fn1;*/
    14     
    15     //false = 冒泡
    16     
    17     //告诉div1,如果有一个出去的事件触发了你,你就去执行fn1这个函数
    18     /*oDiv1.addEventListener('click', fn1, false);
    19     oDiv2.addEventListener('click', fn1, false);
    20     oDiv3.addEventListener('click', fn1, false);*/
    21     
    22     //告诉div1,如果有一个进去的事件触发了你,你就去执行fn1这个函数
    23     /*oDiv1.addEventListener('click', fn1, true);
    24     oDiv2.addEventListener('click', fn1, true);
    25     oDiv3.addEventListener('click', fn1, true);*/
    26     
    27     oDiv1.addEventListener('click', function() {
    28         alert(1);
    29     }, false);
    30     oDiv1.addEventListener('click', function() {
    31         alert(3);
    32     }, true);
    33     oDiv3.addEventListener('click', function() {
    34         alert(2);
    35     }, false);
    36     //
    37     
    38 }
  • 事件绑定的取消: 1.  obj.onclick = null;    
  • 2. 第二种方式绑定的事件  取消:
  • IE  : obj.dettachEvent(事件名称,事件函数);
  • 标准: obj.removeEventListener(事件名称,事件函数,是否捕获);
  • event对象有三个属性, ctrlkey   altkey  shiftkey 分别返回 ctrl   alt  shift 三个键是否按下的布尔值。
  • 只有一些表单元素 和 A标签  以及document  可以有 焦点事件和键盘事件。
  • onkeydown:  如果按下不抬起,会连续触发。 (事实上,当你按下一个键准备输入文本,而不抬起的时候,你会发现第一个字母出来后,第二个字母需要等一下才出来,然后后续的很快就出来了,这是因为浏览器会给一定的时间来检查是否是用户误触。 但是,做游戏的时候,我们就需要解决这个问题了。 使用定时器来解决。)
  •  1 <!DOCTYPE HTML>
     2 <html>
     3 <head>
     4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     5 <title>无标题文档</title>
     6 <style>
     7 #div1 {width: 100px; height: 100px;  background: red; position: absolute;}
     8 </style>
     9 <script>
    10 window.onload = function() {
    11     
    12     var oDiv = document.getElementById('div1');
    13     var timer = null;
    14     
    15     //不是所有元素都能够接收键盘事件,能够响应用户输入的元素,能够接收焦点的元素就能够接收键盘事件
    16     
    17     //onkeydown : 如果按下不抬起,那么会连续触发
    18     //定时器
    19     document.onkeydown = function(ev) {
    20         
    21         var ev = ev || event;
    22         
    23         switch(ev.keyCode) {
    24             case 37:
    25                 clearInterval(timer);
    26                  timer = setInterval(function(){
    27                     oDiv.style.left = oDiv.offsetLeft - 5 + 'px';
    28                 },20)
    29                 
    30                 break;
    31             case 38:
    32                 clearInterval(timer);
    33                  timer = setInterval(function(){
    34                     oDiv.style.top = oDiv.offsetTop - 5 + 'px';
    35                 },20)
    36                 break;
    37             case 39:
    38                 clearInterval(timer);
    39                  timer = setInterval(function(){
    40                     oDiv.style.left = oDiv.offsetLeft + 5 + 'px';
    41                 },20)
    42                 break;
    43             case 40:
    44                 clearInterval(timer);
    45                  timer = setInterval(function(){
    46                     oDiv.style.top = oDiv.offsetTop + 5 + 'px';
    47                 },20)
    48                 break;
    49         }
    50         
    51     }
    52 
    53     document.onkeyup = function(ev) {
    54         clearInterval(timer);
    55     }
    56     
    57 }
    58 </script>
    59 </head>
    60 
    61 <body>
    62     <div id="div1"></div>
    63 </body>
    64 </html>
  • 取消默认事件:    1.  return false;(用于 使用第一种方式绑定的事件处理函数 和 IE下 使用 第二种方式绑定的事件处理函数)      2.  ev.preventDefault(); (用于 标准浏览器使用第二种方式绑定的事件处理函数。)
  • =========================JS中的运动====================================
  • JS中读取CSS值的时候,会把小数四舍五入, 而在CSS中,是可以设置并且应用一些带小数的值。所以,在做有些效果,比如 缓冲运动的时候, 需要 向上或者向下取整。
  •  1 <!DOCTYPE HTML>
     2 <html>
     3 <head>
     4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     5 <title>无标题文档</title>
     6 <style>
     7 #div1 {100px; height: 100px; background: red; position: absolute; left: 0px; top: 30px;}
     8 </style>
     9 <script>
    10 //摩擦,减速 : 在运动过程中,速度越来越慢
    11 //愈接近目标点,速度就越小
    12 window.onload = function() {
    13     
    14     var oBtn = document.getElementById('btn');
    15     var oDiv = document.getElementById('div1');
    16     var iTimer = null;
    17     
    18     oBtn.onclick = function() {
    19         
    20         clearInterval(iTimer);
    21         var iSpeed = 0;
    22         
    23         iTimer = setInterval(function() {
    24             
    25             iSpeed = (500 - oDiv.offsetLeft) / 8;
    26             
    27             iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
    28             
    29             console.log( oDiv.offsetLeft + ' : ' + iSpeed );
    30             
    31             if (oDiv.offsetLeft == 500) {
    32                 clearInterval(iTimer);
    33             } else {
    34                 oDiv.style.left = oDiv.offsetLeft + iSpeed + 'px';
    35             }
    36             
    37         }, 30);
    38         
    39     }
    40     
    41 }
    42 </script>
    43 </head>
    44 
    45 <body>
    46     <input type="button" value="动起来" id="btn" />
    47     <div id="div1"></div>
    48 </body>
    49 </html>
  • 加入缓冲的运动框架:
  •  1 <!DOCTYPE HTML>
     2 <html>
     3 <head>
     4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     5 <title>无标题文档</title>
     6 <style>
     7 #div1 {100px; height: 100px; background: red; position: absolute; left: 0px; top: 30px; left: 400px;}
     8 </style>
     9 <script>
    10 window.onload = function() {
    11     
    12     var oDiv1 = document.getElementById('div1');
    13     
    14     oDiv1.onclick = function() {
    15         
    16         /*startMove(this, {
    17             width : 200
    18         }, function() {
    19             startMove(this, {
    20                 height : 200
    21             });
    22         });*/
    23         
    24         startMove(this, {
    25             width : 200,
    26             height : 200
    27         });
    28     }
    29     
    30     function startMove(obj, json, fn) {
    31         clearInterval(obj.iTimer);
    32         var iCur = 0;
    33         var iSpeed = 0;
    34             
    35         obj.iTimer = setInterval(function() {
    36             
    37             var iBtn = true;
    38                         
    39             for ( var attr in json ) {
    40                                 
    41                 var iTarget = json[attr];
    42                 
    43                 if (attr == 'opacity') {
    44                     iCur = Math.round(css( obj, 'opacity' ) * 100);
    45                 } else {
    46                     iCur = parseInt(css(obj, attr));
    47                 }
    48                 
    49                 iSpeed = ( iTarget - iCur ) / 8;
    50                 iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
    51                 
    52                 if (iCur != iTarget) {
    53                     iBtn = false;
    54                     if (attr == 'opacity') {
    55                         obj.style.opacity = (iCur + iSpeed) / 100;
    56                         obj.style.filter = 'alpha(opacity='+ (iCur + iSpeed) +')';
    57                     } else {
    58                         obj.style[attr] = iCur + iSpeed + 'px';
    59                     }
    60                 }
    61                 
    62             }
    63             
    64             if (iBtn) {
    65                 clearInterval(obj.iTimer);
    66                 fn && fn.call(obj);
    67             }
    68             
    69         }, 30);
    70     }
    71     
    72     function css(obj, attr) {
    73         if (obj.currentStyle) {
    74             return obj.currentStyle[attr];
    75         } else {
    76             return getComputedStyle(obj, false)[attr];
    77         }
    78     }
    79     
    80 }
    81 </script>
    82 </head>
    83 
    84 <body>
    85     <div id="div1"></div>
    86 </body>
    87 </html>
原文地址:https://www.cnblogs.com/wanqiu/p/4453634.html