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;

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

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

判断是否没碰到
r1r2||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 模块
});





给路径起别名
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('jquery')  在div内部的最后面追加一个strong

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


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

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


$('div').after('')     把strong添加到div后面
$('div').bofore('')        把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=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=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

你可能感兴趣的:(js学习内容总结(2))