JS基础笔记集

three.js:3D框架  svg
tween:动画框架

一.js事件的组成:on+事件名,当触发某个事件做一些事情;
   如:onclick:当点击鼠标,触发的事件;

二.在写一个页面时,结构(html)、样式(css)和行为(js)是要分离出来的;
    好处:代码可复用,可读性好,可维护性好;

三.通过js获取元素方法:
    1>通过元素中的id名,获取元素:document.getElementById("id名");
    2>通过元素名,直接获取元素:getElementsByTagName("元素名");这里获取后,返回的是集合,是一组元素;
        (1)用法:
               a.document.getElementsByTagName("标签名");
               b.元素.getElementsByTagName("标签名");
        (2)查看取到集合的长度:使用length;
               console.log(要打印的内容):向控制台里面输入要打印的内容;
        (3)当取一个集合里面的内容的时候,要用到下标(数字),这个集合的下标是从0开始的;
        (4)获取设置属性值的方式:点(.)
                如果属性名,不符合变量的命名规则,要用到[]
                    如:abc.0 ---->  这里的0,abc里面没有0这个属性,不可以使用点的方式。要用abc[0];

四.函数的定义:
    function (){} //匿名
    function show(){};

五.函数的调用:
        函数名();
        事件调用;
   注:函数定义后,一定要调用才有会意义;

六.操作元素:
    1>第一种形式:点(.)
    获取:
            1. oDiv.style.width 形式只能获取行间的样式;
            2. class:是一个保留字,属性的名也不能用保留字命名;
        注意:如果要获取class的值,需要用到className;
            3. innerHTML获取元素里面的内容;
        赋值:
            oDiv.innerHTML = "abc";
            赋值的过程:先清空掉元素里面的值,在赋值新的值;

七.变量:
    作用:用来存放数据;
    写法:var 变量名 = 要存放的数据;
    好处:存一次,可以多次复用,把复杂的数据简单化;
    变量名的规则:

    1. 是由数字、字母、下划线、$组合而成的;
     如:ab a_b a$b a0b...
    注意:变量名不能用数字开头;不允许的:0ab 1ab 0 1;

    2. 不能使用保留字和关键字;
     关键字:js语法中正在使用的单词;
            如:var function...
     保留字:可能js以后用到的单词;
      如:class...

八.window.onload:(先加载再执行)
    当页面的资源加载完成之后,会触发这个事件,执行后面的函数;
    cssText:批量设置样式的,先清空掉设置在行间中的样式,在设置新的样式值;

九.变量命名风格:
  1. 匈牙利命名法:
        o + 单词  o代表的就是object;
        如:oDiv oBtn oInput
    a +单词  a代表的就是array;
            如:aLi aDiv
        i + 单词 i 代表的是int;
            如:iNum

  2.驼峰命名法:
        1>多个单词组合而成的命名的时候,第一个单词不大写,后面的单词首字母大写;
            如:oneDiv  oDivWidth oDivHeight
        2>复合样式用作属性的时候,同样的遵循变量的命名规则
            style属性下有很多的复合样式;
         如:font-size  background-color margin-top
            注:把复合样式中间的-去掉,跟的后面的单词首字母大写;

十.流程控制:
    1>for循环:
        语法:for(初始化;条件;自增){循环体};
            a.初始化:准备循环的工作,可以写也可以不写;
            b.条件:如果这个条件为真(成立),进入循环体执行代码。如果这个条件始终为true,就会死循环;
            c.自增:当循环体结束后 ,再把初始得值自增;
        for循环中的break与continue;
            break:当程序执行遇到break时,停止运行for循环,break后面的内容是不会在运行;
            continue:当程序执行遇到continue时,会跳过当前循环,后面程度不执行;

    2>if判断:
        语法:(1).if(条件){ 代码体 };当条件成立,为true时,执行代码体中的程序,否则直接执行后面代码;
              (2).if(条件){ //当条件成功立,执行代码体,否则执行代码体1;
                    代码体
                  }else{
                    代码体1
                  }
        说明:在进行判断时,注意以下几点:
              (1).img标签中的src,不可以作判断。因为得到的是绝对路径;(标签中的src可读可写)
              (2).a标签中的href,不可以作判断。因为得到的是绝对路径的地址;(标签中的href可读可写)
              (3).background属性中的url、color值,都不可以作判断;

    3>三目:
        语法:条件 ? 执行1 :执行2;
        说明:当条件成立,为true时,程序走"执行1"中的代码;为false时,程序走"执行2"中的代码;
              这里的条件,默认为true;
        例:var onOff = true,num = 0;
            onOff ? num = 10 : num = -100;

    4>switch  case: 相当于if else if的另一种写法
        语法:
             switch(变量){
              case 值1:
                  //当变量满足值1的时候,执行的代码
              break; //终止向下运行
              case 值2:
               //当变量满足值1的时候,执行的代码
              break; //终止向下运行
              case 值3:
               //当变量满足值1的时候,执行的代码
              break; //终止向下运行
              default:
               //以上条件都不满的时候执行的代码
              [break]
        说明:当判断一个变量的值有不同结果,执行不同的代码的时候 ,可以用switch代替if;

十一.运算符:参与运算的符号;
       运算数:参与运算的值;
         1.算术运算:+ , - , * , / , %;

         2.赋值运算:= += -= *= /= %=;
            a.%:取模/取余/取得都是整数;
                 例:a % b;
                     a> 当a比b大,取两数相除的余数(取的是整数);
                     b> 当a比b小,运算后的就是a;
                     c> 当a等于b,运算后得0;

         3.比较运算:== === >= <= != !== > <;
           【=、==、===】:
               a.=:是赋值的意思
               b.==:比较的是值,不会比较类型,会进行一次类型转换;(这个比较耗性能,因为每次比较都要转换)
                    a).两边的值相等的话,返回的是true(真)
                 b).两边的值不相等的话,返回的是false(假)
               c.===:先比较类型,再比较值;(最好用这个,性能好)

         4.逻辑运算:&& 与,|| 或 ! 非;
            a.&&(与/并且):两边的值都为真,那么整体为真。
             1>如果前面为真,返回后面的值(无论真假都返回);
             2>如果前面为假,就返回前面的值;

            b.||(或/或者):两边只要有一个为真,整体就为真。
             2>如果前面为真,返回前面的值;
             3>如果前面的假,返回后面的值(无论真假都返回);

            c.!(非) 用法:!数据
                操作过程:先把数据转换为布尔值,然后取反;
                !!+数据:先把数据转换为布尔值,然后取反,再取反;(最后取的是本身的布尔值)

         5.typeof:测试返回数据的类型,属于运算符;
            使用方法:
              typeof 数据
           typeof(数据) 不建议使用的
            typeof运算后取的类型值:
            1. "number"
                 2. "string"
            3. "boolean"
            4. "undefined"
            5. "object"
            6. "function"
            typeof返回的类型值跟数据类型有区别
              特殊:
                   1.null  返回的是 "object";
                     2.function(){}  返回的是"function";

     说明:比较运算和逻辑运算后,整体会返回一个布尔值;

十二.this:
    含义:哪一个对象调用了这个函数,那么这个函数里面的this就指向调用的那个对象;
    调用方法:this一共有6种调用方法;
    在全局中,this指的是window;如:var a =0;  console.log(this.a); //这里this指的就是window;
    1> 函数调用:
        如:function abc(){
            this.value; //谁调用这个函数,this指的就是谁
        }

    2> 事件调用:
        如:var oDiv = document.getElementById("div");
            oDiv.onclick = function (){
                this.style.background = "red";   //这里的this,指的是调用onclick事件的div;
            }

    3> 定时器调用:
        如:setTimeout(function(){
                //定时器里面的函数,永远是被window调用的,所以这里的this指的是window;
                console.log(this);
            });

    4> 对象调用:

    5> 构造函数调用:

    6> 原型链调用:

十三.路径说明:"./":代表当前路径,在开发过程中,要把./写上,为的是所有服务器都认得;
               "../":上一层文件路径;
     如何去掉a标签默认链接的点击行为:在href中写"javascript:void(0);";

十六.数据类型:
     数据类型,可以分为两种类型:1>基本数据类型;2>复合数据类型;
     1>基本数据类型为:
         1. Number类型;
            整数:0 1 2 3,-2...
            浮点数: 0.1,1.4...
            取值范围:+Infinity 和 -Infinity(正无穷和负无穷);
         2.String类型:一对单引号或者双引号包含的内容,内容有0个或者多个字符组成;
            空字符串:"",''
            引号是成双成对的,"",''
            不能够写成 " ';
         3.Boolean类型:
            只有两个值:true false;做判断用;
         4.Null类型:
            只有一个值null;
            作用:申明了一个变量,还不知道这个变量要存的值,用null来占位;
         5.undefined类型:
            只有一个值undefined;
            声明一个变量,不给这个变量赋值,那么这个变量的默认值为undefined。
     2>复合数据类型:(是由N多个简单(基本)数据类型组合而成)
         6.Object类型:
            值为上面五种类型的组合,数组,json对象...[]和{};

十七.数据类型转换:把一种数据类型转换成其他的类型;
     1>类型转换的方式:
         1)显式(强制)类型转换:自己手动去转;
         2)隐式类型转换:在操作的时候自动转换;
     1)显式类型转换:
         1. 转换成Number类型:(转换的简写方式:+数据)
                Number(值):把值转换成Number类型(这是严格转换);
            转换情况:
                无参数时:Number();// 0
                有参数时:
                    a.String => :
                        1. 空字符串或空白字符串 -> 0
                        2. 纯数字的字符串 -> 相对应的字符串内容
                        3. 其余的 - > NaN
                    b. number => number
                    c. undefined => NaN
                    d. null => 0
                    e. boolean => true:1,false:0
                    f. object =>
                       {} -> NaN
                       [] -> 0
         2. 转换成String类型:(转换的简写方式:"" + 数据)
                String(值):转换成String类型;
         3. 转换成Boolean类型:
              Boolean(值):转换成Boolean类型;
                1). 空字符串 => false 非空字符串 => true
           2). 0 => false 非0 => true
           3). 对象 => true
           4). undefined和null => false
           5). NaN =>false
          *总结:" "(空字符串) , 0 , undefined , null , NaN ====>>>这五个转boolean类型都是false;
         参考网址:http://www.fengfly.com/document/ECMAScript5.1/#203

         4.parseInt(值):转换成整数,非严格转换;
            转换方式:
                1)从左向右转换,转换的第一个字符为数字时,会继续向后转,
                      当遇到非数字的字符时,会停止转换,只返回之前可以转换的数字;
                2)当转换的第一个字符为非数字时,会直接返回NaN,不会再继续向后转;

         5.parseFloat(值):转换成浮点数,非严格转换;
             转换方式:
                 与parseInt的转换方式一样;
         6.toFixed(num):小数位数保留num个;
                例:var a =23.445;
                    alert(a.toFixed(2));//弹出23.44  保留了2位小数;

     2)隐式类型转换:
            进行某些操作时,我们没有进行类型转换,但是为了能够正常的运行,系统就会进行类型转换;
       "+ - * / < >" 遇到这些,会存在隐式类型转换;
            1> "+"
                1. 算术,当两边都为数字的时候,那么值就为两边的数字之和;
                2. 字符串连接,当一边为字符串的时候,另一边为数字的时候,那么先把数字转成字符串,进行连接;
脑垂体瘤
            2>"- * / ":做算术用
                当一边为字符串的时候,试图先把字符串转换成数字(调的是Number());
                如果转成了数字,那么计算两数之差;如果转成了NaN,那么结果就为NaN;

            3>NaN和任何值运算都为NaN
扁桃体
            4> "< >":
                当一边为字符串的时候,另一边为数字的时候,先试图把字符串转成数字,然后进行比较;

     3>NaN:Not a Number不是数字的数字;
           a.在比较时:和任何值比较都是不相等的,包括自己;
           b.如果值不能转成数字,返回的就是NaN;
     说明:NaN不是一个类型,但是typeof 返回的是number类型的;

     4>isNaN(值):判断值是不是NaN;
            a.如果值是NaN的话,返回true;
            b.如果是数字,返回false;
     说明:isNaN会隐式转换,调用的方法Number;

     5>数据类型转换规则:
        a.如果只有一个值,判断这个值是真还是假,遵循只有:0、NaN、""、undefined、null 这五个是false,其余都为true;
        b.如果两个值比较相等,遵循以下规则:
              1>对象==对象:永远不相等;
              2>对象==字符串:先将对象转换为字符串(调用toString)方法,然后再进行比较;
                      []转换为字符串是:"";
                      {}转换为字符串是:"[object object]";
              3>对象==布尔类型:对象先转换为字符串(调用toString),然后把字符串在转换为数字(Number"" 变成 0),
                       布尔类型也转换为数字(true为1,false为0),最后让两个数字比较;
              4>对象==数字:对象先转换为字符串(调用toString),然后把字符串再转换为数字(Number);
              5>数字==布尔类型:布尔转换为数字;
              6>数字==字符串:字符串转换为数字;
              7>字符串==布尔类型:都转换为数字;
              8>null==undefined:结果是true;
              9>null或者undefined,和任何其它数据类型比较都不相等;

十八.运算:
     1.++ : 每一次加1
            如:iNum++就相当于 iNum = iNum + 1;
     2.+= :
            如:iNum += 2; 相当于:iNum = iNum + 2;
            当前这个变量存储的值+某个值(2,3)在赋给这个变量;

十九.函数:
     1.函数:放的是代码片段;
         语法:
          匿名函数:function [函数名]([参数]){        有名函数:function 函数名(参数){
                         //代码片段                              //代码片段
                    }                                       }

     2.函数定义方式:
           1)函数声明;
                function fn(){
                    //代码片段
                }
           2)函数表达示;
                var fn = function(){
                    //代码片段
                }
           说明:两种方式,没有太大区别,但是在调用的时候有区别。

     3.函数调用:函数名+() 如:fn();
           *一个函数,如果是在全局声明的,那么在任何地方都可以被调用到。
                例:
                    fn();//可以在声明代码上面调用;
                    function fn(){
                        alert(111);
                    }
                    fn();//可以在声明代码下面调用;
           *函数表达式,只能在将函数赋值给变量,之后调用。
                例:
                    fn();//这样调用会报错;
                    var fn = function(){
                        alert(222);
                    }
                    fn();//只可以在表达示代码下面调用;

     4.函数传参:
         参数的定义:当函数执行的时候,传入的数据;
         参数分两种:
             1.形参:形式上的参数;
                   定义函数的时候,写在小括号里面,多个参数的话,用逗号隔开;
                   形参是作为函数的局部变量使用,命名的规则遵循变量的规则,形参只能在函数中使用;
               例:
                   function fn(ele,eve){//ele和eve就是形参
                        //代码片段
                   }
               注意:当定义的形参,没有接到数据的时候,默认值就为undefined;
             2.实参:实际传入的参数;
                   函数执行的时候,传入的实际参数;
               例:
                    fn(1,3);//1和3就是实际传入函数的参数

         arguments:(存的是实际传入的参数集合)
             作用:当实际传入参数的个数不确定时,就会用到arguments;
             1.当函数定义的时候,就存在的一个内置变量;
             2.arguments属于类数组对象:
                   因为对应值的结构,和数组很像,但不是数组,类似于数组这种结构,称之为:类数组对象;
             3.其中length,可以查看实际传入参数的个数;

     5.return:
         return 是函数定义的时候,内部的东西;
         当函数被调用的时候,都有返回值:
              1>如果没有使用内部的(return 要返回的数据)的话,那么这个函数的返回值为undefined。
              2>如果使用(return 要返回的数据),那么这个函数的返回值就是 要返回的数据。
              3>如果return后面没写数据,那么函数的返回值为undefined。
         作用:阻止函数继续向后执行,并返回相应的值;

     6.函数自执行:
         如:
             (function ab(){
                alert(1);
             })();  //这种写法就表示函数自动执行了;

     说明:
          1.函数名+() 等于return 后面的值;
            例:function fn(){
                    return 123;
                }
                fn();//这里返回的是return 后面的123;
          2.直接函数名,没有(),等于整个函数表达示;
            例:function fn(){
                    return 123;
                }
                fn;//这里返回的是整个函数表达示:function fn(){return 123;}
二十:获取计算后的样式
      1> ie低版本(6,7,8)下:(currentStyle)
         写法:元素.currentStyle[属性名]
      2> 标准浏览器下:(getComputedStyle)
         写法:getComputedStyle(元素)[属性名]
      3>如果要找某个对象身上的某个属性,
         找到了,返回对应的值;
         没找到,返回的是undefined;
      封装getStyle方法:
      1>封装参数说明:
            getStyle两个参数:
                第一个参数,传入的是元素
                第二个参数,元素的属性
                getStyle返回值:获取元素上的属性对应的值;
      2>开始封装:
            //简化版
            function getStyle(obj,attr){
                return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj)[attr];
            }
            //啰嗦版
            function getStyle(obj,attr){
                if(obj.currentStyle){//兼容ie6,7,8
                    return obj.currentStyle[attr];
                }else{
                    return getComputedStyle(obj)[attr];
                }
            }
            注意:if else的顺序不可颠倒,原因是:getComputedStyle()ie6 7 8 不认识,会报错;
                  而currentStyle[]浏览器都认,不会报错;

二十一:作用域
二十二:闭包
      闭包是一种机制,在函数运行时产生一种作用域,来保护里面的变量不受外界的影响。
      闭包的好处:避免全局污染;
               用处:1>希望一个变量长期驻扎在内存中;
           2>循环绑定事件在里面找到索引值,如选项卡案例;
二十三:定时器
      定时器的定义(两种方法):
      1>连续触发定时器(间歇型):间隔一段时间,就会执行一段代码,直到让它停止位置;
        语法:setInterval(function(){},1000);
                function(){}是要执行的函数;
                1000是执行的时间,单位为毫秒;1s = 1000ms;
      2>延迟触发定时器(延迟型):延迟某个时间后,执行一段代码,只会执行一次。在执行前,可以停止执行;
        语法:setTimeout(function(){},1000);
                function(){}是要执行的函数;
                1000是执行的时间,单位为毫秒;1s = 1000ms;
      定时器的清除:
      1>clearInterval(定时器)  //清除的是setInterval;
      2>clearTimeout(定时器)   //清除的是setTimeout;
二十四:时间对象
      含义:可以用来获取时间的对象;
      语法:1> new Date();//无参数时,获取的是当前系统时间;
               2> new Date(2015,07,22,16,34);//有参数时,获取的是输入的时间;
      方法:getFullYear();//获取年份;
            getMonth();获取月份;(取值范围 0 ~ 11)
            getDate();获取哪一天;
            getDay();获取星期;(0(周日) ~ 6)国外是以周日为一周的第一天;
            getHours();//获取小时;
            getMinutes();//获取分钟;
            getSeconds();//获取秒;
            getTime();//获取毫秒数;
            1天  = 24小时      1天 = 86400秒
            1小时 = 60分钟     1小时 = 3600秒
            1分钟 = 60秒
      倒计时算法:
            未来时间(固定) - 现在时间(变化) = 差值(变化)
二十五:String的方法(位置都是从0开始)
      获取类:
          1>charAt(): 获取指定位置的字符;
            用法:str.charAt();                例:var str = "abc";  alert(str.charAt()); // a
                     str.charAt(number);    例:var str = "abc";  alert(str.charAt(1)); //b
            返回值:是找到对应位置的字符,返回的是一个字符串;
            参数:
                  不传参数时: 默认参数的位置为0;
                  传入的是数字:
                        如果小于0,那么返回的是空字符串;
                        如果大于等于字符串的长度,返回的是空字符串;

          2>charCodeAt(): 获取指定位置的字符的编码(ASCll码)
            用法:str.charCodeAt();      例:var str = "a";  alert(str.charCodeAt()); //97
            返回值:找到指定字符位置的编码(数字)
            参数:
                  不传参:默认为0;
            参数范围:0 -- 字符串长度-1;如果超出范围,返回的是一个NaN;

          3>fromCharCode(): 把编码转换成字符(静态方法)
            用法:String.fromCharCode();    例:alert(String.fromCharCode(97)); // a

          4>substring(): 获取截取字符串的字符;
            用法:str.substring();   例:var str = "abc"; alert(str.substring(1)); //bc
            返回参数:是截取到的相对应的字符串;
            参数:(start,end)(第二个参数不是必须的)
                如果之传入一个参数:
                    start >= 0;      返回从指定位置一直截取到字符串的最后
                    start < 0;       传入的参数为0
                    start >= 字符串的length:返回时空字符串
                传入两个参数:
                    start < end;      返回start到end位置的字符,不包含end位置的字符
                    start > end;      调换位置,返回 end到start之间的字符,不包含start位置的字符
                    start == end;     返回空字符串

          5>slice():提取指定范围子字符串;
            用法:str.slice();       例:var str = "abc"; alert(str.slice(1)); //a
            返回参数:是截取到的相对应的字符串;
            参数:(start,end)(第二个参数不是必须的)
                  如果之传入一个参数:
                        start >= 0;    返回从指定位置一直截取到字符串的最后
                        start < 0;     传入的参数为0
                        start >= 字符串的length;返回时空字符串
                  传入两个参数:
                        start < end;    返回start到end位置的字符,不包含end位置的字符
                        start > end;    返回空字符串
                        start == end;   返回空字符串
                  start可以为负数:
                        -1是字符串的最后一位
                        -2是字符串的倒数第二位
                        -3,-4依次向前推
                  start(负数)+str.length < end(正数)   返回的是start(负数) ~ end之间的字符
                  例:var str = "aiday";
                      /*
                        分析步骤:1.先将把-1加上str.length,-1+3=2;
                                        2.再截取(2,3)的字符,打印为d;
                      */
                        alert(str.slice(-1,3));

            注意:substring()与slice()之前的区别:
                      1.substring()只可以传入正数的数字,不可以为负数;
                        slice()可以传入正数和负数的数字;
                      2.substring()只可以从左向右截取数字;
                        slice()输入正数时,是从左向右截取;输入负数时,是从右向左截取;

      查找类:
          6>indexOf():查找某个字符串在字符串中首次出现的位置;(从左到右)
            用法:str.indexOf();  例:var str = "abcabc";  alert(str.indexOf("a" , 1));// 字符串a,第1次出现的位置
            参数:(字符串,searchIndex)(第二个参数不是必须的)
                  只有一个参数字符串的时候:
                     不传入参数:返回 -1;
                     传入的是一个字符串:返回的是这个字符串首次在str出现的位置;
                            var str = "bcabc";   alert( str.indexOf("ab") );
                     如果没有找到指定的字符串:始终返回的是-1;
                  第二个参数searchIndex的作用:
                     指定从哪个位置开始向后搜索:默认值为0;

          7>lastIndexOf():查找某个字符串在字符串中最后出现的位置;(从右到左)
            用法:str.lastIndexOf(); 例:var str = "abc";  alert(str.lastIndexOf());
            参数:(字符串,searchIndex)(第二个参数不是必须的)
                   只有一个参数字符串的时候:
                        不传入参数:返回 -1
                        传入的是一个字符串:返回的是这个字符串首次在str出现的位置
                                例:var str = "bcabc";  alert( str.indexOf("ab") );
                        如果没有找到指定的字符串:始终返回的是-1;
                   第二个参数searchIndex的作用:
                        指定从哪个位置开始向前搜索:默认值为str.length-1;

            注意:indexOf()与lastIndexOf()的区别:
                        1.indexOf()找的是从左到右第一次出现的位置;
                          lastIndexOf()找的是从右到左最一次出现的位置;

      其它:
          8>split():将一个字符串通过某个分割符,转换成数组;
            用法:str.split();  例:var str = "abc";  alert(str.split()); //[a,b,c]
            返回值:返回的是一个数组;
            参数:(分隔符,数字)
                   不传参:
                        会把str整体作为数组的元素;
                   传入:
                        就按照传入的参数,将字符串分割成数组的每一项;
                   第二个参数传入的是一个正数:
                        作用:保留数组元素的个数;
                        例:var str ="abc";   alert(str.split());

          9>trim():去除字符串前后一个或多个空格;
            用法:str.trim();  例:var str ="    abc   ";   alert(str.trim()); //"abc"
            返回值:返回的是去掉空格后的字符串;

          10>toUpperCase():将字符串转为大写;
            用法:str.toUpperCase();  例:var str ="abc";   alert(str.toUpperCase()); //"ABC"

          11>toLowerCase():将字符串转为小写;
            用法:str.toLowerCase();  例:var str ="ABC";   alert(str.toLowerCase()); //"abc"

      比较类: >, <, ==;
          1>数字和数字比较的时候 直接比较两个数值;
            alert( 1 < 2 );
          2>字符串和字符串比较的时候,把两边的字符串转成相对应的编码,在进行比较;
                alert( "1" < "2" );
             alert( "a" < "b" );
          3>数字和字符串比较,把字符串转成数字比较,如果字符串是纯数字,直接传成相对应字符串的数字进行比较;
                alert( "1" < 2 );
          4>如果字符串不是纯数字的,那么转成数字在进行比较;
             alert( "a" < 2 );
二十六:JSON
      含义:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式;
      语法格式:{key:value,key:value}  键:值,对的形式;
      json格式的结构:1.数组 []; 2.对象 {};
      json特点:json中的key值是唯一的;

      数组和对象的区别:
          1. 对象没有length,除非是自己手动添加的数组自动就有length这个属性;
          2. 对象的下标需要自己定义,数组不需要自己定义;

          通常情况下:1)json对象要用for in 循环;
            2)数组 要用 for循环;

      <for in循环使用说明>
          语法:var json ={"userName":"zhangsan","age":23};
                for(var jsonStr in json){
                    console.log(json[jsonStr]);//得出所有key的value值;
                }
          for中的参数说明:
                jsonStr:是一个变量;
                json:要循环的json对象;
          步骤说明:
                1.先将所有的key找到,存到for循环中的变量(jsonStr)中;
                2.通过json对象.key名的方式,可以找出指定的value值;
                3.也可以通过json对象[变量名]的方式,可以直接找到所有json对象的value值;

      1>JSON.parse():把字符串形式的json,解析成js中可用的对象;
        注意:字符串形式的json,的key值,必须是加引号的,否则JSON.parse()解析的时候会报错。
        参数:(str,function(key,value){})
            第一个参数:要解析的字符串;
            第二个参数:回调函数;
                作用:这个函数已经把解析后的key,value传入到函数中,可以在函数中修改操作key,value的值;
                注意:使用这个函数时,函数内一定要有一个return;否则会报错;

      2>JSON.stringify():把json格式的对象,转换成字符串形式的json;
        参数:(str,function(key,value){},[0-10])
            第一个参数:要解析的json;
            第二个参数:回调函数;
                 作用:这个函数已经把解析后的key,value传入到函数中,可以在函数中修改操作key,value的值;
                 注意:使用这个函数时,函数内一定要有一个return;否则会报错;
            第三个参数:格式化转换后的字符串形式的json;
                 说明:1)当输入的是数字时,范围是0-10,会在每一个key前面输入0-10个空格;
                       2)当输入为字符串时,会在每一个key前面输入对应的字符串;
二十七:数组(Array)
            含义:一组数据的集合,是一个有序集合,用来存储一组数据;
      1>定义:[] 中括号里存许多的元素,每个元素用","隔开,最后一个元素,没有",";
      2>数组的取值:数组取值使用下标来取的,下标是从0开始的;length 查看数组的长度(元素的个数);
      3>取出数组中元素方法:使用for循环的方式,取数组中每一个元素;

            语法:var arr =[1,2,3,4,5,6,7];//字面量格式创建
                  var arr = new Array(); //对象格式创建
      数组内的方法:
            1.Math()相关方法:
               1)Math.floor(number):向上取整;
                  例:Math.floor(0.2);取的是:比0.2大的整数;得0;
               2)Math.ceil(number):向下取整;
                  例:Math.ceil(1.3);取的是:比1.3小的整数;得1;
               3)Math.round(值):四舍五入;
                  例:Math.round(1.5);// 2
               4)Math.abs(值):取绝对值;
                  例:Math.abs(-33);// 33
               5)Math.random():生成一个随机数;
                  例Math.random();//生成0--1(不包含1的随机数)

                  *Math.random():
                      区间的随机数:
                            0 ~ 5 :Math.round( Math.random() * 5  ); //0--5的随机数

                            0 ~ 10: Math.round( Math.random() * 10  ); //0--10的随机数

                            10 ~ 20: Math.round( Math.random() * 10 ) + 10; //10--20的随机数

                            20 ~ 80 : Math.round( Math.random() * 60 ) + 20; //20--80的随机数

                            1 ~ 5 : Math.ceil( Math.random() * 5 ) || 1; //1--5的随机数

                            0 ~ 5(不包含5): Math.floor( Math.random() * 5 ); //0--5不包含5的随机数

                      公式:
                            0 ~ X : Math.round( Math.random() * X  );

                            x ~ y : Math.round( Math.random() * (y-x) ) + x;

                            1 ~ x : Math.ceil( Math.random() * x ) || 1;

                            0 ~ x-1: Math.floor( Math.random() * x );

            2.length()方法:
              用法:Array.length();
                    例:var arr =[1,2,3,4];
                        1> 获取数组的长度;
                            arr.length();//长度为3
                        2> 修改数组的长度;
                    说明:
                        1) 超出了数组的长度,那么多余的项值为undefined;
                            arr.length = 4;  // [1,2,3,undefined]
                        2) 如果没有超出数组的长度,那么就把数组保留相对应数字的元素个数;
                            arr.length = 1;  // [1]

            3.sort()方法:
               定义:对一个数组进行排序的,默认排序是从小到大,根据字符串来排序的;
               用法:Array.sort();
                     例:var arr = [3,5,2,6,7];
                         arr.sort();
               参数说明:
                         sort(function(a,b){});
                         sort的参数,必须是一个函数,函数有两个参数;
               函数返回值:
                   如果为正数,那么随机比较的两个数交换位置;
                         如果为负数或者0 不交换位置;
               例:var arr = [3,5,2,6,7];
                   arr.sort();//不写参数默认从小到大排;

                   arr.sort(function(a,b){
                        return a - b;//从小到大排
                   });
                   arr.sort(function(a,b){
                        return b - a;//从大到小排
                   });

                   带单位的排序方法:
                   var arr =["34px","12px","45px","20px"];
                   arr.sort(function(a,b){
                        return parseInt(a) - parseInt(b);
                   });

            4.push():
                定义:向数组末尾追加一个或多个元素;
                用法:Array.push()
                      例:var arr = [1,2,3];
                          arr.push(4); //[1,2,3,4]
                注意:会改变原有的数组;
                参数:一个或者多个参数;
                返回值:追加后数组的长度;

            5.pop():
                定义:删除数组最后一个元素;
                用法:Array.pop()
                      例:var arr =[1,2,3];
                          arr.pop(); //[1,2]
                注意:会改变原有的数组;
                参数:无;
                返回值:删除的那个元素;

            6.unshift():
                 定义:向数组的最前面添加一个或多个元素;
                 用法:Array.unshift()
                       例:var arr =[1,2,3];
                           arr.unshift(5); //[5,1,2,3]
                 注意:会改变原有的数组;
                 参数:一个或者多个参数;
                 返回值:添加后数组的长度;

            7.shift():
                 定义:删除数组第一个元素;
                 用法:Array.shift()
                       例:var arr =[1,2,3];
                           arr.shift(); //[2,3]
                 注意:会改变原有的数组;
                 参数:无;
                 返回值:删除的那个元素;

            8.concat():
                 定义:连接多个数组,并生成新数组,不会改变原有的数组;
                 参数:要连接的一个或多个数组,还可以传入每一项,作为新数组的每一项;
                 concat:string也有这个方法,但是一般会用 + 号连接;
                 用法:Array.concat()
                       例:var arr = [1,2,3];  var arr1 = [4,5,6];
                           var newArr = arr.concat(arr1); //参数里放入要连接的数组;会返回一个连接后的数组;
                           //concat()中不传入参数,会复制原有的数组;
                           var arr = [2,3,4];
                           var newArr =arr.concat();  //这样得到的是复制后的arr数组

            9.indexOf():(IE6,7,8不支持这个方法)
                 定义:根据字符找对应的字符索引;
                 解决支持底版本的解决办法:(手动封装indexOf()方法)
                       function indexOf( arr,str,searIndex ){
                            searIndex = searIndex ? (searIndex > 0 ? searIndex : 0)  : 0;
                            for( var i = searIndex; i < arr.length; i++ ){
                                if( arr[i] === str ){//判断是否存在数组中
                                        return i;//找到了返回对应的索引
                                }
                            }
                                return -1;//找不到返回-1
                       };

            10.reverse():
                 定义:反转数组,将数组中的数据的位置反过来显示;(使数组倒序)
                 返回值:该方法会改变原有数组;
                 参数:无;
                 语法:var arr = [1,2,3,4,5];
                       arr.reverse();
                       console.log(arr);// [5,4,3,2,1] 改变了原有数组

            11.slice():
                 定义:根据输入的值,截取对应要的数组;
                 返回值:返回截取后的新数组,不会改变原有数组;
                 参数:(start,end)
                 语法:var arr = [1,2,3,4,5];
                       arr.slice(1);// [2,3,4,5]  从位置1开始截取到最后
                       arr.slice(1,2);// [2]  从位置1开始截取到第二位,不包括第二位

            12.splice():
                 定义:从指定位置删除部分元素并增加新的元素;
                 注意:会改变原有的数组;
                 参数:(i,n,e,e1,e2...)
                       i:从该下标开始删除;
                       n:删除指定数量的元素;
                       e:插入的元素;后面可以插入多个元素;
              语法:var arr = [1,2,3,4,5];
                    arr.splice(1); // [2,3,4,5] 删除从1位置开始;
                    arr.splice(1,2); // [4,5]
二十八.DOM(Document Object Model)
      DOM分为:xmlDOM  htmlDOM;

      定义:文档对象模型;
              文档(Document):html页面
              文档对象(Document Object):页面中的元素
              文档对象模型(Document Object Model):是一套定义;为了能够让程序(js)去操作页面中的元素;
      DOM:会把文档看作是一棵树,同时定义了很多方法来操作这棵数中的每一个元素(节点)
      作用:DOM制定了一套标准,对页面中的html元素;
            进行获取、删除、改变、添加,在js中通过document这个对象提供的方法。

      说明:每一个html标签,都是DOM结构的节点,节点也称之为元素;

      DOM节点:是DOM结构中最基本的组成单元。

      DOM结构:
            按层级划分:父节点,子节点,兄弟节点;
            父子节点:上下两层的关系;
            兄弟节点:同一级的关系;
            祖先节点:当前节点上面所有节点的统称;
            子孙节点:当前节点下面所有节点的统称;

      DOM节点是有类型的:
      DOM按类型划分:元素节点  属性节点  文本节点  注释节点 document节点
            元素节点:html标签
            文本节点:文字,特殊符号,换行符,制表符。。。(给用户看的)
            属性节点:元素节点上各种属性
            注释节点:文档中的注释<!--  -->
            document节点:特有的document对象;


            1.nodeType:
                定义:当前元素的节点类型;(返回的是正整数)
                节点类型值:
                        元素节点:1
                        属性节点:2
                        文本节点:3
                        注释节点:8
                        document节点:9

            2.nodeName:
                 定义:获取到当前节点的名字(获取到的名字是大写的);
                 元素节点:标签名(大写的)
                        文本节点:#text;
                        注释节点:#comment;
                        document节点:#document;

      通过父节点操作子节点:
            3.childNodes:
                 定义:是一个只读属性,子节点列表集合;
                 兼容问题:
                        1> 标准下:包含了文本和元素类型的节点,也会包含非法嵌套的子节点;
                        2> 非标准下:只包含元素类型节点,ie7以下不会包含非法嵌套的子节点;
                 注意:childNodes只包含一级子节点,不包含后辈孙级以下的节点;
                 用法:元素.childNodes;

            4.children:
                 定义:只读属性,子节点列表集合;
                 兼容问题:
                       1> 标准下:只包含元素类型的节点;
                       2> 非标准下:只包含元素类型的节点;
                 用法:元素.children;

            5.parentNode:
                 定义:获取到当前节点的父节点;

            6.获取某个元素下面的子节点;
                非标准支持的属性:
                     1> firstChild:只读属性 第一个子节点
                     用法:元素.firstChild;

                     2> lastChild:只读属性 最后一个子节点
                     用法:元素.lastChild;

                     3> nextSibling:只读属性 下一个兄弟节点
                     用法:元素.nextSibling;

                     4> previousSibling:只读属性 最后一个兄弟节点
                     用法:元素.previousSibling;

                标准下支持的属性:
                     1> firstElementChild:只读属性 标准下获取第一个元素类型的子节点;(非标准下没有这个属性)

                     2> lastElementChild:只读属性 标准下获取第一个元素类型的子节点;(非标准下没有这个属性)

                     3> nextElementSibling:只读属性 标准下获取下一个兄弟节点类型的子节点;(非标准下没有这个属性)

                     4> previousElementSibling:只读属性 标准下获取上一个兄弟节点类型的子节点;(非标准下没有这个属性)

            兼容问题:
                标准下:只包含文本类型的节点;
                非标准下:只包含元素节点;

            兼容处理方法:
                1> firstElementChild||firstChild  第一个子节点

                2> lastElementChild||lastChild    最后一个子节点

                3> nextElementSibling||nextSibling 下一个兄弟节点

                4> previousElementSibling||previousSibling 上一个兄弟节点

      通过子节点找到父节点:
            1.父节点
            parentNode:只读属性 当前节点的父级节点
            用法:元素.parentNode

            offsetParen:只读属性 离当前元素最近的一个有定位属性的父节点
            用法:元素.offsetParent

            问题:
            (1).如果没有定位父级,默认是body;

            (2).ie7以下,如果当前元素没有定位默认是body,如果有定位则是html;

            (3).ie7以下,如果当前元素的某个父级触发了layout,那么offsetParent就会被指向到触发了layout特性的父节点上;

            2.offsetLeft(Top):只读 属性 当前元素到定位父级的距离(偏移值)到当前元素的offsetParent的距离

            如果没有定位父级:
               offsetParent -> body
               offsetLeft -> html

            如果有定位父级:
                ie7下:
                      1.如果自己没有定位,那么offsetLeft(Top)是到body的距离;
                      2.如果自己有定位,就是到定位父级的距离;
                其它浏览器:
                      到定位父级的距离;

            3.元素宽高取值
                 style.width:样式宽;
                 clientWidth:可视区宽(当前元素看的见的宽);
                 offsetWidth:占位宽;

      操作元素属性的多种方式:
            1. 通过"."点的形式获取元素中的属性;
                例:oDiv.id;
            2.通过"[]"的形式获取元素中的属性;
                例:oDiv["id"];
            注意:当遇到获取的属性是以变量方式存放的,要用"[]"的方式,不要用点;
                如:var name ="value";
                       oDiv.name;有问题,这个会找元素中有没有name这个名字的属性;
                       oDiv[name];//正确写法
            3:
                1) getAttribute(属性名称):方法   获取指定元素的指定属性的值;
                    用法:元素.getAttribute();
                    如:oDiv.getAttribute('value');

                2) setAttribute(属性名称,属性值);方法  给指定元素的指定属性设置值;
                    用法:元素.setAttribute();
                    如:oDiv.getAttribute('value','test');

                3) removeAttribute(属性名称):方法  移除指定的元素的指定的属性;
                    用法:元素.removeAttribute();
                    如:oDiv.removeAttribute("value");

      三种获取属性值的区别:
          1.用.和[]的形式无法操作元素的自定义属性,getAttribute()可以操作元素的自定义属性;
          2.可以获取元素履实际的值,但是ie7下还是会返回资源的绝对路径;

      元素的操作方法:
          1.元素的创建:
              createElement(标签名称):创建元素
              用法:document.createElement(标签名称);

          2.添加子元素:
              appendChild(添加的元素):方法  追加子元素
              用法:父级.appendChild(要添加的元素);

          3.插入元素:
              insertBefore(新的元素,被插入的元素):方法  在指定的元素前面插入一个新元素
              用法:父级.insertBefore(新的元素,被插入的元素);

          兼容问题:
              1.在ie下如果第二个参数的节点不存在,会报错;
              2.在其它标准浏览器下如果第二个参数的节点不存在,则会以appendChild的形式进行添加;

          兼容处理方法:
              if(第一个元素存在){
                  使用insertBefore();
              }else{//如果不存在
                  使用appendChild();
              }

          4.删除元素:
              removeChild(要删除的元素):方法  删除指定元素;
              用法:父级.removeChild(要删除的元素);

          5.元素替换:
              replaceChild(新的元素,被插入的元素):替换子节点;
              用法:父级.replaceChild(新节点,被替换的节点);

          appendChild、insertBefore、replaceChild:
              都可以操作动态创建出来的节点,也可以操作已有节点;
              操作已有元素时,是直接把元素从一个位置移动到另一个位置,而不是复制。

      表格的操作:
          1.tHead:获取表格头
          2.tBodies:获取表格正文
          3.tFoot:获取表格尾
             1> rows:获取行
             2> cells:获取列

      表单的操作:
          获取表单中的标签:
              1.通过标签中的name属性获取;
                  如:oForm.text1;
                  直接用表单点上name的值;

              2.onchange:当值发生改变的时候触发;
                input标签的text:当光标离开的时候,如果内容有变化就触发;

      input标签的radio/checkbox:
          1> 标准下点击的时候只要值变了,那么就会触发;
          2> 非标准下焦点离开的时候如果值变了,就会触发;

      事件和方法:
          1> onsubmit:事件  当提交表单的时候触发
          2> submit():方法  提交表单
          3> onreset:事件 当表单重置的时候触发
          4> confirm('确定要操作吗?'):弹出询问对话框
                返回值是true ,false  点确定是true  取消是false;
二十九.BOM(Browser Object Model)
       BOM:Browser Object Model  浏览器对象模型;

       BOM--方法:在BOM中大部分方法都是window调用的;
           1.open(页面的地址,打开的方式):方法  打开一个新的窗口(页面)
                用法: window.open(url,方式);//window可以省略
                url地址格式:http://www.baidu.com/;

           参数:
               1.如果url为空,则默认打开一个空白页面;
               2.如果打开方式为空,默认新窗口方式打开;
                 打开方式:
                     (1)_blank: 新窗口打开 默认;
                     (2)_self:在本页面打开新地址;

           返回值:返回新打开的窗口的window对象

           2.close():方法 关闭窗口
                用法:某对象.close(); //某对象是谁,就是谁关闭;

           close()的兼容问题:
               1.火狐:默认无法关闭;
               2.chrome:默认直接关闭;
               3.ie:询问用户是否关闭;

           现象:可以关闭在本窗口中通过js方法打开的新窗口;

       BOM--属性:
           1.window.navigator.userAgent:获取当前浏览器信息
           作用:可以通过得到的浏览器的版本,判断执行相应浏览器的js代码;

           2.window.location:获取浏览器地址信息;

           3.window.location.href:获取url地址;

           4.window.location.search:获取url?后面的内容;

           5.window.location.hash:获取url#号后面的内容

       BOM--窗口尺寸与大小
           1.可视区尺寸:看到见的地方
               (1)document.documentElement.clientWidth:获取可视区的宽度;
               (2)document.documentElement.clientHeight:获取可视区的高度;

           2.滚动距离
               (1)标准浏览器:document.body.scrollTop/scrollLeft;
               (2)非标准浏览器:document.documentElement.scrollTop/scrollLeft;

           3.内容高度
                document.body.scrollHeight/scrollWidth;

           4.文档高度兼容问题:
               (1)ie浏览器,这个方法读取错误:document.documentElement.offsetHeight;
               (2)所有浏览器都兼容:document.body.offsetHeight;

       window对象常用事件:
           1.onscroll:当滚动条滚动的时候触发;
           2.onresize:当窗口大小发生改变的时候触发;
三十.事件
       事件说明:
            当用js获取到一个元素的时候,元素的身上自动就有以on开头的这些属性,这些属性都是与事件有关系的
                如:
                    onclick
                    onmouseover
                    onmouseout
                    ...
                    对应值默认为null
       当一个元素触发了某个事件(比如onclick),如果onclick对应的值null,毫无反应;
           如果对应的值,为函数,那么当触发事件的时候,就会执行这个函数。
           其实不是给元素添加事件的,只是给相对应的事件,添加事件处理函数。

       事件的绑定:
           作用:同一个元素在添加多个同一个事件处理函数时,最后添加的事件处理函数会替换掉之前的处理函数,
                 从而导致前面的处理函数无效;
                 事件绑定就是用来处理这个问题,使得一个元素可以添加多个同一个事件处理函数,处理函数中的代码都会被执行;

           兼容问题:
               1> 只是在标准浏览器下用(ie9,10,11):
                    addEventListener()
                        元素.addEventListener(事件名,事件处理函数,布尔值);
                    参数:
                         参数一,要绑定的事件名;
                         参数二,要绑定的事件函数;
                         参数三,是否捕获,true:捕获;false:冒泡;

                    1. 执行顺序,是按照绑定事件处理函数的顺序;
                    2. 第一个参数 事件是不加 on的;
                    3. this指向的是触发事件的对象;

               2> ie低版本(6,7,8,9,10):
                    attachEvent();
                        元素.attachEvent(on+事件名,事件处理函数);
                    参数:
                         参数一,要绑定的事件名;
                         参数二,要绑定的事件函数;
                         参数三,attachEvent只有冒泡;

                    1. 执行顺序,和绑定事件处理函数的顺序相反;
                    2. 事件是需要加on;
                    3. this指向的是window;

           this,是在函数调用的时候,才决定了函数里this指向的值;
                  在事件处理函数里面,this指向的是触发事件的对象;

       事件绑定的解除:
           addEventListener(标准下):
                   removeEventListener:解除/移除事件绑定;
                   元素.removeEventListener(事件名,事件处理函数,false);

           attachEvent(ie低版本下):
                    detachEvent:解除/移除事件绑定;
                    元素.detachEvent(on+事件名,事件处理函数);
           注意:如果要解除的事件处理函数,一定是有名字的事件处理函数,否则找不到这个函数,就无法解除;

           兼容处理:


           call():一个函数的方法
               作用:当函数执行的时候,改变函数里的this的指向;
                    当函数调用call的时候,直接就执行了这个函数1
           参数:
               第一个参数:是函数执行过程中,this指向的那个值;
                           如果不给第一个参数,或者写入的null,那么函数里的this指向window;
                           如果给了第一个参数,那么函数里面的this就指向这个参数的值;
               第二个参数,一次往后推写入的参数,是调用函数时候实际传入的参数;

           apply()与call()的作用一样;
           参数:
               第一参数同call的第一个参数;
               第二参数是一个数组,数组里面的值,就是调用函数时实际传入的参数;

       事件模型的三个阶段:
               捕获阶段:从顶层开始触发相对应的事件,直到目标元素;
               目标阶段:目标元素上触发;
               冒泡阶段:从目标元素向最顶层触发相对应的事件;

       事件对象:
           定义:当触发了某个事件的时候,那么系统(浏览器)就会把关于这次事件触发的详细信息存在一个对象中,
                 这个对象称之为事件对象;
           获取到事件对象
                标准浏览器下:
                    作为事件处理函数的第一个参数;
                ie低版本:
                    事件对象作为全局的对象存在,名字为event;
                chrome下:
                可以作为事件处理函数的第一个参数,也可以在全局的event获取;
           兼容处理:
                var e = ev || event;
                低版本支持的event对象在后;

       事件对象的属性:
           1.获取鼠标的位置:
               clientX:相对于浏览器左边的距离;
                  用法:事件对象.clientX;
               clientY:相对于浏览器上边的距离;
                  用法:事件对象.clientY;
           2.获取事件源元素:target;
               用法:事件对象.target;

       事件冒泡:
         触发某个元素的某个事件,从当前的元素开始,逐级向上触发,沿途的相对应元素(当前元素的祖先节点)的相对应的事件;

       好处:可以事件委托;
             事件源,事件发生的那个元素;
             事件源元素的获取:
                 标准浏览器:
                    事件对象.target;
                 在ie低版本:
                    事件对象.srcElement;

       阻止冒泡:事件对象.cancelBubble = true;

       焦点事件:
           定义:可以获取到光标的事件;
                 页面中的元素能跟用户交互的,例如:input输入框、表单控件等,都有焦点事件;

           焦点默认:默认焦点时是,document;

           获取焦点方式:
                1. 鼠标点击;
                2. 键盘tab键;
                3. 程序设置;

           注意:页面中的元素只能有一个元素获取到焦点,当一个元素获取焦点后,另一个元素就会失去焦点;

           1.获取焦点:onfocus:元素 获取 焦点时触发的事件;
                 用法:元素.onfocus = function(){
                             //操作代码;
                       }
           2.失去焦点:onblur:元素 失去 焦点时触发的事件;
                 用法:元素.onblur = function(){
                            //操作代码;
                       }
           事件方法:select()、focus()、blur();
               1.获取焦点:元素.focus();//一般用在,打开页面就有默认获取焦点的元素上
               2.失去焦点:元素.blur();//基本不用
               3.选中内容:元素.select();//一般用在,有全选功能上

       onchange事件:当select控件的值发生改变的时候触发的事件;只有select有这个事件;

       键盘事件:
           定义:敲击键盘触发的事件;
                 只能作用在可以获取焦点的元素身上;

           1.onkeydown:键盘按下不抬起触发的事件;
                  用法:元素.onkeydown = function(){
                             //操作代码
                        }
           2.onkeyup:键盘抬起触发的事件;
                用法:元素.onkeyup = function(){
                             //操作代码
                      }
           3.onkeypress:键盘按下不抬起触发的事件;
                   用法:元素.onkeypress = function(){
                             //操作代码
                         }
                   注意:当按下功能键的时候onkeypress不触发的;

       获取键盘按钮的值:
           1.keycode:事件对象下的属性;
              用法:事件对象.keycode;
              返回:一个十进制的数字,这个数字代表的就是当前按下的键;

       获取功能键盘的值:都是事件对象下的属性;
           1.ctrlKey:ctrl键的值;
           2.shiftKey:shift键的值;
           3.altKey:alt键的值;
        返回值:都是boolean值,没有按键,返回false;有按键,返回true;


       事件的默认行为:当触发某个事件的时候,浏览器会自动完成某些行为;

           例如:浏览器页面有滚动条时,按空格键会自动翻下一页;
                 a标签点击有跳转窗口行为;

           阻止默认行为的方法:
                 1> return false(ie7浏览器不兼容);

                 2> FF和chrome下:e.preventDefault;(ie浏览器不支持这个属性)
                    ie低版本:e.returnValue = false;
                        说明:部分事件不支持returnValue,具体需要测试;

                 3> 主要处理ie7的兼容,chrome不支持这种方法;
                     全局捕获:
                        元素.setCapture();
                        释放捕获:
                            元素.releaseCapture();
                     注意:全局捕获一般用在有一对事件里面。比如:鼠标抬起和鼠标按下

                 常见的默认行为:
                      1.ctrl+鼠标单击链接时,页面会新打开一个浏览器;
                      2.图片、链接,都有拖动的行为;
                      3.按下空格件滚动条和页面会向下滚动;
                      4.默认鼠标滚轴可以上下滚动;

       右击鼠标出现菜单阻止方法:
           oncontextmenu:不是右击事件;
           当右击菜单出现的时候,触发的事件;
           用法:document.oncontextmenu = function(){
                       //这里可以阻止后操作的代码
                       return false;
                 } //这样写就阻止了

       鼠标滚轮事件:
           ie和chrome:onmousewheel
           FF:DOMMouseScroll;
               说明:DOM开头的事件,属于DOM事件;
                     DOM事件,必须通过绑定的形式,才有作用,要使用addEventListener进行绑定;

       判断出滚轮滚动的方向:
           ie和chrome下:
               事件对象.wheelDelta;
               返回值:向上120  向下-120;
           FF下:
               事件对象.detail;
               返回值:向上-3  向下3;
三十一.AJAX
       含义:AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML)

       ajax作用:利用js发送请求,获取数据,得到数据后,就可以根据数据结合DOM,
                 把数据渲染在页面中。就可以利用ajax做到无刷新操作数据。

       ajax工作流程:                          响应状态码
           1. 初始化,得到一个ajax对象;             0
           2. 建立连接,准备数据;                   1
           3. 发送数据;                             2
           4. 等待服务器响应(数据没完全发送);       3
           5. 服务器响应完成,数据接收完成;         4

       实例:
           //1.得到ajax对象
           var xhr =new XMLHttpRequest();

           //2.建立连接,准备数据
           xhr.open("get","./php/get.php",true);

           //连接完成后做的事
           xhr.onreadystatechange = function(){
                if( xhr.status === 200 ){
                    xhr.responseText;//服务器返回的数据
                }else{
                    alert( xhr.statusText );//
                    alert( xhr.status );
                }
           }
           /*
           xhr.onload = function(){
                if( xhr.status === 200 ){
                    xhr.responseText;//服务器返回的数据
                }else{
                    alert( xhr.statusText );//状态内容
                    alert( xhr.status );//状态码
                }
           };
           */

           //3.xhr.send()进行3,4,5步骤
           xhr.send();

       方法说明:
           1.XMLHttpRequest():ajax对象
             兼容问题:
                 1>XMLHttpRequest:支持标准和ie7以上浏览器,ie6不支持;
                 2>ActiveXObject("Microsoft.XMLHTTP"):支持ie6;

           2.open(method,url,boolean):建立连接
             参数说明:
                 第一个参数:发送方式(get或post);
                 第二个参数:要发送的地址;
                 第三个参数:是否为异步(true-异步,false-同步),默认为异步;

           3.send([data]);发送连接
             参数说明:
                 1>get提交方式,send()不需要有参数;
                 2>post提交方式,需要传入查询的数据,send("user=leo");

           4.onload():是标准浏览下提供的一个时间服务器响应完成触发的事件;

           5.onreadystatechange():当ajax每进行一步都会触发这个事件;
             在这个方法下,有readyState()方法;获取ajax每一步响应的状态码;

               onload与onreadystatechange的兼容问题:
                   onload:只支持标准浏览器和ie9以上;
                   onreadystatechange:标准和ie9以下版本都支持;

           6.post与get提交方式:
             1> post:ajax中,post要注意两点;
                  1> post要设置"Content-Type"这个请求的类型;再将请求的数据输入到send()方法中;
                  2> post发送的数据要放在send方法中;
                     例:xhr.setRequestHeader( "Content-Type","application/x-www-form-urlencoded" );
                         xhr.send("user=leo");
             2> get:ajax中,请求的数据拼到url地址的?后面,用&符号连接;

             get和post的区别:
                 get:
                    1>发送的数据放在了地址的问号后面;
                        http://localhost/2015-08-25/php/get.php?user=leo&password=111111
                    2>数据的格式为:
                            属性=值
                        如果有多个数据
                            属性=值&属性=值&属性=值

                    3>由于get请求数据是写在了地址后面,每个浏览器对地址的长度有限制,
                         导致了get请求的数据有限,如果超出了浏览器规定的地址的长度,那会会导致get发送的数据不完整

                    4>get请求的数据放在了地址后面,由于浏览器的缓存,浏览器会记录住请求的地址,导致发送的数据就不安全

                 post:
                    1>数据不放在地址的后面,通过别的途径发送到服务器的

                    2>发送的数据大小理论上是没有限制的(服务器做了限制)

                    3>post是加密发送,相对安全;

           7.encodeURI(str):把字符转成URL编码;
                         例:encodeURI("测试");
           8.decodeURI(str):把URL编码转换成字符;
                         例:decodeURI("%E5%A6%99%E5%91%B3%E8%AF%BE%E5%A0%82");
三十二.JSONP
           定义:json and padding;
           作用:用来处理跨域的问题;
           跨域:是指,只要域名,协议,端口有一个不同就产生了跨域访问;
           同源策略:是指,域名,协议,端口相同。
               域名:域名就是ip地址的小名(外号);
                     如果要域名和ip绑定,需要DNS解析
                     域名分为:
                        主域名:https://www.baidu.com/
                        主域名下分为:(最多就到三级域名)
                            二级域名:http://news.baidu.com/
                            三级域名:http://29.classcase.sinaapp.com/
               协议:不同服务器之间通信的一种约定的协议;
                     例如:
                         http/https:访问互联网上的页面、ftp、file
               端口:例如:http/https  80、ftp  21 22 23,这些都是端口;

           cookie:(document下的一个属性,可读可写)
           用法:document.cookie
                例:document.cookie = "user=tom;age=30";
           cookie说明:
               1. cookie是和域名有关系,各个域名下的cookie是互不影响的,不能访问到其他域名下的cookie;

               2. 存的cookie是有过期时间,一般是在浏览器关闭后cookie就清除了;
                  如何延长cookie的过期时间:
                      可以设置过期时间,保留到未来的事件然后消失要删除cookie,就设置一个过去的时间;
                  方法:通过new Date();设置时间,使用cookie中的expires参数来设置过期时间;
                        例:var date = new Date();
                            var newDate = date.setDate(2);
                            document.cookie = "user=tom;expires=newDate";

               3. 存的cookie的条数,根据浏览不同存储的 数量也不同;

           localStorage:(用法:类似cookie)
               localStorage下面的方法:
                    1>setItem(key,value):设置localStorage项

                    2>getItem(key):通过key值获取value

                    3>removeItem(key):删除localStorage项

                    4>clear():清空掉所有的localStorage项

                    5>storage事件:
                        不会触发本窗口监听的storage事件

三十三.正则表达示
           定义:规则表达式,描述一套规则的工具;
           用法:对字符串进行查找、匹配;
           创建正则的方法:
               1>var re = new RegExp();//new对象的写法
               2>var re = /\d/;//字面量的写法

           修饰符i和g的说明:(都写在最后一个/的后面)
                i:忽略大小写;    例:var re =/A/i;
                g:全局搜索;(匹配到所有符合表达式的字符,默认为非全局搜索,只搜索一次;)
                   例:var re =/\d/g;

           正则的相关方法:
               1>test():检测字符串是否匹配正则中的内容 如果匹配有,返回true;否则返回false;
                 用法:var re = new RegExp();
                       var str ="abcd";
                       re.test(str);
                 参数:传一个参数,传要验证的字符串;
               2>search():检测字符串首次出现的位置;
                 用法:字符串1.search(字符串2 || 正则):
                       从字符串1中搜索字符串2或正则的内容,在字符串1中首次出现的位置
                 参数:参数可以改字符串,或者是正则表达式;

                 与indexOf的区别:
                    1)indexOf:只能传入字符串;
                    2)search:既可以传入字符串也可以穿入正则;

               3>match():检测字符串匹配的内容,匹配到内容,就以数组返回,否则返回null;
                 用法:字符串1.match( 字符串2 || 正则 ):
                           从字符串1查询字符串2或正则匹配的内容,
                 返回值:如果有,把结果已数组的形式返回;如果没有,返回的是null;

               4>replace():替换相应的字符串;
                 用法:字符串1.replace(字符串2 || 正则,字符串3 || 函数):
                        从字符串1中匹配到字符串2或者正则中的内容,替换成字符串3或函数的返回值;
                 返回值:替换后新字符串;

                 replace()第二个参数是函数参数时的说明:
                    1)这个函数的第一个参数是整个正则表达式匹配的内容;
                    2)从第二个参数开始,就是这个正则表达式中子表达式所匹配到的内容;
                 作用:限制范围或提权

                    例:var str="sdfsssddffss";
                       var str2 = str.replace(/(s)(f)/,function($0,$1,$2,$3...$n){
                       });
                    $0:返回的是匹配到的字符;
                        如:/s/  匹配到的字符串s;
                    $1-$n:返回的是每一个分组匹配到的字符;
                        如:/(s)(f)/  $1代表的是(s)匹配到的,$2代表的是(f)匹配到的;$3--$n依次类推;

           转义字符:
               \+:普通的字符组合,代表一个或一段特殊的内容
               \n:换行符
               \r:回车符
               \t:制表符

           量词:
                 {n}:重复n次()
               {n,m}:最少重复n次 最多m次
                {n,}:最少n次,最多不限
                   +:最少重复1次,最多不限 {1,}
                   ?:最少0次,最多1次 {0,1}  /\d?/
                   *:最少0次 最多不限 {0,}

           匹配中文:
               escape():根据编码转换成中文;
                     例:console.log(escape("\u4E00"));
               unescape("中国"):根据中文转换成编码;
                     例:console.log(unescape("中国"));

           特殊含义字符:
                \d: 0-9数字
                \D: 非数字

                \w: 数字 字母 下划线
                \W:非数字 字母 下划线

                \s:匹配一个空格
                \S: 非空格

                \b: 边界符   一个字符的左边或右边是非\w就存在一个边界符
                \B:非边界符

                \1: 重复第一个子项中的内容   \2\3\4\5\n

三十四.面向对象
           类:对一类具有相同的特征的抽象化描述(ECMAscript5没有类,ECMAscript6有类);
           对象:类的实例化;
           实例化对象的方法:通过关键字new,来实例化一个对象;
                         例:var person = new Person();//这就完成了对象的实例化

           构造函数:
               定义:由于js中是没有类的概念,如果要自定义一种数据类型
                     借助于函数定义相关的类型,这个函数称之为 构造函数;
               创建方法:
                     例:function Person(userName age){//构造函数名都约定是首字母大写
                            this.userName = userName;
                            this.age = age;
                            this.city="SH";
                         }

               使用构造函数:(通过实例化方式)
                     var person = new Person("张三",34);
                     console.log(person.userName);//张三
                     console.log(person.age);//34

               实例化构造函数的过程:
                   1. 当用new 调用某个函数的时候,在这个函数里面会隐式的创建一个新的对象;
                   2. 把函数中的this指向创建出来的新对象;
                   3. 隐式的return 出这个新创建的对象;

               在函数中使用return:
                   return 后面是简单类型的值,new 函数之后得到的是内部隐式创建的那个对象;
                   return 后面是对象,new 函数之后的到的就是return后面的对象;

               对象原型(prototype):
                   定义:只要定义一个函数,那这个函数身上就自动有一个prototype这个属性,这个属性对象的值为Obejct类型;

                   说明:prototype对应的对象不是一个空的对象,有一个属性constructor,constructor对应的值就是构造函数;

                   __proto__属性:
                       定义:对象上的一个属性,__proto__对应值,为创建这个对象的构造函数的原型;

               访问对象上的属性或方法的过程:
                   首先当前对象自己身上找这个属性或方法,如果没有找到,
                   那么再去当前这个对象下的__proto__指向的原型对象去找属性或方法。

 三十五. in 运算符

    in 是一个运算符,也是一个二元运算符,对运算符左右两个操作数的要求比较严格。
    in运算符要求第1个(左边的)操作数必须是字符串类型或可以转换为字符串类型的其他类型,而第2个(右边的)操作数必须是数组或对象。
    只有第1个操作数的值是第2个操作数的属性名,才会返回true,否则返回false。
例:var isIE = "ActiveXObject" in window;
1.判断对象是否为数组/对象的元素/属性:
格式:(变量 in 对象)......注意,,,

  当“对象”为数组时,“变量”指的是数组的“索引”;

  当“对象”为对象是,“变量”指的是对象的“属性”。

posted @ 2015-11-11 12:48  多多谷子  阅读(368)  评论(0编辑  收藏  举报