一、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、预加载