js学习内容总结(2)

1.语言基础
2.严格模式
3.js组成(ECMAScript DOM BOM)
4.各种(DOM BOM)例子
5.组件
6.事件
7.事件各种例子
8.运动
9.各种运动例子
10.jquery
11.cookie
12.seajs


语言特性:

预解析:程序执行之前,会把所有变量的声明,提到顶部。(仅仅是声明)
预解析,不会突破你的作用域。
不会突破script标签。

读取一个script->预解析->执行里面的代码->读取下一个script->预解析->执行里面的代码->...

作用:为了性能。不管你喜不喜欢,用不用。它都存在。

函数也有预解析。
注意:变量形式的函数,预解析是按照变量走。

预解析--------火狐下没问题。。。待解释。

引用:在对象身上会出现。

函数的真正写法:
new Function('js语句')

获取字符串编码:
str.charCodeAt(下标); 获取某一位置的编码

通过编码得到字符:
string.fromCharCode(编码);

计算机中所有的汉字:
19968
40869
2万多个汉字。

16进制
4e00-9fa5
16进制js中写法:
0x4e00-0x9fa5

加密解密


关于变量:
变量在第一次声明赋值时,如果不加var会变成全局变量;

全局变量并不好,能不用就不用。

window的就是全局的。

赋值表达式
赋值本身是有值的

逗号表达式:听后面的东西
判断:听后面的
alert:因为alert是函数调用,用逗号相隔,被当成了传参。如果想让逗号表达式好使,加括号提高优先级

赋值:因为都会表达式,优先级特别低,所以先算赋值,后算逗号。加括号就好了

逗号表达式,在声明变量时不能加var.

js中的bug。js中的bug多的跟山一样。


JS的作者是谁?    布兰登.艾克  (Brendan Eich)
    bug是作者弄出来的。

*************************
严格模式
'use strict';

严格模式,用所有的js文件都加上严格模式。
-------------------------

严格模式是不是好东西?必须是好东西。

解决问题:
1.解决了this问题;
2.避免了不加var声明全局变量;
3.不允许在if,switch,for,while,for in里面声明函数;
4.不允许使用with
注意:
1.严格模式有作用范围;函数、script标签、js文件
2.严格模式的'use strict'必须放在第一位置;

高级浏览器兼容,IE9除外;


------------------------------------

异常  bug

程序员不可控制的东西。


try...catch...

try(){
    可能会出错的代码;
}catch(){
    e代表了,错误信息
    补救措施
}

不要用。救急的时候用。线上bug用
性能差


-------------------------------------

js由什么组成?

ECMAScript  核心解释器
定义了一些基本的语法和功能。

兼容性:完全兼容。因为,提供的都是最基本,最简单的功能。
---------------------------
DOM 文档对象模型  Document Object Model
    document    所有文档的操作。
    获取元素,改变颜色。删除元素,改个宽度,创建个元素,修改个内容。

兼容性:基本兼容,有不兼容的,可以解决。
---------------------------
BOM 浏览器对象模型 Borswer Object Model
    windou  所有关于浏览器的操作。
    关闭个页面,打开个新窗口,访问一下历史记录。检测浏览器信息

兼容性:基本不兼容,不兼容没办法解决。

--------------------------
前端实现不了的功能:

1.复制剪贴的内容
2.全选
3.判断app安装
4.自动播放背景音乐
5.判断是不是4G
6.获取mac

-------------------------------------

js组成部分:
ECMAScript  核心解析器
-------------------------------------
DOM     文本对象模型

标签=元素=节点

DOM树

获取标签名
obj.tagName 每个字母都是大写的

获取父级的子节点
obj.children    获取子节点(只包括第一层)

obj.childNodes  获取子节点(会把文本节点一起获取到)

    检测节点类型
    obj.nodeType
        标签节点 1
        文本节点 3
        document 9

获取父节点
obj.parentNode  获取父节点
    最大的祖宗就是document,在往上没了所以是null

获取兄弟节点:
获取下一个兄弟节点
obj.nextElementSibling  只兼容高级浏览器
obj.nextSibling     只兼容低版浏览器
兼容写法:
var oNext=obj.nextElementSibling||obj.nextSibling;


关于并且
    &&两边都是真的,才算真的。如果第一个是真的,那就有必要去看看第二个。
    如果第一个是假的,那就没有必要去看第二个,也就不执行。
关于或
    ||有一个是真的,整个例子就是真的。如果第一个是假的,那就有必要去看看
    第二个。如果第一个是真的,那就没有必要去看第二个,也就是不执行。如果
    多个都是假的,那就听最后一个。

获取上一个兄弟节点
obj.previousElementSibling  只兼容高级浏览器
obj.previousSibling     只兼容低版浏览器
兼容写法:
var oPre=obj.previousElementSibling||obj.previousSibling;
---------------------------------------------------------
获取首尾子节点:
获取首子节点
父级.firstElementChild        只兼容高级浏览器
父级.firstChild           只兼容低版浏览器
兼容写法:
var oFirst=父级.firstElementChild||父级.firstChild

获取尾子节点
父级.lastElementChild     只兼容高级浏览器
父级.lastChild            只兼容低版浏览器
兼容写法:
var oFirst=父级.lastElementChild||父级.lastChild

--------------------------------------------------------

物体信息:
obj.offsetWidth;    获取盒子模型的宽度
obj.offsetHeight;   获取盒子模型的高度
obj.offsetLeft;     距离定位父级的左边距
obj.offsetTop;      距离定位父级的上边距



    getStyle    offsetWidth
类型  string      number
width   纯width      盒子模型的宽度
none    能获取     不能获取

obj.offsetParent    获取到定位父级

关于父级
obj.parentNode      结构上的父级  最大document
obj.offsetParent    定位上的父级  最大body
-----------------------------------------------------
字节
    英文字母    1字节
    数字      1字节
    汉字  GB2312      2字节
        UTF-8       3字节
-----------------------------------------------------

创建元素
document.createElement('标签名')   创建出来的元素跟html中写的一模一样
插入
父级.appendChild(新元素)     在元素的最后面插入一个东西
父级.insertBefore(要插入,插入谁)    插入到谁谁之前

删除元素
父级.removeChild(要删除的元素)      从父级中删除某个元素
            
克隆元素
obj.cloneNode();
obj.cloneNode(true);    深度克隆
            会把内容一起克隆

会把ID一起克隆,所有要注意:
克隆之后要把ID删掉
但是有问题,会留一个空的ID,不好看。后面待解决。。。




-------------------------------------       
BOM     浏览器对象模型

BOM 操作浏览器

window.open(要打开的地址) 打开一个页面
chrome      拦截
Firefox     阻止
IE      直接打开
注意:用户的操作才能直接打开新的页面。

window.close()          关闭当前页面
chrome      直接关闭
IE      问问你是否确定要关闭
Firefox     脚本不得关闭非脚本打开的窗口
注意:脚本打开的窗口,它才可以完美的关闭。


window.navigator.userAgent  获取浏览器版本信息

about:blank;    空白页

在线运行代码:
window.open();  打开一个新的空白页,打开之后它会返回新页面的window
可以用新的window去document.write();
在线运行代码,只能看不能用。

window.location     当前地址
    window.location.protocol    获取协议    
    window.location.pathname    路径
    window.location.host        网址
    window.location.hash        锚
    window.location.search      提交的数据
    window.location.href        页面跳转

http    超文本传输协议
https   超安全超文本传输协议

用户体验:
document    document
body        document.body
title       document.title
html        document.doucmentElement


----------------------------------------
右下角富媒体(右下角悬浮框)
方法:

    1.position:absolute right:0 bottom:0
    2.position:fixed right:0 bottom:0
    3.js计算

滚动条滚动事件
onscroll

滚动距离
document.documentElement.scrollTop  上下滚动距离
兼容Firefox和IE
document.body.scrollTop
兼容chrome

兼容写法:
var scrollT=document.documentElement.scollTop||document.body.scrollTop


document.documentElement.scrollLeft 横向滚动距离
兼容Firefox和IE
document.body.scrollLeft
兼容chrome

兼容写法:
var scrollT=document.documentElement.scollLeft||document.body.scrollLeft


可视区大小(可视区宽高):
document.documengElement.clientWidth    可视区宽度

document.documengElement.clientHeight   可视区高度


改变窗口大小事件
onresize

---------------------------------------
获取绝对位置
function getPos(obj){
    var l=0;
    var t=0;

    while(obj){
        l+=obj.offsetLeft;
        t+=obj.offsetTop;
        obj=obj.offsetParent;
    }

    return {left:l,top:t};
}


getBoundingClientRect().left    元素左边距离页面左边的距离
getBoundingClientRect().top 元素上边距离页面上边的距离
getBoundingClientRect().right   元素右边距离页面左边的距离
getBoundingClientRect().bottom  元素下边距离页面上边的距离


图片延迟加载(懒加载)
好处:省流量,省资源

关于属性
obj.getAttribute('属性名');        获取自定义属性
get     获取得到
Attribute   属性

obj.setAttribute('属性名字','属性值')  设置自定义属性

要成对出现

obj.removeAttribute('属性名')      删除属性

解决cloneNode()问题:
切记,使用cloneNode:cloneNode之后一定要removeArrtibute


-----------------------------------
瀑布流:


系统提供的,获取一组元素的方法,获取出来的不是一个真正的数组。
所以用不了常用的数组方法。
================================
getElementById


===============================

obj.offsetHight     获取盒子模型的高度


obj.scrollHight     内容高度

-------------------------------------
吸顶条

-------------------------------------
文本提示框
obj.onfocus 获取焦点事件
obj.onblur  失去焦点事件


obj.focus() 让一个元素获取焦点
obj.blur()  让一个元素失去焦点

------------------------------------
innerHTML的问题:
永远都是先把原来的删除,然后再添加
注意:会把之前的元素的事件给杀掉。



-------------------------------------   

图片预加载
========================================
oImg.onload         当图片加载成功之后触发
oImg.onerror            当图片加载失败之后触发

图片对象
new Image();        创建一个图片对象
这种写法跟html中写img标签没有任何区别。

网络进度条
http://www.zhinengshe.com/works/3525/img/0.jpg

求比例:拿已有的/总共

不适合处理小数
0.04000000000000001
保留小数    .toFixed(保留的位数);

=================================
appendChild
insertBefore
剪切功能



==========================================
table

oTable.tBodies[0]       能获取到表格中的tbody
oTBody.rows         tbody中的所有tr
oRow.cells          列

DOM结束了。

==============================================
关于form表单:
form是干什么的?      向服务器提交数据的。
    必不可少的部分
        action      提交地址
        submit      提交按钮
        name        

提交地址的区别
有http://        是在网上找
没有http://       是在本地找

地址写?相当于提交到当前页面

method      提交方式
    get     系统默认的提交方式
        明文提交,不安全,容量小(32KB左右),有缓存
    post
        密文提交,相对安全,容量大(1GB),没有缓存

http://     超文本传输协议
https://    超安全超文本传输协议
    一般人用不了,因为收费,还很贵。

资源,分享
get便于分享。

name可以重复。

获取元素
document.getElementById     通过id获取一个
obj.getElementsByTagName        通过标签名获取一组
obj.getElementsByClassName      通过class获取一组
document.getElementsByName      通过name获取一组

===========================================
事件
onload      加载成功事件
onerror     加载失败事件
onclick     点击事件
onmouseover     鼠标移入事件
onmouseout      鼠标移出事件
onresize        改变可视区大小事件
onscroll        滚动滚动条事件
onmouseup       鼠标抬起事件
onmousedown 鼠标按下事件
onchange        状态改变事件
onfocus     获取焦点事件
onblur          失去焦点事件
ondblclick      双击事件
onmousemove     鼠标移动事件
===================================
事件对象        包含了事件的详细信息。
参数ev            兼容:高版本浏览器
event           兼容:IE,chrome
兼容写法:   var oEvent = ev||event;


获取鼠标在可视区中的坐标
横轴坐标X   事件对象.clientX
纵轴坐标Y   事件对象.clientY

鼠标在页面中的坐标:  只兼容高版本浏览器
oEvent.pageX
oEvent.pageY


以后只要是使用到了可视区中的坐标,就一定要加上滚动距离

事件冒泡
子级触发了事件,会找父级相同的事件,一直找到顶。
哪怕子级没有这个事件,也会往上冒。
找父级,是按照结构找的,跟定位没有任何关系。

取消冒泡。
oEvent.cancelBubble=true;

***如果事件冒泡没有出问题,就不要去取消冒泡。
***如果随便取消冒泡,会出现一些意想不到的结果。

放大镜

l/(oS.offsetWidth-oM.offsetWidth)=?/(oImg.offsetWidth-oB.offsetWidth)
l2=l/(oS.offsetWidth-oM.offsetWidth)*(oImg.offsetWidth-oB.offsetWidth)


-------------------------------------
放大镜:



事件对象:只能获取鼠标和键盘的事件。

键盘事件:
onkeydow    键盘按下
onkeyup     键盘抬起

每个按键都有一个编码
oEvent.keyCode  获取键盘编码

a   65
b   66
c   67
d   68

←   37
↑   38
→   39
↓   40


键盘控制div移动,不卡。作业
--------------------------------------

默认事件    浏览器自带的一些行为。
阻止默认事件  
return false;

右键菜单    上下文菜单
oncontextmenu


刷新页面:(页面重新加载)
window.location.reload();


表达提交事件:
oForm.onsubmit

Js当中不允许使用组合按键的编码
oEvent.ctrlKey  如果按下crtl就是ture,否侧就是flase
oEvent.shiftKey 如果按下shift就是ture,否侧就是flase
oEvent.altKey   如果按下alt就是ture,否侧就是flase


-------------------------------------

拖拽
鼠标按下    保存鼠标在DIV中的位置
鼠标移动    鼠标新的位置-鼠标在div中的位置
鼠标抬起    干掉所有不用了的事件


设置捕获和释放捕获是IE的东西

设置捕获    把所有浏览器自带的事件都干掉,只听当前这个元素的。
obj.setCapture();

释放捕获
obj.releaseCapture();

输入文字的事件
obj.onpropertychange    IE系列
obj.oninput     兼容高级浏览器
事件不用处理兼容
obj.onpropertychange=obj.oninput=function(){}
IE9兼容了吗?删除不好用

-------------------------------------
**在工作当中所有的事件必须绑定上去
**因为这个事件不一定只有你一个人使用

同一个元素加同一个事件,不能加多次,后加的会把先加的覆盖。

事件绑定(事件监听)  给同一个元素加同一个事件加多次。

obj.addEventListener(sEv,fn,flase); 兼容高级浏览器,事件名不能加'on'
obj.addEventListener(事件名,函数,flase);

obj.attachEvent('on'+sEv,fn);       兼容IE系列,IE10-

兼容写法:
function addEvent(obj,sEv,fn){
    if (obj.addEventListener) {
        obj.addEventListener(sEv,fn,false);
    } else{
        obj.attachEvent('on'+sEv,fn);
    }
}

false   事件冒泡
true    事件捕获


事件流:
DOM事件流  冒泡和捕获
IE事件流   冒泡
事件冒泡(冒泡阶段);false    子级往父级找  所有浏览器(冒泡)
事件捕获(捕获阶段);true 父级往子级找  高级浏览器(冒泡和捕获)
只有高级浏览器有,因为只有使用addEventListener(,,ture)的时候才会触发

兼容写法:
function removeEvent(obj,sEv,fn){
    if (obj.removeEventListener) {
        obj.removeEventListener(sEv,fn,false);
    } else{
        obj.detachEvent('on'+sEv,fn);
    }
}

匿名函数不能解除绑定。

this不好的用法:
1.定时器
2.事件中套了一层函数
3.行间事件中套了一层函数
4.attachEvent中使用this

九宫格拖拽


var oldX = oEvent.clientX;
var oldY = oEvent.clientY;
var oldW = oBox.offsetWidth;
var oldH= oBox.offsetHeight;
var oldL = oBox.offsetLeft;
var oldT = oBox.offsetTop;

-------------------------------------

碰撞检测
判断是否碰到了,不靠谱,因为条件太多

判断是否没碰到
r1<l2||b1<t2||l1>r2||t1>b2
--------------------------------------

问题:
1.循环加事件,性能不好
2.给未来元素加事件(之间加的事件,未来的元素没有)


事件委托(事件委派):
oEvent.srcElement   触发这个事件的源头是谁
兼容Chrome,IE系列
oEvent.target       触发这个事件的源头是谁
兼容火狐

兼容写法:
var oSrc=oEvent.srcElement||oEvent.target;

obj.tagName 获取标签名(标签名大写)

作用:
1.提高性能;
2.给未来元素加事件;


---------------------------------------
自定义的滚动条

---------------------------------------
鼠标滚轮事件
onmousewheel        兼容chrome,ie
oEvent.wheelDelta   获取鼠标滚轮滚动的方向
            下   -120
            上   120

DOMMouseScroll  兼容firefox
oEvent.detail   获取鼠标滚轮滚动的方向
        下   3
        上   -3

DOM事件
1.以DOM开头的事件
2.DOM事件不能直接加,必须要使用事件绑定去加。

return false阻止默认事件遇到了事件绑定addEventListener就不好使了
oEvent.preventDefault();  阻止默认事件    兼容高级浏览器

回调函数
-------------------------------------
移入移出bug:
onmouseover

oEvent.fromElement(不兼容火狐)
oEvent.relatedTarget(兼容高级浏览器)
兼容写法:
oEvent.fromElemen||oEvent.relatedTarget

移入div里面
            正常
外部直接移入到div  body
外部直接移入到h2   html

            异常
从div移动到h2       div
从h2移动到div       h2


检测obj是否包含obj2
obj.contains(obj2)  
        包含  ture
        不包含 false
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
onmouseout

oEvent.toElement(不兼容火狐)
oEvent.relatedTarget(兼容高级浏览器)
兼容写法:
oEvent.toElemen||oEvent.relatedTarget
    

obj是否包含obj2
obj.contains(obj2)  
        包含  ture
        不包含 false
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这两个事件本身没有over和out的bug
onmouseenter    代替移入
onmouseleave    代替移出

-------------------------------
window.onload       html,css,js,图片,flash...
    把所有资源都加载完成之后执行

domready    document,比window.onload快一些

DOMContentLoaded    兼容IE9+,chrome,firefox

onreadystatechange  兼容低版本IE

document.readyState
interactive 开始加载
complete    加载完成


if (document.addEventListener) {
    document.addEventListener('DOMContentLoaded',function(){
        fn();
    },false)
}else{
    document.attachEvent('onreadystatechange',function(){
        if (document.readyState=='complete') {
            fn();
        }
    })
}


------------------------------
运动: 让一个东西动起来

定时器有问题:
1,定时器不稳定
2.切换标签会变慢

start   起点      0
target  目标点     500
dis=target-start    总距离

time 总时间        3000
count总次数    time/30 100

一次走多少  总距离/总次数


运动核心:
dis 总距离
count   总次数

start+n*dis/count;
start+dis*n/count;

运动框架:
starMove(obj,iTarget,time);
starMove(obj,sName,iTarget,time);
starMove(obj,sName,iTarget,time);
多个物体运动:
starMove(obj,sName,iTarget,time); 能改变opacity

写运动例子的秘诀:
1.先把基本的功能做出来
2.把基本的功能转化成运动

-------------------------------------

运动核心:
dis 总距离
count   总次数
start+dis*n/count;

-----------------------------
匀速运动(线性运动)
start+dis*n/count;

加速运动
var a=n/count;
start+dis*Math.pow(a,3);

减速运动
var a=1-n/count;
start+dis*(1-Math.pow(a,3));

匀速运动    linear
加速运动    ease-in
减速运动    ease-out

链式运动
startMove(obj,json,type,time,fnEnd);
合并参数
startMove(obj,json,options);

给默认值
startMove(obj,json,options)
----------------------------
运动框架:
dis
count
start+dis*n/count


function getStyle(obj,sName){
    return (obj.currentStyle||getComputedStyle(obj,false))[sName];
}
function startMove(obj,json,options){
    options = options||{};
    options.duration = options.duration||700;
    options.easing = options.easing||'ease-out';
    var start = {};
    var dis  = {};
    for(var name in json){
        start[name] = parseFloat(getStyle(obj,name));
        if(isNaN(start[name])){
            switch(name){
                case 'left':
                    start[name]=obj.offsetLeft;
                    break;
                case 'top':
                    start[name]=obj.offsetTop;
                    break;
                case 'height':
                    start[name]=obj.offsetHeight;
                    break;
                case 'width':
                    start[name]=obj.offsetWidth;
                    break;
                case 'opacity':
                    start[name]=1;
                    break;
                case 'borderWidth':
                    start[name]=0;
                    break;
            }
        }
        dis[name]=json[name]-start[name];
    }
    var count = Math.floor(options.duration/30);
    var n = 0;
    clearInterval(obj.timer);
    obj.timer = setInterval(function(){
        n++;
        for(var name in json){
            switch(options.easing){
                case 'linear':
                    var cur = start[name]+ dis[name]*n/count;  
                    break;
                case 'ease-in':
                    var a = n/count;
                    var cur = start[name]+ dis[name]*Math.pow(a,3); 
                    break;
                case 'ease-out':
                    var a = 1-n/count;
                    var cur = start[name]+dis[name]*(1-Math.pow(a,3));
                    break;
            }
            if(name=='opacity'){
                obj.style.opacity=cur;
                obj.style.filter='alpha(opacity:'+cur*100+')';
            }else{
                obj.style[name]=cur+'px';
            }
        }
        if(n==count){
            clearInterval(obj.timer);
            options.complete&&options.comlete();
        }
    },30);
}



-------------------------------------

回到顶部
人改的和JS该的都嫩该出发onscroll事件
区分是人滚动的还是JS滚动的。

无缝滚动;
1.marquee   标签
2.判断offsetLeft
3.数学去算。

left<0  left%w;
left>0  (left%w-w)%w;

**减少dom操作


定时器是一个特殊的循环。
分步运动;
无限运动;



-------------------------------------

圆:

a 假设是角度;

需求:角度转弧度;
360=2π;
180=π
π=3.14

角度--》弧度
n*PI/180

funciton d2a(d){
    return d*Math.PI/180;
}

弧度--》角度
n*180/PI

function a2d(a){
    return a*180/Math.PI;
}


Math.sin(); sinα
Math.cos(); cosα
Math.PI();  π

sinα=对边比斜边  sinα=a/R;
a=sinα*R
x轴  X=R+sinα*R;


cosα=b/R
b=cosα*R
y轴  Y=R-cosα*R

---------------------------
穿墙:
1.判断    32个判断
2.算
判断鼠标从哪个方向移入的DIV
判断鼠标从哪个方向移出的DIV

方向-》角度

Math.atan2(y,x);

---------------------------
苹果菜单:

Math.sqrt(a*a+b*b)
---------------------------
官网分页
------------

布局  浮动
JS效果    定位

布局转换    布局依然用浮动,用JS把布局变成定位
写布局转换,必须写2个循环,不能写一个。



-------------------------------------
服务器:是计算机。基本功能:存储。

    WEB服务器:响应客户端的请求

把自己的计算机变成服务器。

集成环境    
wamp    在window环境下  手动启动
appserv         自动启动
mamp    mac环境下

localhost
127.0.0.1

---------------------------------
目前的问题:
1.引入js文件太多。
2.引入js文件有先后顺序,因为有依赖关系。
3.变量名各种冲突,覆盖

变量名冲突:
封闭空间
命名空间


模块化:
seajs       国产  CMD
公共模型模块
comon module define

requirejs   进口  AMD
异步模型模块
Asynchronous module define

作用:
1.不用手动引入JS文件
2.解决依赖关系的问题
3.解决变量名冲突、覆盖的问题
()
seajs
http://seajs.org

requrejs
http://www.seajs.org

**最好放在服务器环境下。

一个JS文件就是一个模块,一个模块就是一个功能

define(function(require,exports,module){
    require 导入一个模块
    exports 导出一个模块
    module  批量导出模块
});

seajs.use(模块名,function(){

});

可以不写后缀名

定义模块
define(function(require,exports,module){
    require         导入一个模块
    exports         导出一个模块
        eg: exports.a=12;
    module.exports={}   批量导出模块
});

使用模块
seajs.use(模块名,function(mod){
    mod 模块
});
使用多个模块
seajs.use([模块名,模块名2],function(mod,mod2){
    mod 模块
});


<script src='' data-main=''></script>


给路径起别名
seajs.config({
    alias:{
        别名:路径
    }
})
--------------------------------------
事件
onmouseover
onmouseout
onmousedown
onmouseup
onmousemove
onkeydown
onkeyup
onload
onerror
onchange
onclick
ondblclick
onscroll
onresize
onsubmit
oncontextmenu
onmouseenter
onmouseleave
onfocus
onblur
oninput
onpropertychange
onreadystatechange
DOMContentLoaded
onmousewheel
DOMMouseScroll

事件对象
var oEvent = ev||event;
oEvent.clientX
oEvent.clientY
oEvent.cancelBubble=true;
oEvent.detail
oEvent.wheelDelta
oEvent.keyCode
oEvent.ctrlKey/shiftKey/altKey
oEvent.srcElement
oEvent.target
oEvent.fromElement
oEvent.toElement
oEvent.relatedTarget
oEvent.preventDefault()
oEvent.pageX
oEvent.pageY


-------------------------------------
图片预加载用数组包起来
var images = new Array();
 
function preloadImages(){
    for (i=0; i < preloadImages.arguments.length; i++){
         images[i] = new Image();
        images[i].src = preloadImages.arguments[i];
    }
}
preloadImages("logo.jpg", "main_bg.jpg", "body_bg.jpg", "header_bg.jpg", "jser.jpg");
=================================================
滚轮事件:
function addEvent(obj,sEv,fn){
    if (obj.addEventListener) {
        obj.addEventListener(sEv,fn,false);
    } else{
        obj.attachEvent('on'+sEv,fn);
    }
}
function addwheel(obj,fn){
    function fnwheel(ev){
        var bOk=true;
        var oEvent=ev||event;
        if (oEvent.wheelDelta) {
            if (oEvent.wheelDelta<0) {
                bOk=true;
            } else{
                bOk=false;
            }
        } else{
            if (oEvent.detail>0) {
                bOk=true;
            } else{
                bOk=false;
            }
        }
        fn&&fn(bOk);
        oEvent.preventDefault&&oEvent.preventDefault();
        return false;
    }
    if (window.navigator.userAgent.indexOf('Firefox')!=-1) {
        addEvent(obj,'DOMMouseScroll',fnwheel)
    } else{
        addEvent(obj,'mousewheel',fnwheel)
    }
}


-------------------------------------
JQuery  库   完全由一推JS代码组成
    辅助我们开发,帮助我们快速开发。

jquery能做的事,js一定能做。
JS能做的事,jquery不一定能做。
JS不能做的事,jquery必须能做到。

www.jquery.com

JQuery版本:
1.X 适用于亚非拉地区

2.X 适用于欧美
    不兼容低版本IE的

不是版本号越高就越好。
1.7.2

JQuery免费
---------------------------------
JQuery主要是给不会用原生JS人用的;


JS          JQuery
window.onload       $(function(){});
获取元素        $('#btn');
加事件         .click();


JQeury:
页面加载    $(function(){});
添加事件    .click(function(){});
--------------------------------
show();         显示
hide();         隐藏
hover(fn1,fn2);     移入移出切换
toggle(fn1,fn2);    点击切换
        里面可以放好多函数。切换着执行。

效果: 有问题,不用
fadeIn();       淡入
fadeOut();      淡出

slideDown();        滑入
slideUp();      滑出


效果停止:
.stop();

动画:
animate({});        动画
*以后只要使用animate前面一定要加.stop();
--------------------------------

JQuery选择器:

$('#id')    通过ID获取
$('.class') 通过class获取
$('标签名')    通过标签名获取

$().find()  在XXX中获取XXX元素

层级选择器
$('#box ul li input')

属性选择器
$('元素名[属性名=属性值]');

伪类选择器
:first;         获取第一个
:last;          获取最后一个
:eq(2);         获取到下标是几的元素      
:lt(2);         获取到下标小于几的元素
:gt(2);         获取到下标大于几的元素

:odd            获取到奇数行的元素
:even           获取到偶数行的元素

:contains(text);    获取到包含某一段文本的元素
:has();         获取到包含某一个标签的元素

修改样式
.css(样式名,样式值);


---------------------------------
jquery操作:

jquery中的所有的获取都是获取的第一个

操作样式
.css('样式名');                    获取样式
.css('样式名','样式值');          设置一个样式
.css({样式名:样式值,样式名:样式值});        批量设置样式

操作属性
.attr('属性名');               获取样式
.attr('属性名','属性值');         设置一个样式
.attr({属性名:属性值,属性名:属性值});   批量设置样式

操作内容
    表单元素
        .val('');   设置
        .val();     获取
    非表单元素
        .html('')   设置
        .html();    获取

操作class
    添加class
        addClass('class')   添加
    删除class
        removeClass('class')    删除

----------------------------------

.eq 下标的意思

jquery中的this
$(this)

得到当前元素的索引
$(this).index();

----------------------------------
jquery的DOM
$('div').append('<strong>jquery</strong>')  在div内部的最后面追加一个strong

$('strong').appendTo('div')         把strong追加到div元素内部中后面
$('<em></em>').appendTo('div')          创建一个em追加到div内部中后面


$('div').prepend('<strong>jquery</strong>') 在div内部的最前面追加一个strong

$('strong').prependTo('div')            把strong追加到div元素内部中前面
$('<em></em>').prependTo('div')         创建一个em追加到div内部中前面


$('div').after('<strong></strong>')     把strong添加到div后面
$('div').bofore('<strong></strong>')        把strong添加到div面前
$('p').inserAfter('div')            把p放到div外部后面
$('div').inserBofore('p')           把div放到p内部前面


----------------------------------
创建一个元素
$('标签');

删除元素
$('div').remove();

---------------------------------
jquery事件
jquery中所有的事件都是绑定上去的

jquery事件中的绑定
$(选择器).bind('事件',fn);
$(选择器).on('事件',fn);

jquery事件中的解除绑定
$(选择器).unbind('事件',fn);
$(选择器).off('事件',fn);

使用时一定要注意:
$(选择器).unbind();    把所有元素都解除绑定

事件委托
$().live('事件',fn);

解除事件委托
$().die('事件',fn);

ev事件对象直接是兼容的。

return false;   阻止默认事件,取消冒泡

阻止默认事件
ev.preventDefault();

取消冒泡
ev.stopPropagation();


$().position().left

$().position().top


-------------------------------------

jquery 物体信息

获取相对于父级的位置  不包括margin
$('选择器').position().left    offsetLeft
$('选择器').position().top offsetTop

获取元素的绝对位置
$('选择器').offset().left  getPos().left
$('选择器').offset().top   getPos().top

$('选择器').width()        纯宽度
$('选择器').height()       纯高度
$('选择器').innerWidth()   宽度+padding
$('选择器').innerHeight()  高度+padding
$('选择器').outerWidth()   高度+padding+border   盒子模型offsetWidth
$('选择器').outerHeight()  高度+padding+border   盒子模型offsetHeight

==================================
原生JS对象:document.getElementById
    原生JS对象不能使用jquery中的方法和属性
jquery对象:$()
    jquery对象不能使用原生JS中的方法和属性

原生JS对象和jquery对象转换
原生JS对象-》jquery对象
            用$()包起来

jquery对象-》原生JS对象
            1.$('选择器')[下标]
            2.$('选择器').get(下标)

index() 当前这个元素在同级元素中的第几个

工具:
$.trim(obj) 去掉字符串两端的空格
$.isarray(obj)  判断是否是数组,是就返回ture,否侧返回false
$.type(obj) 检测是什么数据类型

==================================
jquery的链式操作

siblings(); 同级

==================================
jquery插件    非常火
关于插件有两种人:
用插件的人   舒服  简单,快速,提高工作效率
写插件的人   更舒服 $$$

==================================
****jquery中所有的this都是JS原生对象,但有一个例外,在插件
里面this就是jquery对象。

写插件
$.fn.xxx=function(){

}

$.fn.插件名=function(){

}

$.fn.extend({
    插件名:function(){

    },
    插件名:function(){

    }
})
=================================
jquery中的循环

$('选择器').each(function(index,element){
    //index     索引
    //elemnt    每一个原生对象
    //this      每一个原生对象

})

-------------------------------------

cookie  存东西
===============================
1.要知道如何使用
2.要知道什么时候使用
===============================
cookie的特性:
1.必须配合服务器环境使用
2.cookie是成对出现的。一个名字对应着一个值
3.cookie不安全,所以不会去保存一些重要的数据
4.cookie的容量是有限的,比较小,差不多有4KB左右
5.cookie有生命周期。生命周期:活多久。
    expires 生命周期
    默认是 Session
    session 当会话结束时,就死掉。
        当浏览器关闭时,会话算是结束了。
6.cookie不能跨域名
7.cookie不能跨浏览器
8.cookie作用域:
    /2015-10-21/a/b 一个cookie只有在这个路径下使用

name        value       path        expires
名字      存的东西    存到哪     生存周期
==============================

1.如何来创建一个cookie?
    document.cookie='';     错误的
    document.cookie='名字=值'; 正确的
    document.cookie='age=18';


    创建cookie的时候设置一下生命周期
    EXPIRES
    var oDate=new Date();
    oDate.setFullYear(2016);
    oDate.setHoure(0,0,0,0);
    document.cookie='name=value; EXPIES='+oDate;


    真正创建一个cookie
    document.cookie='name=value; PATH=/; EXPIRES='+oDate;


function addCookie(name,value,iDay){
    if (iDay) {
        var oDate=new Date();
        oDate.setDate(oDate.getDate()+iDay);
        document.cookie=name+'='+value+'; PATH=/; EXPIRES='+oDate.toGMTString();
    } else{
        document.cookie=name+'='+value+'; PATH=/; 
    }
}

2.获取cookie
如何获取cookie?

function getCookie(name){
    var arr=document.cookie.split('; ');
    for (var i=0;i<arr.length;i++) {
        var arr2=arr[i].split('=');
        if (arr2[0]==name) {
            return arr2[1];
        }
    }
}

3.如何删除一个cookie

function removeCookie(name){
    addCookie(name,1,-1);
}




在不同浏览器下日期格式是不同的:2种
1.GMT
2.UTC

把日期转成GMT格式:
oDate.toGMTString();
===============================
1.要知道如何使用   √
2.要知道什么时候使用
===============================


前端
切图+JS       偏南      8K-15K
交互      非常简单    8K以上
--------------------------------------
交互:玩的就是数据

1.form表单    交互  提交数据
    form想要提交数据必须有的东西
        action      地址
        name    value
        submit      提交

    method          提交方式
        GET 
            明文提交,不安全,容量小(32KB),缓存
        POST
            密文提交,相对安全,容量大(1GB),没缓存

        GET优势:便于分享


缓存:cache,同一个网页,同一个地址,只会访问一次。

form表单交互,已经渐渐的退出了舞台
原因:
1.刷新页面(覆盖页面),用户体验差,浪费带宽(浪费钱)
2.从服务器取数据
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ajax:
    无刷新从服务器取数据

服务器:电脑,存东西
    web服务器:响应浏览器(客户端请求)请求
wamp        window      手动启动
appserv             自动启动
mamp        mac
==================================
**********ajax配合服务器环境
**********确保服务器安装路径没有中文,以后创建项目(文件夹和文件)都不要用中文
==================================

-------------------------------------
ajax比较难
        用着难
==================================
ajax到底怎么用?

ajax(地址,成功的回调函数,失败的回调函数);
ajax(url,fnSuss,fnFail);

回调函数:你只需要去定义函数,具体什么时候执行,到底执不执行,
你都关心不着,你也关心不了。

例:
ajax('a.txt',function(a){
    alert(a);
},function(){
    alert('!ok');
})
---------------------------------
****ajax注意:

1.缓存    cache
    同一个网址,同一个资源,只会访问一次。


处理缓存问题:
=Math.random();         推荐使用
=new Date().getTime();

例:
ajax('a.txt?t='+Math.random(),function(a){
    alert(a);
},function(){
    alert('!ok');
})


2.ajax返回的结果,都是string
        需要eval
        eval('('+str+')');

        eval不安全,不让用。

        eval的替代品:
        new Function('return'+str)();

        用eval,因为上边这个更不安全。
        注:用eval解析的时候两边要加上();

3.乱码
    编码不统一
            UTF-8   国际编码
            GB2312  国产
        都会用UTF-8编码


4.不关心后缀名
    后缀名是给人看的。


================================
微博。换一换(局部刷新)
===========================
    **造假数据

先ajax,然后再创建元素

**先交互,后做你的功能。

-------------------------------------
写ajax:
1.创建一个ajax
var oAjax=new XMLHttpRequset(); 
                        
        requset 请求非             IE6浏览器

        IE6本身并没有ajax,如果想实现要用插件

var oAjax=new ActiveXObject('Microsoft.XMLHTTP');   IE6浏览器

假的东西可以去判断,但是报错的东西没法判断;
访问一个不存在的变量或者函数的时候,会报错。但是如果,访问一个不存在的
属性就会是undefined;

2.打开一个连接

oAjax.open(提交方式,url,true(是否异步));

oAjax.open('GET',url,true(是否异步));

异步  一次只能做一件事    ajax就是做多件
同步  一次能做多件事     ajax就是一件

3.发送
oAjax.send();

4.接收
oAjax.onreadystatechange=function(){
    //判断一下状态
    if(oAjax.readyState==4){
        //判断http状态码
        if(oAjax.status>=200&&oAjax.status<300||oAjax.status==304){
            //成功
            alert(oAjax.responseText);
            成功之后获取到的结果
        }else{
            //失败
            alert(oAjax.status);
        }
    }
}


ajax请求的状态
0.准备成功,未发送
1.发送成功
2.接收原始数据完成
3.解析原始数据
4.真正完成

HTTP状态码

-----------------------------------
IE不适合处理中文
编码
encodeURIComponent();   把中文转成编码

decondeURIComponent();  把编码转成中文 前端99%用不到

GET
打开连接
oAjax.open('GET',url+'?'+data,true);
发送
oAjax.send();
------------------------------------
function json2url(){
    json.t=Math.random();
    var arr=[];
    for (var name in json) {
        arr.push(name+'='+encodeURIComponent(json[name]));
    }
    return arr.join('&');
}
function ajax(url,data,fnSucc,fnFaild){
    if (window.XMLHttpRequest) {
        var oAjax=new XMLHttpRequest();
    } else{
        var oAjax=new ActiveXObject('Microsoft.XMLHTTP');
    }
}

oAjax.open('GET',url,+'?'+,json2url(data),true);

oAjax.send();

oAjax.onreadystatechange=function(){
    if (oAjax.readyState==4) {
        if (oAjax.status>=200&&oAjax.status<300||oAjax.status==304) {
            fnSucc&&fnSucc(oAjax.responseText);
        } else{
            fnFaild&&fnFaild(oAjax.status);
        }
    }
}

------------------------------------

POST
打开连接
oAjax.open('POST',url,true);
设置请求头
oAjax.setRequesHeader('Content-type','application/x-www-form-urlencoded');
发送
oAjax.send(data);

-------------------------------------
"use strict"
function json2url(){
    json.t=Math.random();
    var arr=[];
    for (var name in json) {
        arr.push(name+'='+encodeURIComponent(json[name]));
    }
    return arr.join('&');
}
function ajax(url,data,type,fnSucc,fnFaild){
    if (window.XMLHttpRequest) {
        var oAjax=new XMLHttpRequest();
    } else{
        var oAjax=new ActiveXObject('Microsoft.XMLHTTP');
    }
}
    
switch (type.toLowerCase()){
    case 'GET':
        oAjax.open('GET',url,+'?'+,json2url(data),true);
        oAjax.send();
        break;
    case 'POST':
        oAjax.open('POST',url,true);
        oAjax.setRequestHeader('Content-type','application/x-www-form-urlencoded');
        oAjax.send(json2url(data));
        break;
}

oAjax.onreadystatechange=function(){
    if (oAjax.readyState==4) {
        if (oAjax.status>=200&&oAjax.status<300||oAjax.status==304) {
            fnSucc&&fnSucc(oAjax.responseText);
        } else{
            fnFaild&&fnFaild(oAjax.status);
        }
    }
}


-------------------------------------
"use strict"
function json2url(){
    json.t=Math.random();
    var arr=[];
    for (var name in json) {
        arr.push(name+'='+encodeURIComponent(json[name]));
    }
    return arr.join('&');
}
function ajax(json){
    json=json||{};
    if(!json.url)return;
    json.type=json.type||'get';
    json.data=json.data||{};
    
    if (window.XMLHttpRequest) {
        var oAjax=new XMLHttpRequest();
    } else{
        var oAjax=new ActiveXObject('Microsoft.XMLHTTP');
    }
}
  
switch (json.type.toLowerCase()){
    case 'GET':
        oAjax.open('GET',json.url,+'?'+,json2url(json.data),true);
        oAjax.send();
        break;
    case 'POST':
        oAjax.open('POST',json.url,true);
        oAjax.setRequestHeader('Content-type','application/x-www-form-urlencoded');
        oAjax.send(json2url(json.data));
        break;
}

oAjax.onreadystatechange=function(){
    if (oAjax.readyState==4) {
        if (oAjax.status>=200&&oAjax.status<300||oAjax.status==304) {
            json.success&&json.success(oAjax.responseText);
        } else{
            json.error&&json.error(oAjax.status);
        }
    }
}



-------------------------------------
"use strict"
function json2url(){
    json.t=Math.random();
    var arr=[];
    for (var name in json) {
        arr.push(name+'='+encodeURIComponent(json[name]));
    }
    return arr.join('&');
}
function ajax(json){
    json=json||{};
    if(!json.url)return;
    json.type=json.type||'get';
    json.data=json.data||{};
    json.timeout=json.timeout||3000;
    var timer=null;
     
    if (window.XMLHttpRequest) {
        var oAjax=new XMLHttpRequest();
    } else{
        var oAjax=new ActiveXObject('Microsoft.XMLHTTP');
    }
}
  
switch (json.type.toLowerCase()){
    case 'GET':
        oAjax.open('GET',json.url,+'?'+,json2url(json.data),true);
        oAjax.send();
        break;
    case 'POST':
        oAjax.open('POST',json.url,true);
        oAjax.setRequestHeader('Content-type','application/x-www-form-urlencoded');
        oAjax.send(json2url(json.data));
        break;
}

oAjax.onreadystatechange=function(){
    if (oAjax.readyState==4) {
        if (oAjax.status>=200&&oAjax.status<300||oAjax.status==304) {
            clearTimeout(timer);
            json.success&&json.success(oAjax.responseText);
        } else{
            json.error&&json.error(oAjax.status);
        }
    }
}

timer=setTimeout(function(){
    oAjax.onreadystatechange=null;
    json.error&&json.error('网络超时');
},json.timeout);


-------------------------------------
确认框:
confirm('提示内容')

字符串替换
str.replace('被替换的内容','替换成谁')


-------------------------------------
ajax不能跨域,跨域的话,用jsonp

跨域很重要!

跨域的作用:
1.第三方验证
2.



需要进行跨域:
jsonp   json with padding

1.拿到接口
浏览器F12->Network->找到su?->右键倒数第二个选项->wd=&cb= (留着有用,其他的删除)

例:(百度下拉)
https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&json=1&p=3&sid=18439_18634_1466_18240_18534_12824_18545_17000_17073_15616_11755_10633&csor=1&cb=jQuery110209267756657209247_1451359362469&_=1451359362475

https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&cb=show

wd  word        想要搜索的关键词
cd  callback    回调函数


script标签是一次性的。

解除方法:
每次的时候,新建立一个script标签


当新建的script用完了在删除掉
-------------------------------------
例子:
大搜索(搜索引擎)

获取接口:
百度:
https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&cb=show

搜狗:
https://www.sogou.com/suggnew/ajajjson?key=y&type=web

好搜:
http://sug.so.360.cn/suggest?callback=show&word=a

好360:
http://sug.so.360.cn/suggest?word=b&callback=show


jsonp的步骤:
1.找到接口
2.放到地址栏里看一下能不能用
3.写功能
-------------------------------------
jsonp的回调函数,必须是全局的


'use strict'
function jsonp(json){
    //验证参数
    json = json ||{};
    if(!json.url)return;
    json.cbName = json.cbName||'cb';
    json.data = json.data||{};
    json.timeout = json.timeout||5000;
    var timer = null;
    
    //回调函数的名字随机。为了防止缓存
    json.data[json.cbName] = 'show'+Math.random();
    //因为变量名和函数名不能有.所以把.替换成空
    json.data[json.cbName] = json.data[json.cbName].replace('.','');
    var arr = [];
    for(var name in json.data){
        arr.push(name+'='+encodeURIComponent(json.data[name]));
    }
    var str = arr.join('&');
    //回调函数
    window[json.data[json.cbName]] = function(result){
        //取消网络超时提示
        clearTimeout(timer);
        //执行回调
        json.success&&json.success(result);
        //当回调执行时,js已经不需要了,删掉
        oH.removeChild(oS);
    };
    //网络超时定时器
    timer = setTimeout(function(){
        window[json.data[json.cbName]]=null;
        json.error&&json.error('网络超时');
    },json.timeout);
    
    //jsonp核心
    var oH = document.getElementsByTagName('head')[0];
    var oS = document.createElement('script');
    oS.src=json.url+'?'+str;
    oH.appendChild(oS);
}
-------------------------------------
电话查询归属地
接口:
http://virtual.paipai.com/extinfo/GetMobileProductInfo?mobile=15888888888&amount=10000&callname=show

-------------------------------------
语言特性:
1.垃圾回收
js是一门高级语言,本身有垃圾回收机制

一些传统语言并没有垃圾回收机制
比如:C

内存溢出:

内存泄露:


c语言:硬件厂商使用

垃圾回收机制如何工作?
生存周期
1.局部    很短  只有函数调用完成,局部变量就消失
2.全部    很长  只有浏览器关闭之后才会消失。
3.闭包    不确定 a).只要里面的函数还有用,父级的局部变量就不会消失
        b).只有里面的函数还有用,父级所有的局部变量就不会消失
        c).只要里面的函数还有用,整条作用域链上的变量都不会消失
1.局部
function show(){
    var a=12;
}

        //调用前   没有a
show();     //调用中   a出现
        //调用后   a干掉了


2.全局
function show(){
    var a=12;
}

        //调用前   有a
show();     //调用中   有a
        //调用后   有a


3.闭包
function show(){
    var a=12;
    document.onclick=function(){
        alert(a);
    }
}

document.onclick=null;



function show(){
    var a=12;
    var b=5;
    document.onclick=function(){
        alert(a);
    }
}

b应该消失,但是没有消失
1.为了性能
2.为了万无一失
var a=12;
function aaa(){
    var b=5;
    function bbb(){
        var c=3;
        document.onclick=function(){
            alert(a);
        }
    }
    bbb();
}
aaa();

作用域链:先在本层找,如果没有,找父级,如果父级没有,找父级的父级...直到找到全局




2.递归

递归:大事化小,分而治之。


养兔子:
1.兔子不会死。
2.兔子可以近亲结婚
3.兔子3个月长大,长大后每个月就生一对小兔子

1   2   3   4   5   6   7   8   9   10  

1   1   2   3   5   8   13  21  34  55

var arr=[];
function fn(n){
    if(n==1){
        return 1;
    }else if(n==2){
        return 1;
    }else {
        if(arr[n]){
            return arr[n];
        }else{
            arr[n]=fn(n-1)+fn(n-2);
            return arr[n];
        }
    }
}

fn(n)=fn(n-1)+fn(n-2);

递归性能特别好

兔子数列,兔子算法
斐波那契数列,斐波那契算法

(属于算法)
-------------------------------------

性能优化

对于一个好的程序来说:
1.稳定性
2.扩展性
3.优化

优化:
1.网络性能(对于前端来说,网络性能重要)
2.执行性能

***********************************
网络性能
如何查看:
1.浏览器   F12 Network     分析用了多长时间
2.YSlow(yahoo)  能看出问题在哪,并且告诉你如何解决,学习工具。

        yslow.org/mobile    用火狐打开

        怎么用?
        两种用法:
        1.插件版   必须安装firebug,只有老版本的火狐才能使用
        2.书签版   不能检测HTTPS协议的



网络优化:
1.减少HTTP请求:
    100个文件  100链接   100请求   100等待   100接收
    1个文件        1链接 1请求 1等待 1接收

合并JS文件,CSS文件,图片
为了减少HTTP请求,减轻服务器压力。提高性能


2.代码压缩

3.合并

4.gizp.服务器来做的压缩。

5.图片延迟加载,懒加载

6.JS阻塞加载
    
    加载JS的时候,其他东西都不加载

    工作怎么做:
    把script放到最下面
    css放上面

7.CDN   使内容传输的更快、更稳定、更安全
-------------------------------------
执行性能:
有用的
1.不使用全局变量
2.不用的东西就干掉
3.尽量使用正则
4.尽量使用变量,不要使用属性
5.
for(var i=0;i<arr.length;i++){

}

var len=arr.length;
for(var i=0;i<leng;i++){

}

6.减少dom操作
    不看的运动,就停下来。


7.尽量不改变css,而是用css3

没用的
var str='';
str+='abc';
str+='dcd';
set+='def';

var arr=[];
arr.push('abc');
arr.push('bcd');
arr.push('edf');

-------------------------------------
正则:

操作字符串和验证的

不是必须使用。用它只是为了更方便,性能更好

正则      1956
C语言     1972
JAVA        1995
javascript  1995

正则表达式   Reqular Expression
台湾的翻译:规则表达式

报答的就是一个规则
按照某种规则操作字符串

-------------------------------------
正则玩的就是规则:

var re=new RegExp('规则');
var re=new RegExp('规则','选项');

注:选项可以连着写

选项:
    i   Ignore  忽略
    忽略大小写

    g   global  全局
    全局匹配

    m   muti-line   多行模式
    单行模式    不加m
        ^   整个只有一个行首
        $   整个只有一个行尾
    多行模式    加m


str.search();   搜索
str.match();    匹配
replace();  替换
test();     校验
-------------------------------------
正则也有简写:
var re=new RegExp('规则','选项');

/规则/选项      (规则不加任何引号)

在正则中‘或’用 |表示
例:
/a|b/

转义:
\
\   \\
\n  换行
\t  tab 缩进
\d  代表了所有的数字
\w  所有数字,英文,下划线
\s  所有空白符号,空格、tab、换行


\D  除了数字
\W  除了数字,英文,下划线
\S  除了空白符号

.   点代表,所有的东西

^   行首
$   行尾

\b  boundary    边界
\\b 单词边界

正则的特性:
1.懒
2.笨
    量词  代表数量
    
    例:
    13个苹果
    苹果{13}

    若干  模糊
        +表示

    例:
    苹果+ 最少有一个最多不限
    模糊,若干
3.贪婪




-------------------------------------
替换的写法:
replace(str,str);
replace(str||re,str);
replace(str||re,str||fn);
-------------------------------------
[]
1.任选一个
/a[abc]c/
aac √
abc √
acc √
aabcc   ×


/a[d+]c/
adddddddddddddc √
adc     √
ac      ×

/a[(df)+]c/
adfdfdfdfc  √

2.范围
[a-z]   a到z的所有小写英文字母
[A-Z]   A到Z的所有大写英文字母
[0-9]   0到9的所有数字

[13-69] 1 3 4 5 6 9

[a-zA-Z0-9] 所有的英文字母和数字  


3.排除
[^0-9]  除了数字
[^a-z]  除了小写字母
[^A-Z]  除了大写字母
[^0-9a-zA-Z]    除了英文字母和数字


-------------------------------------
量词
{n} 有n个
{n,m}   最少有n个,最多有m个
{n,}    最少有n个,最多无限

{0,1}   有一个,或者没有
{0,}    有没有都行
{1,}    最少一个,最多不限

?   {0,1}   有一个,或者没有
+   {1,}    最少一个,最多不限   推荐
*   {0,}    有没有都行       不推荐

-------------------------------------
str.search(re);
set.mathch(re);


表单校验
test    校验

re.test(str);
校验成功返回true;
校验失败返回false;

校验座机号码:
010-1234567
010-12345678

0100-1234567
0100-12345678

正则分段去写:

    区号  -   号码

0[1-9]\d{1,2}   -   [1-9]\d{6,7}

拼起来写:

/0[1-9]\d{1,2}\-[1-9]\d{6,7}/

test不严谨

解决:
/^0[1-9]\d{1,2}\-[1-9]\d{6,7}$/


校验手机号码:
13810885613

1[^012469]\d{9}

/^1[^012469]\d{9}$/


校验邮箱
xxx@xxx.xxx.xx

    用户名 @   域名      域名后缀

字母数字下划线-        英文数字-   字母{2,8}


-------------------------------------
addClass
removeClass
getByClass

可以用正则去做

-------------------------------------
MVC model view controller
(后台)

model       模型
view        表现
controller  控制
----------------------------------
后台MVC

1.后台
2.前端
3.编辑

代码混编,不好
MVC:起到分离的作用

M____model  数据层(模型) 后台

V____view   视图层     前端

C____comtroller 控制层

把后台的代码和前端的代码,分开。
1.代码分工
2.降低耦合性

耦合性:
耦合性越低越好
---------------------------------
前端MVC
M____model      数据层(交互)

V____view       视图层(dom)

C____controller     控制层--中介

注:先写M\V层,最后写C层

--------------------------------
就是一种写代码的模式、方法。

例子:百度下拉

https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&cb=show


1.看起来清晰,易于维护
2.降低耦合性

--------------------------------
模板

例子:简易输入栏

--------------------------------
MVC不会自己写
1.不是每个人都会
2.每个人有每个人自己的写法


使用框架
AngularJS

库   jquery
    辅助你开发的
    你是主导位置

框架  angular
    限制你开发的
    框架是主导位置

-------------------------------------
面向对象

你不知道原理,但是不影响你使用

-------------------------------
面向对象产生的原因?
最开始太难了。把东西封装起来。


对象有两种人:
用对象

写对象
------------------------------
对象由什么东西组成的?
对象只有2个东西:属性和方法

关于属性和变量
属性和变量就是一个东西,只是叫法不同。
属性是属于某个对象的。
变量是自由的。

关于函数和方法
函数和方法就是一个东西,只是叫法不同。
方法是属于某个对象的。
函数是自由的。

this:方法等于谁,this就是谁

//构造函数--创建对象的
注:首字母必须大写

-------------------------------
//面向对象好比一个加工工厂,首先要有原料(建立对象),加工原料(对象都有什么功能),出厂(使用时得到的是什么)

function Person(name,age){
    //原料
    var obj=new Object();
    //加工
    obj.name=name;
    obj.value=value;
    obj.showName=function(){
        alert(this.name);
    }
    obj.showAge=function(){
        alert(this.age);
    }
    //出厂
    return obj;
}

--------------------------------
目前以Array为基础创建对象:
有问题。
1.容易冲突
2.效率低

空白的东西比较适合我们。
new Object();
几乎是空的。

问题:
1.为啥没有new?
2.每次创建一个对象都有一个新的方法


-------------------------------------
关于new的问题

new的作用:
1.只有加了new,系统会自动在构造函数顶部帮你 new Object 
2.只要加了new,系统会自动在构造函数尾部帮你 return


function Preson(name,age){
    //只有加了new,系统会自动帮你
    // this=new Object;
    this.name=name;
    this.age=age;
    this.showName=function(){
        alert(this.name);
    }
    this.showAge=function(){
        alert(this.age);
    }
    //只有加了new,系统会自动帮你
    // return this;
}
var oP=new Preson('张三','16');
oP.showName();
--------------------------------------
原型
obj.prototype

以后写面向对象,属性是给对象加的
eg:this.name=name;
方法给原型加
eg:Person.prototype.show=function(){

}

function Person(name,age){
    this.name=name;
    this.age=age;
}
Person.prototype.showName=function(){
     alert(this.name);
}
Person.prototype.showAge=function(){
    alert(this.age);
}
            
var oP=new Person('张三',16);
oP.showName();
oP.showAge();


-------------------------------------
类:
Person
Array
Date
Object
对象:
oDate=new Date();
arr=new Array();
oP=new Person();

****
所有的变量都要变成属性
所有的函数都要变成方法

-------------------------------------
this是js里面最恶心的东西。

css有优先级


this也有优先级
this具体是什么,你不知道,只能看调用
高
    new     object
    定时器     window
    事件      触发事件的元素
    方法      属于的那个对象
    正常调用    window||undefined
低


1.this要看优先级
2.永远要听最后的调用
3.定时器只管一层




-------------------------------------
原型
作用:
1.加方法
2.扩展系统方法
    arr.indexOf
    str.trim
    oDate.getCnDay()

-------------------------------------
typeof  检测数据类型

问题:不能检测对象。没有某一个的具体类型

instanceof  检测属于什么东西

constructor 构造器
检测这个对象的构造函数是什么


json    就是object

-------------------------------------
js中诡异的事
function    instanceof  object      true
object      instanceof  function    true
function    instanceof  function    true
object      instanceof  object      true

原型链:
找一个东西,先在自身找,如果自身没有,找父级,如果父级的父级没有,找父级的父级的父级,直到找到object

面向对象的特性:

1.封装:抽,把程序的核心封装起来,以后重复调用
2.**继承:父级有的子级也有,父级改变子级也改变
3.多态:多重继承

继承:
父级有的子级也有,父级改变子级也改变

大项目能体现出父级的好处
比如:游戏

改变this指向
show.call(想把this变成谁,item,item2,item3...);


apply(想把this变成谁,[item.item2,item3...]);


继承分两个:
1.属性:

function 父类(name,age){
    this.name=name;
    this.age=age;
}
function 子类(name,age,job){
    (1).父类.call(this,name,age...);
    (2).父类.apply(this,arugment);
}

2.方法:

    子类.prototype=new 父类();
    子类.prototype.constructor=子类
    子类.prototype.show=fn;

~~~~~~~~~~~~~~~~~~~~~~~~~
例:
function Preson(name,age){
    this.name=name;
    this.age=age;
}
Preson.prototype.showName=function(){
    return this.name;
}
Preson.prototype.showAge=function(){
    return this.age;
}
function Worder(name,age,job){
    Preson.apply(this,arguments);
}
Worder.prototype=new Preson();
Worker.prototype.constructor=Worder;
Worder.prototype.showjob=function(){
    return this.job;
}

-------------------------------------
面向对象:

混合模式:构造+原型

单利模式(命名空间):json
-------------------------------------
变量名冲突:
1.封闭空间
2.面向对象
3.命名空间
    YUI yahoo
4.模块化

-------------------------------------
右下角悬浮窗判读是不是ie6
    window.onload = window.onresize = window.onscroll = function(){
        //判断是不是IE6
        if(window.navigator.userAgent.indexOf('MSIE 6.0')!=-1){
            var oDiv = document.getElementById('div1');
            //滚动距离
            var sH =document.documentElement.scrollTop||document.body.scrollTop;
            //可视区的距离
            var cH = document.documentElement.clientHeight;
            //物体盒模型的高
            var oH = oDiv.offsetHeight;
            oDiv.style.top = sH+cH - oH +'px';
        }
    };

----------------------------------------------------------
吸顶条的效果
    function getPos(obj){
        var left = 0;
        var top = 0;
        while(obj){
            left+=obj.offsetLeft;
            top+=obj.offsetTop;
            obj = obj.offsetParent;
        }
        
        return {
            "left":left,
            "top":top
        };
    }
    window.onload = function(){
        var oDiv1 = document.getElementById('div1');
        var oDiv2 = document.getElementById('div2');
        var oT = getPos(oDiv1).top;//div所在的位置到top的高度
        window.onscroll = function(){
            var sT = document.documentElement.scrollTop||document.body.scrollTop;//获取滚动的距离的兼容性写法
            
            if(sT>=oT){
                oDiv1.style.position = 'fixed';
                oDiv2.style.display = 'block';
            }else{
                oDiv1.style.position ='';
                oDiv2.style.display = 'none';
                
            }   
        };
        
    };

-----------------------------------------------------------
瀑布流下拉无限加载
    function createLi(){
        var oLi = document.createElement('li');
        //oli的高度是50px-300px之间
        oLi.style.height = parseInt(50+Math.random()*300)+'px';
        //oli的背景颜色随机变化
        oLi.style.background = 'rgb('+parseInt(Math.random()*256)+','+parseInt(Math.random()*256)+','+parseInt(Math.random()*256)+')';
        return oLi;
    }
    window.onload = function(){
        var oBox = document.getElementById('box');
        //获取obox下面的子集
        var aUl = oBox.children;
        //createLis创造的一群li
        function createLis(){
        var arr = [];
        for(var i = 0;i<20;i++){
            
            var oLi = createLi();//创建 oLi的函数
            for(var j = 0;j<aUl.length;j++){
                arr.push(aUl[j]);
                //push增加
            }
            //循环判断 3个ul中最矮的 那个 offsetHeigth
            arr.sort(function(ul1,ul2){
                //sort是排序
                return ul1.offsetHeight - ul2.offsetHeight; 
            });
            arr[0].appendChild(oLi);
            //往最后一个节点添加
        }
    }
        //加载了20个Li
        createLis();
        
        window.onscroll = function(){
            var sH = document.body.scrollHeight;//文档的内容高
            var cH = document.documentElement.clientHeight; // 可视区的高
            var scrollTop = document.documentElement.scrollTop||document.body.scrollTop;// 滚动距离
            if(scrollTop == sH -cH){//文档的内容高 - 可视区的高 == 滚动距离
                createLis();
            }
        };
    };

-----------------------------------------------------------

js所有的例子

1.鼠标滚轮

2.瀑布流

3.图片懒加载

4.吸顶条

5.星星评分

6.选项卡

7.自动播放选项卡

8.无缝滚动完整版

9.图片时钟

10.简易日历

11.双色球

12.联动全选

13.球

14.许愿墙

15.wabqq

16.高级留言板

17.简易秒表

18.右下角悬浮框

19.拖拽

20.带框拖拽

21.磁性拖拽

22.限制范围拖拽

23.无缝滚动(无缝连接)

24.设置时间

25.ajxa

26.json

27.jsonp

28.move

29.cooker

30.图片放大

31.放大镜

32.鼠标加滚轮

33.图片加载进度条

34.正则

35.鼠标离谁进谁放大

36.碰撞检测

37.圆

38.极丑视差滚动

39.360度旋转

40.回到顶部

41.九宫格拖拽

42.拖拽回放

43.MVC

44.jquery

45.面向对象

46.倒计时

47.手风琴

48.无规则切换图片

49.手机图片切换拖拽

50.3D图片切换

51.下拉菜单

52.各种运动

53.焦点图

54.分页

55.鼠标控制DIV移动

56.上移下移

57.右键菜单

58.qq头像

59.延迟广告

60.全选不选反选

61.百度贴吧时钟

62.分布运动

63.穿墙

64.苹果菜单

65.doMove

66.qq视频

67.滚动控制百分比

68.轮播图

69.百度下拉

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容