zoukankan      html  css  js  c++  java
  • 前端重点-整理集合

    一、XHTML+CSS重点

    一、各浏览器兼容问题和解决方法

      1、3px的Bug:ie6下一个容器的浮动和文字之间会产生3px的间距,

        解决方法:给浮动的盒子添加一个margin-right:-3px;(与浮动方向反方向)。

      

      2、浮动双边距Bug:当一个盒子像左浮动的同时有一个向左的margin-left的时候,IE6解析这段代码时就会把margin-left解析为原来的2倍,这个就是所谓的浮动双边距BUG。
        解决方法:浮动盒子添加属性display:inline;将浮动盒子属性改为内联,或单使用“_”来处理ie6

      3、IE6下多出来的文字:产生的原因,是两个设置了float的元素之间加了个注释
        解决方法:删除注释

    二、布局有哪些方式

      1、三列布局中间列自适应

      2、让div元素上下左右居中

      3、两列布局左固定右自适应,或右固定左列自适应布局

      4、两个列的高度相同,根据内容自适应

    三、样式的优化级

    1、#:id

    2、.:类选择器

    3、div:标签选择器

    4、h1 + p:相邻选择器

    5、div < p:子选择器

    6、div < li:后代选择器

    7、*:通配符

    8、input[type=“text”]:属性选择器

    9、a:hover:伪类选择器

    四、css hack

    1、_ :用于IE6 

    2、*和+:用于IE6,IE7

    3、:用于IE8,IE9

    4、9:用于 IE6,IE7,IE8,IE9

    5、9:用于IE9

    6、!important:改变样式的优先级不能算做是hack了,不推荐使用

    五、haslayout

    IE浏览器下的很多bug都是haslayout = false 引起的:

    1.文字消失,截断  2.边框消失  3.3像素偏差  4.绝对元素定位错误  5.滤镜不生效  6.滚动页面跳动 7其他(欢迎补充哦~)

     

    使用css来触发haslayout,触发后haslayout=true;

    触发方法:

    1、position:absolute

    2、float:left/right

    3、display:inline-block

    4、width,height:除“auto”外的任意值

    5、zoom:除"normal"外 ...

    六、DOCTYPE的各种模式详解

    IE有两个渲染方式:(标准标式)和(怪异模式)。

    1、处发怪异模式两种方法:

      将HTML中的DOCTYPE声明去掉就可以引发怪异模式

      将<!DOCTYPE>前面加一个字符,如:a<!DOCTYPE>

     

    2、怪异模式样式有哪些变化

      IE下的怪异模式width是padding和border加到一起,而标准模式不会

    七、CSS的权重

    权重值:

    1、内联样式style属性:权值为1000

    2、id选择符:权值为100

    3、类,伪类、属性选择符:权值为10

    4、标签选择符、伪元素:如div p,权值为1

    5、其它优先符:通配符选择器等,优先级为0

    二、HTML5重点

    一、新增标签:

    二、canvas功能:

    三、本地存储:

    存储5MB,分为localStorage永久和sessionStorage临时存储

    存储:LocalStorage.setItem(key, val);

    获取:localStorage.getItem(key);

    全部清除:localStorage.clear();


    四、离线存储:

      就是将要缓存的文件存储在manifest文件中,cache下存储要缓存的文件,在<html lang="en" manifest='test.manifest'>引用manifest文件,还需要在服务器端修改配置文件

    五、 跨文档消息:

    六、多线程webworks:

     1 var oBox = document.getElementById("box");
     2 // 创建个多线程
     3 var oWorks = new Worker("test.js");
     4 oWorks.postMessage(10000);     // 向线程发消息
     5 oWorks.onmessage = function(event){    // 接收消息事件
     6     oBox.innerHTML = event.data;
     7 }
     8 
     9 test.js
    10 onmessage = function(event){
    11     var num = event.data;
    12     var result = 0;
    13     for(var i=0; i<num; i++){
    14         result += i;
    15     }
    16 
    17 // 向线程创建源送回消息
    18     postMessage(result);
    19 }

    七、获取地理位置:

    八、webSocket:

    九、video和audio:

    三、CSS3重点

    一、HTML5定义

      <!DOCTYPE HTML>

    二、兼容不同适配器

      外部样式:<link media="screen and(min-500px) and(max-100px)" href="main.css" rel="stylesheet">

      内部样式:@media screen and (min-400px) and (max-800px) {body{background:blue;}}  // 可视区大于400并小于800

    三、viewport虚拟窗口

      手机浏览器把页面放在一个虚拟窗口中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤到很小的窗口中(这样会破坏没有针对手机浏览器优化的网页的布局),用户可以通过平移和缩放来看网页的不同部分。移动版的 Safari 浏览器最新引进了 viewport 这个 meta tag,让网页开发者来控制 viewport 的大小和缩放,其他手机浏览器也基本支持。

      <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0">

      各属性:

      1、width:控制 viewport 的大小,可以指定的一个值,如果 600,或者特殊的值,如 device-width 为设备的宽度(单位为缩放为 100% 时的 CSS 的像素)。

      2、height:和 width 相对应,指定高度。

      3、initial-scale:初始缩放比例,也即是当页面第一次 load 的时候缩放比例。

      4、maximum-scale:允许用户缩放到的最大比例。

      5、minimum-scale:允许用户缩放到的最小比例。

      6、user-scalable:用户是否可以手动缩放

    四、定义缓存

      1、手机缓存一般通过meta元素来设置,<meta http-equive="Cache-Control" content="">

    content的可选值:
    1、public:表示可以在任何地方缓存网页,如果定义为public,通常代理服务器作为一个共享缓存可以缓存到该网页
    2、private:表示单个用户所私有,
    3、no-cache:表示不缓存该网页,即使相同的客户重复使用,也不会缓存
    4、no-store:响应和导致该响应的请求不能存储在任何存区内,
    5、no-transform:
    6、must-revalidate:
    7、proxy-revalidate:
    8、max-age:以秒为单位定义缓存的最大过期时间 content="max-age:3600" 将网页缓存存为一个小时3600秒
    9、s-maxage:用于代理的共享缓存,它可以 max-age

      2、定义网页到期
        <meta http-equiv="Expires" content="Ture, 20 Aug 1996 14:25:27 GMT">


      3、定义应用程序名
        <meta http-equiv="application-name" content="WWW聊天室">

    五、选择器

      1、基本选择器:

        *:通配符    . 类选择符    #id选择符    li元素选择符    .nav li 后代选择符    .nav < li 子选择符

        .nav + li 相邻选择符    .nav ~li 兄弟选择符    .nav li, .header li组合选择符

      2、属性选择器:

        [attr] 属性名匹配    [attr=value] 指定属性值匹配    [name*='s'] 属性中包括指定值的匹配

        [data-attr^='obj'] 属性值中以obj开头的匹配    [data-attr$='obj'] 属性值中以obj结尾的匹配

      

      3、结构性伪类选择器:

        :first-line 元素中第一行的样式    :first-letter 元素中第一个字母    :before 指定元素之前插入内容    

        :after 指定元素之后插入内容       :first-child 指定第一个元素     :last-child 指定最后一个元素

        :nth-child(n) 指定第几个元素     :nth-last-child(n) 指定从后数的第几个元素    :only-child 获取元素中只有一个子元素

      4、UI元素伪类选择器:

        :hover 鼠标移上去    :active 鼠标按下未放开触发    :foucs 处于当前状态    

      5、伪类与伪元素

        伪类使用一个:,如a:hover     伪元素使用两个::  如 .box::first-child

        区别:伪元素可以独自使用,伪类不可以  

    六、css3样式

      兼容开头:-o 、-webkit、-moz

      1、阴影:盒阴影、文字阴影

        格式:box-shadow:投影方式,  横向长度, 垂直长度,  阴影模糊半径, 阴影扩展半径, 阴影颜色

        box-shadow:2px  2px  1px  3px  rgba(0,0,0,0.5);    // 内阴影加入inset

        text-shadow:2px  2px  1px  3px  rgba(0,0,0,0.5);    // 内阴影加入inset

      2、边框:

        圆角样式:border-radius:4px;   // 四个角的弧度为4px

      3、背景:

        背景渐变:linear-gradient:

        background-image:-webkit-linear-gradient(left ,  #ffff00,   #000);    // 线性渐变从左开始,黄色到黑色

        

        背景图的尺寸:background-size:

          contain:与cover相反,是把背景图缩小到适合容器的

          cover:背景图片自己会放大到适合容器的尺寸

          

        背景裁剪:background-clip

          指定背景的范围:

          border-box:

      4、文本

        文本换行 web-break:

        word-break的三个值:1、normal:使用浏览器默认换行    2、keep-all:只能在半角空格或连字符处换行    3、break-all:允许在单词内换行

       

        字体图标 @font-face:    

    @font-face {
      font-family: 'YourWebFontName';

      src: url('YourWebFontName.eot'); /* IE9 Compat Modes */

      src: url('YourWebFontName.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */

      url('YourWebFontName.woff') format('woff'), /* Modern Browsers */

      url('YourWebFontName.ttf') format('truetype'), /* Safari, Android, iOS */

      url('YourWebFontName.svg#YourWebFontName') format('svg'); /* Legacy iOS */
    }

     

      5、变型 transform

        旋转  transform:rotate(45deg);    // 顺时针和负为逆时针

        移动  transform:translate(x, y);    // x、y轴移动,如果单独对x轴移动transform:translateX(val);

        缩放  transform:salce(1.5);      // 放大1.5倍

        扭曲  transform:skew(30deg,10deg); // 

        改变元素的基点位置  transform-origin:20% 20%;    // 正常是以元素的中心来作为基点 0 0为左上角

        

      6、3D变形

          transform-style:preserve-3d或flat    // flat将所有子元素转为2D元素

        .box { 200px; height: 200px; background: #ccc; -webkit-transform-style:preserve-3d; -webkit-transform:rotate3d(.2, 1, .6, 69deg);  position: absolute; left: 50%; top: 50%;   }

    1、translate3d(tx, ty, tz) 3D移动

    tx:代表横向坐标位移向量的长度;
    ty:代表纵向坐标位移向量的长度;
    tz:代表Z轴位移向量的长度。此值不能是一个百分比值,如果取值为百分比值,将会认为无效值。

    2、scale3d(sx,sy,sz) 3D缩放

    3、rotate3d(x,y,z,a) 3D旋转(.6,1,.6,45deg)

    x:是一个0到1之间的数值,主要用来描述元素围绕X轴旋转的矢量值;
    y:是一个0到1之间的数值,主要用来描述元素围绕Y轴旋转的矢量值;
    z:是一个0到1之间的数值,主要用来描述元素围绕Z轴旋转的矢量值;
    a:是一个角度值,主要用来指定元素在3D空间旋转的角度,如果其值为正值,元素顺时针旋转,反之元素逆时针旋转。

      7、动画

        1、transition:将动画在一定的时间内执行一次    

          -webkit-transition: all  .5s  ease-in-out  1s;   // 简单点说这四个值 要执行的事,多长时间执行完,运动的效果,延迟多长时间开始执行  

    四个属性:

    执行变换的属性:transition-property

    变换延续的时间:transition-duration

    在延续时间段,变换的速率变化transition-timing-function

    变换延迟时间transition-delay

        li { 200px; height: 200px; background: #ccc; position: absolute; left: 50%; top: 50%; display: block; margin-left:-100px; margin-top: -100px; box-shadow:4px 4px 2px rgba(0, 0, 0, .4);

        li:active{ -webkit-transform-style:preserve-3d; -webkit-transform:rotate3d(.2, 1, .6, 69deg); -webkit-transition:all 3s ease-in-out 1s; }

        2、animate

          -webkit-animation:pic_2_ico1    5.5s   ease   infinite;     // 动画名    执行时间    动画频率    延迟时间    循环次数(infinite为无限次)    

    @-webkit-keyframes pic_2_ico1{

    0%{-webkit-transform:rotate(0deg);}

    50%{opacity:1}

    100%{-webkit-transform:rotate(360deg);opacity:0.6}

    }

         

    四、JavaScript重点

    一、DOM文档对象模型


    二、函数

    1、函数声明和函数表达式

    函数声明:function test(){ … }

    函数表达式:function test(函数名可写可不写)(){ … },如果不写名为匿名函数表达式

    将匿名函数表达式赋给变量:

    var oTest = function(){ … }

    (function(w){ … })(winow);

    2、递归

      函数调用函数自身这个过程叫递的动作,在最后一次在判断中止条件,可以执行归的动作,

      当一个函数调用递归,函数的计算结果暂时被挂起.

     1 <script>
     2     function recursive(num){
     3         if(num == 1){
     4             return num;
     5         }
     6         else{
     7             return num * recursive(num-1);
     8         }
     9     }
    10 
    11     var s = recursive(5);       // 210
    12     
    13     /*
    14     * 调用方式
    15     * 5 * recursive(4)
    16     * 5 * 4 * recursive(3)
    17     * 5 * 4 * 3 * recursive(2)
    18     * 5 * 4 * 3 * 2 *recursive(1)
    19     * 5 * 4 * 3 * 2 *1
    20     * 5 * 4 * 3 * 2
    21     * 5 * 4 * 6
    22     * 5 * 24 
    23     * */
    24     console.log(s);
    25 </script>

    3、拉圾回收机制:

    在执行完函数后,内部变量将会从内存中自动删除,除闭包外,因为闭包的一个函数还引用着外层函数的变量。

    闭包:函数嵌套函数,内部函数调用外部函数的变量,导致拉圾回收机制不能回收,变量一直存在内存中,IE下容易内存泄露。

    闭包的好处:1、希望一个变量长期的在内存中 2、避免全局变量的污染

     1 function fn1(){
     2     var a1 = 5;
     3     function fn2(){
     4         alert(a1);
     5     }
     6     return fn2;
     7 }
     8 var temp = fn1();
     9 temp();
    10 // 这个闭包会导致内存泄露,无论跳转到哪个页面oBox都存在,导致内存不断累加,cpu负载加重
    11 window.onload = function(){
    12     var oBox = document.getElementById("box");
    13     oBox.onclick = function(){
    14         oBox.innerHTML = "aaa";
    15     }
    16 
    17 // 解决方法,离开页面时将对象释放
    18     window.onunload = function(){
    19         oBox = null;
    20     }
    21 }

    三、事件

    1、事件流:

      事件流就是描述页面中接收事件的顺序,IE事件流是事件冒泡流,Netscape是事件捕获流。

      DOM事件流包括三个阶段:事件捕获、处理目标阶段、事件冒泡

    2、 事件捕获和冒泡:

        <div id="box">aaaa</div>

      冒泡:如果点击box,会沿着DOM树一直向上传播直到document对象

      捕获:与冒泡相反,先从document对象向下传播直到找到box为止

    3、事件处理

      标准:addEventListener、removeElementListener

      ie下:attachEvent、detachEvent

    3、 事件源:不管在哪个事件中,只要你操作的那个元素就是事件源

    1 oUl.onmouseover = function(event){
    2     var ev = event || window.event;
    3     var target = ev.target || ev.srcElement; // 获取到事件源
    4     console.log(target.innerHTML);
    5 }

    4、 事件委托:利用冒泡原理,把事件加到父级上,触发执行元素

      好处:1、提高性能 2、新添加的元素也会有事件,因为事件是在父级上jquery里的live和delegate()事件都是通过事件委托原理

     1 var oBox = getId("box1");
     2 oBox.onmouseover = function(event){
     3     var evt = event || window.event;
     4     var target = evt.target || evt.srcElement;
     5 // 判断一下处理的标签是否正确
     6     if(target.tagName.toLowerCase() == "li"){
     7         target.style.backgroundColor = "#ffff00";
     8     }
     9 }
    10 oBox.onmouseout= function(event){
    11     var evt = event || window.event;
    12     var target = evt.target || evt.srcElement;
    13     if(target.tagName. toLowerCase() == "li"){
    14         target.style.backgroundColor = "#fff";
    15     }
    16 }

    5、自定义事件

    6、事件类型

      1、UI事件:

         load、unload:当页面、图像、框架、<object>加载完后触发和卸载后触发

         resize、scroll:窗口大小改变和滚动条滚动时触发。  

     1 // 页面加载完成
     2 window.onload = function(){
     3     
     4     // 创建图像对象
     5     var oImg = new Image();
     6     oImg.src = "...";
     7     oImg.onload = function(){
     8         // 图像加载完成
     9     }
    10 }

      2、焦点事件:

        blur:失去焦点  focus:获取焦点  

      3、鼠标事件:

        onclick:点击  dblclick:双击事件  mousedown:按下鼠标  mouseup:抬起鼠标

        mouseover、mouseenter:按下鼠标左健但mouseenter不冒泡

        mouseout、mouseleave:鼠标离开目标触发,mouseleave不冒泡

        button属性

        返回鼠标按下的键:1为左键  2为右键  3为中间滚轮键

     1 var oBox = document.getElementById("box");
     2 
     3 function addEvent(obj, type, fn){
     4     if(obj.addEventListener){
     5         obj.addEventListener(type, fn, true);
     6     }
     7     else{
     8         obj.attachEvent("on"+type, fn);
     9     }
    10 }
    11 
    12 addEvent(document.body, "mousedown", function(e){
    13     var evt = e || window.event;
    14     var but = evt.button ? evt.button : evt.which;
    15     switch (but){
    16         case 1:
    17             console.log("左键");
    18             break;
    19         case 2:
    20             console.log("右键");
    21             evt.preventDefault  ?  evt.preventDefault() :  evt.returnValue = true;
    22             break;
    23         case 3:
    24             console.log("中键");
    25             break;
    26         default : break;
    27     }
    28 })

     

      4、滚轮事件:

        IE:mousewheel 向上120、向下-120    FF:DOMMouseScroll 向上-3、向下3

        返回滚动向上和向下的值

        detail:支持FF

        wheelDelta:支持/IE/Opera/Chrome

     1 var oBox = document.getElementById("box");
     2 var isIE = navigator.userAgent;
     3 var eDtail, evt;
     4 
     5 function addEvent(obj, type, fn){
     6     if(obj.addEventListener){
     7         obj.addEventListener(type, fn, true);
     8     }
     9     else{
    10         obj.attachEvent("on"+type, fn);
    11     }
    12 }
    13 
    14 if(isIE.indexOf("Firefox") > -1){  // ff
    15     addEvent(document, "DOMMouseScroll", function(e){
    16         evt = e || window.event;
    17         eDtail = evt.detail ? evt.detail : evt.wheelDelta;
    18         oBox.innerHTML = "ff"+ eDtail;
    19     })
    20 }
    21 else{   // ie、chrome、opera、Safari
    22     addEvent(document, "mousewheel", function(e){
    23         evt = e || window.event;
    24         eDtail = evt.detail ? evt.detail : evt.wheelDelta;
    25         oBox.innerHTML = "ie" + eDtail;
    26     })
    27 }

      5、文本事件:

      6、键盘事件:

        keydown:按下按键,按住不放会重复事件  keypress:按下字符键触发,按住不放会重复事件   keyup:抬盘按键

        按键码keyCode、which、charCode属性:

     1 addEvent(document, "keypress", function(e){
     2     var e = e || window.event;
     3     /*
     4     * 在IE下:支持keyCode,不支持which和charCode,二者值为 undefined
     5     * 在Firefox下:支持keyCode,除功能键外,其他键值始终为 0, 支持which和charCode,二者的值相同
     6     * 在Opera下:支持keyCode和which,二者的值相同,不支持charCode,值为 undefined
     7     */
     8     var curKey = e.keyCode || e.which || e.charCode;
     9     console.log(curKey);
    10     if(curKey === 13){
    11         console.log("已经按下回车");
    12     }
    13 })

      7、菜单事件contextmenu

     1 var oBox = document.getElementById("box");
     2 
     3 function addEvent(obj, type, fn){
     4     if(obj.addEventListener){
     5         obj.addEventListener(type, fn, true);
     6     }
     7     else{
     8         obj.attachEvent("on"+type, fn);
     9     }
    10 }
    11 
    12 // 停闭浏览器默认的菜单
    13 addEvent(window, "contextmenu", function(e){
    14     var e = e || window.event;
    15     if(e.preventDefault){
    16         e.preventDefault();
    17     }
    18     else{
    19         e.returnValue = true;
    20     }
    21 })
    22 
    23 // 右击oBox时打开自定义菜单
    24 addEvent(oBox, "contextmenu", function(e){
    25     // 自定义菜单
    26 })

      8、DOMContentLoaded和readystatechange

        DOMContentLoaded:在DOM树加载完就会触发,不会理会javascript、图像、css或其它资源是否下载完  

     1 function addEvent(obj, type, fn){
     2     if(obj.addEventListener){
     3         obj.addEventListener(type, fn, true);
     4     }
     5     else{
     6         obj.attachEvent("on"+type, fn);
     7     }
     8 }
     9 
    10 addEvent(window, "load", function(){
    11     console.log("a");    // 后输出
    12 })
    13 
    14 addEvent(document, "DOMContentLoaded", function(){
    15     console.log("b");    // 先输出
    16 });    

        readystatechange:对返回文档或元素的加载信息的状态,每个对象都有一个readyState和complete属性;

        IE下使用readyState    标准浏览器complete

        0:未初始化 uninitialized  1:正在加载 loading  2:加载完毕 loaded

        3:可以操作但未加载完成 interactive  4:加载完毕可以对数据进行操作 complete

     1 var oImg = new Image();
     2 oImg.src = "http://zcimg.zcool.com.cn/zcimg/d49653a64c47000001791f12a170.jpg";
     3 
     4 addEvent(oImg, "load", function(){
     5     // IEreadyState是否等于complete,其它浏览器是通过complete是否为true来判断是否加载完成
     6     console.log("complete:" + oImg.complete + ",readyState:" + oImg.readyState);
     7     if(oImg.complete == true || oImg.readyState == "complete"){
     8         console.log("图片预加载成功");
     9         var timer = setTimeout(function(){
    10             document.getElementsByTagName("body")[0].appendChild(oImg);
    11         }, 3000);
    12     }
    13 })

    7、关于事件的其它

      oBox.onclick(e){   }

      1、event对象的兼容

        var evt = e || window.event;

      2、事件目标

        var oTarget = evt.target  ||  evt.srcElement;

      3、获取事件类型

        var getType = evt.type;    // click

      4、阻止冒泡和默认事件

        阻止冒泡:evt.stopPropagation ?  evt.stopPropagation() :  evt.cancelBubble = true;

        取消默认事件:evt.preventDefault  ?  evt.preventDefault() :  evt.returnValue = true;

    四、对象

    1、对象引用:

     1 // 变量的赋值关系
     2 var a = 10;
     3 var b = a;
     4 b += 10;
     5 alert(b); // 20
     6 alert(a); // 10
     7 
     8 // 对象的引用
     9 var a = [1, 2, 3];
    10 var b = a;
    11 b.push(4);
    12 alert(b); // 1,2,3,4
    13 alert(a); // 1,2,3,4
    14 
    15 var a = [1, 2, 3];
    16 var b = a;
    17 b = [1,2,3,4]; // 这块相当于b又创建了一个对象,而不是引用a
    18 alert(b); // 1,2,3,4
    19 alert(a); // 1,2,3

    2、克隆对象但不引用对象

     1 // 如果这种方法克隆对象,改变obj2的时候obj属性也会改变
     2 /*
     3  var obj2 = obj;
     4  obj2.test = 20;
     5 
     6  alert("obj:" + obj.test); // 20
     7  alert("obj2:" + obj2.test); // 20
     8  */
     9 
    10 // 克隆方法,不改变obj,将每个键和值复制过去而不是对象
    11 function extend(o){
    12     var oObj = {};
    13     for(var key in o){
    14         console.log(o[key]);
    15         oObj[key] = o[key];
    16     }
    17     return oObj;
    18 }
    19 var obj2 = extend(obj);
    20 obj2.test = 20;
    21 alert("obj:" + obj.test); // 10
    22 alert("obj2:" + obj2.test); // 20

    五、ajax

      XMLHttpRequest对象:标准下创建 new XMLHttpRequest()、iE下使用new ActiveXObject.

      open("get", "data.php", false): 调用open并不会真正发送请求,参数:请求方式get或post,请求地址,是否异步请求.

      setRequestHeader():传入头字段名称.

      send(null):请求主体发送的数据,不需要传入Null.

      responseText:响应以为文本返回.

      responseXML:响应以xml格式返回.

      status:响应的HTTP状态,如果为200响应成功,404请求地址不存在.

      statusText:HTTP说明.

      readyState:表示请求或响应过程的阶段变化。

            0:未初始化,未调用open    1:启动,已调用open,未调用send();

            2:发送,已调用send,但未接到数据  3:接收:已经接收到部分响应数据

            4:完成,已接收全部响应数据,可以使用

      onreadystatechange事件:检测readyState的变化

    2、HTTP头信息

    Accept:浏览器能够处理的内容类型。

    Accept-Charset:浏览器能够显示的字符集。

    Accept-Encoding:浏览器能够处理的压缩编码。

    Accept-Language:浏览器当前设置的语言。

    Connection:浏览器与服务器之间连接的类型。

    Cookie:当前页面设置的任何Cookie。

    Host:发出请求的页面所在的域 。

    Referer:发出请求的页面的URI。注意,HTTP规范将这个头部字段拼写错了,而为保证与规范一致,也只能将错就错了。(这个英文单词的正确拼法应该是referrer。)

    User-Agent:浏览器的用户代理字符串。

     1 // 创建XMLHttpRequest对象
     2 function newRequest(){
     3     var ajax = false
     4     if(window.XMLHttpRequest) {
     5         ajax = new XMLHttpRequest();
     6     }
     7     else if (window.ActiveXObject) {
     8         try {
     9             ajax = new ActiveXObject("Msxml2.XMLHTTP");
    10         }
    11         catch (e) {
    12             try {
    13                 ajax = new ActiveXObject("Microsoft.XMLHTTP");
    14             } catch (e) {}
    15         }
    16     }
    17     return ajax;
    18 }
    19 
    20 // GET请求
    21 function ajaxGet(url, data, asyn, fn){
    22     var xhr = newRequest();
    23     if(!xhr){ return false; }
    24 
    25     xhr.open("get", url + "?" + data, asyn);
    26     xhr.send(null);
    27     xhr.onreadystatechange = function(){
    28         if(xhr.status == 200 && xhr.readyState == 4){
    29             if(fn){
    30                 fn(xhr.responseText);
    31             }
    32             else{
    33                 return xhr.responseText;
    34             }
    35         }
    36     }
    37 }
    38 
    39 // POST请求
    40 function ajaxPOST(url, data, asyn, fn){
    41     var xhr = newRequest();
    42     if(!xhr){ return false; }
    43 
    44     xhr.open("post", url, asyn);
    45     xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    46     xhr.setRequestHeader("If-Modified-Since","0");
    47     xhr.send(data);
    48     xhr.onreadystatechange = function(){
    49         if(xhr.status == 200 && xhr.readyState == 4){
    50             if(fn){
    51                 fn(xhr.responseText);
    52             }
    53             else{
    54                 return xhr.responseText;
    55             }
    56         }
    57     }
    58 }

    六、跨域请求

    存在跨域和不存在跨域的问题:

      1、 同域下和同域不同文件夹下,不存在跨域

      2、 子域存在跨域

      3、 不同域也是存在跨域问题

    解决跨域的方法:

    1、 子域了主域之间

    方法1:将主域和子域都设置document.domain = “www.365.com”;

    方法2:使用script标签的src,也就是jsonp的形式Jsonp=json+padding()

    方法3:通过loaction.hash值

    方法4:通过iframe、

    方法5:window.name

    方法6:flash

    方法7:HTML5 postMessage

    Jsonp:请求服务器端文件,服务器将函数和返回的值都打印到页面中,showBox来调用这个方法

    1 <script>
    2 function showBox(json){
    3 console.log(json.data);
    4 }
    5 </script>
    6 <script src="jsonp.php?callback=showBox"></script>

    七、操作iframe:

    1、通过ifr.contentWindow来获取iframe的window对象,都兼容,但在chrome下需要有服务器环境才可以,chrome安全沙箱的原因

    2、通过ifr.conentDocument来获取iframe的document对象,但ie6、7都不支持

    例:父页面操作iframe页面

    1 var oIfr = document.getElementById("ifr");
    2 var oBtn = document.getElementById("btn");
    3 oBtn.onclick = function(){
    4     var docIfr = oIfr.contentWindow.document.getElementById("listNum");
    5     docIfr.style.backgroundColor = "#ff0000";
    6 }

    例:iframe页面操作父页面

    通过window.parent(),返回的是父页面的window对象

    1 var oSelectBtn = document.getElementById("selectBtn");
    2 selectBtn.onclick = function(){
    3     var parentIfr = window.parent.document.getElementById("ifr");
    4     parentIfr.style.width = "500px";
    5     parentIfr.style.height = "300px";
    6 }

      通过window.top为找到最顶层,例如:index页面嵌套一个iframe为demo1.html,demo1中又嵌套一个iframe为demo2,这样如果在demo2中使用window.parent,其实找到的demo1这个页面,如果使用window.top就可以直接找到index.html这个页面

    3、iframe的onload事件

     1 window.onload = function(){
     2     var oIfr = document.getElementById("ifr");
     3     oIfr.src = "index.html";
     4     addEvent(oIfr, "load", function(){
     5         alert("aa");
     6     })
     7 
     8     function addEvent(obj, type, fn){
     9         if(obj.addEventListener){
    10             obj.addEventListener(type, fn, true);
    11         }
    12         else{
    13             obj.attachEvent("on"+type, fn);
    14         }
    15     }
    16 }

    八、正则表达式

    1、 test()、search()、replace()、Match():

    str.test(reg):返回一个布尔值,如果查找到返回true,否则返回false

    str.search(reg):查找匹配的位置,如果没有找到返回-1

    str.replace(reg, str1):匹配字符并替换

    str.match(reg):若匹配不到返回null,否则返回数组

    九、JSON与JSON对象

    1、json的三种定义:

      var jsonStr = '{"name": "haha", "age": 20}';  // 注意js中定义json串里面key要使用"",如果使用单引号会报错

      简单值:{"name": "haha", "age": 20}可以在json中使用字符串、数字、布尔、null,但不能在json中使用undefined;

      json对象:{"data": {"name": "haha", "age": 20}, "data1": {"name": "haha1", "age": 21}}

      json数组:[ {"name": "haha", "age": 20},  {"name": "haha1", "age": 21}]

      json与js对象的区别:json是没有变量的,果断json的键只能是字符串,而js对象的键可以不是字符串

    2、json串与对象的互转

      json字符串转为json对象:

      方法一:eval()

        var data  = eval("('+ d +')");

      方法二:stringify():将对象转成json串、parse():将json串转成对象

      IE6、7不支持这两个方法,只在ECMAScript5中才被引入,所以需要下载:https://github.com/douglascrockford/JSON-js/blob/master/json2.js

     1 if(JSON.parse){
     2     var str = '{"name":"haha","age":20}';
     3     var oJson = JSON.parse(str);
     4     console.log(oJson.name);
     5 }
     6 
     7 if(JSON.stringify){
     8     var jsonStr = JSON.stringify(oJson);
     9     console.log(typeof jsonStr, jsonStr);
    10 }

      方法三:jquery将json串转成json对象$.parseJSON(jsonStr)

      

    四、DOM

    一、览器的渲染方式有关系,一般浏览器的渲染操作:

      1、解析HTML结构

      2、加载外部脚本和样式

      3、解析并执行脚本

      4、构造DOM模型

      5、加载外部图片等外部文件

      6、页面加载完成

    五、jQuery重点

    六、javascript性能重点

    一、js性能:

    1、 尽可能减少Javascript与DOM的操作

    1 var str = ""
    2 var oBox = $("#box");
    3 for(var i= 0,len=5000; i<len; i++){
    4     str += "s";
    5 }
    6 oBox.html(str);

    2、 使用innerHTML要比appendChild要快

     1 /* webkit内核:DOM的innerHTML性能要好 */
     2 var str = ""
     3 var oBox = document.getElementById("box");
     4 for(var i= 0,len=5000; i<len; i++){
     5     str += "<li>"+ i +"</li>";
     6 }
     7 oBox.innerHTML = str;
     8 
     9 var str = ""
    10 var oBox = document.getElementById("box");
    11 for(var i= 0,len=5000; i<len; i++){
    12     var oLi = document.createElement("li");
    13     oBox.appendChild(oLi);
    14 }
    15 oBox.innerHTML = str;

    3、 可以减少DOM操作的几个方法

     1 // 第一种方法:cloneNode克隆节点
     2 var oBox = document.getElementById("box");
     3 var oLi = document.createElement("li");
     4 oLi.innerHTML = "aa";
     5 
     6 console.time("a");
     7 for(var i= 0,len=5000; i<len; i++){
     8     var oCreateLi = oLi.cloneNode(true);
     9     oBox.appendChild(oLi);
    10 }
    11 console.timeEnd("a");
    12 
    13 // 第二种方法:访问元素集合,尽量使用局部变量
    14 // 获取两个节点,但都使用了document对象
    15 var obox = document.getElementById("box");
    16 var oLis = document.getElementsByTagName("li");
    17 
    18 // 可以改成
    19 var oDoc = document;
    20 var obox = oDoc.getElementById("box");
    21 var oLis = obox.getElementsByTagName("li");

    4、DOM与浏览器的优化

    重排:改变页面的内容,当js改变了页面一个元素的位置、宽、高,这个过程叫重排。

    重绘:浏览器显示的内容,当执行完重排后浏览器会把内容显示出来,这个过程叫重绘,重排和重绘都会消耗浏览器的性能。

    如果比如改变元素的背景颜色文字颜色,这样只触发了重绘的过程不会进行操作重排

    减少重排、重绘的几个方法:

      1、 尽量在appendChild之前添加操作

     1 var oBox = document.getElementById("box");
     2 var oLi = document.createElement("li");
     3 oLi.innerHTML = "aa";
     4 console.time("a");
     5 for(var i= 0,len=5000; i<len; i++){
     6     var oLi = document.createElement("li");
     7     oLi.innerHTML = "哈哈";
     8 
     9 // 如果将innerHTML放到appendChild下执行就会先执行重排在执行重绘
    10 // 如果放到appendChild之前执行,只执行重排,不会执行重绘
    11     oBox.appendChild(oLi);
    12 }
    13 console.timeEnd("a");

      2、文档碎片

    1 var oBox = document.getElementById("box");
    2 var oFrg = document.createDocumentFragment(); // 创建一个文档碎片
    3 for(var i= 0,len=5000; i<len; i++){
    4     var oLi = document.createElement("li");
    5     oFrg.appendChild(oLi); // 将创建的元素都放到文档碎片中,相当于放到这个袋子中
    6 }
    7 oBox.appendChild(oFrg); // 最后插入的只是袋子

    七、前端新技术性能重点

    一、css预处理less和sass

    二、sea.js

      用于模块化,对项目模块间依赖关系较强的处理比较好

    三、nodejs

      服务器端的js,可以处理线程,scoket、并发和数据库的操作

    四、前端自动构建工具Grunt

      

    五、新技术

      1、懒加载lazyload

      2、预加载

    八、移动端重点

    九、算法重点

  • 相关阅读:
    AtCoder Beginner Contest 145
    [kuangbin带你飞]专题二十二 区间DP
    记录学习记录你
    湖南大学七月夏令营-计算机科学与技术专业
    软件工程 之UML六大关系
    IDEA 中JAVAFX配置
    Vue项目打包后在本地运行:express本地服务器
    真机测试的方法
    解决坑的链接
    vue中实现先请求数据再渲染dom
  • 原文地址:https://www.cnblogs.com/couxiaozi1983/p/3839828.html
Copyright © 2011-2022 走看看