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     系統默認的提交方式
        明文提交,不安全,容量?。?2KB左右),有緩存
    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.百度下拉

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容