js高級程序設(shè)計(jì)個(gè)人筆記

http://www.cnblogs.com/LS-tuotuo/p/5898708.html
講述了特詳細(xì)的基礎(chǔ)知識(shí),數(shù)據(jù)類型和函數(shù)等。

二,在HTML中使用javascript###

1,Defer=“dafer”可以立即下載加載延緩執(zhí)行
2,Async 異步記載,可以讓腳本不必等待其他腳本再執(zhí)行,不兼容ie
3,< noscript>當(dāng)腳本無效的時(shí)候,才會(huì)顯示這段話</noscript>

第三章:基本概念

【數(shù)據(jù)類型】####

  • 基本類型
  • 引用類型
    一,5種基本類型
    String Number Undefined Boolean Null
    基本類型都是按值訪問的,就是說你可以操縱變量實(shí)際的值。
    特點(diǎn):
    1,值不可變,
    2,基本類型沒有屬性和方法,
    3,基本類型比較==如類型不同會(huì)自動(dòng)轉(zhuǎn)化相同類型比較,===不會(huì)轉(zhuǎn)化類型,兩個(gè)類型相同==和===就沒什么區(qū)別了。
    4,typeof.xx 來檢查基本數(shù)據(jù)類型
1,值不可變
var a="hanna",
a.toUpperCase()//HANNA
alert(a)//依然是hanna

** 二,引用類型**
1,Object 2,Array 3,data類型 4,RegExp類型 5,function類型
特點(diǎn):
1,包含引用類型值的變量實(shí)際上包含的不是對象本身,而是指向?qū)ο蟮闹羔槨?br> 2,復(fù)制引用類型的值,也是賦值其引用的指針,因此兩個(gè)變量執(zhí)行同一個(gè)地址。
3,Array.isArray(arr)//來檢查是不是引用類型,返回true/false。istanceOf有作用域的問題。

Object類型
js中沒有類的概念,因此引用類型也被稱為對象定義。因?yàn)槭且环N將數(shù)據(jù)和功能組織在一起的數(shù)據(jù)結(jié)構(gòu),也就是說是描述一類對象的屬性和方法。

1》,new 創(chuàng)建
var person = new Object();
person.name = "Nicholas";
person.age = 21;

2》對象字面量表示法
var person = {
name:"Nicholas",
age:21,
5:true //數(shù)值屬性名會(huì)自動(dòng)轉(zhuǎn)化為字符串
};
在通過對象字面量定義對象時(shí),實(shí)際上不會(huì)調(diào)用Object構(gòu)造函數(shù)。

訪問對象屬性的方法:

1》點(diǎn)表示法2》方括號表示法
2》方括號表示法
alert(person.name); //"Nicholas"
alert(person["name"]); //"Nicholas"

Array類型
array就是數(shù)組類型,可以保存任何類型的數(shù)據(jù)

1》使用Array構(gòu)造函數(shù)
var colors = new Array();
var colors = new Array(20);
var colors = new Array("red","blue","green");
var colors = Array(3);
var colors = Array("Greg");
2》使用數(shù)組字面量
var colors = ["red","blue","green"];
var colors = [];
var colors = [1,2,];//不推薦使用,會(huì)創(chuàng)建一個(gè)包含2或3項(xiàng)的數(shù)組
var colors = [,,,,,];//不推薦使用,會(huì)創(chuàng)建一個(gè)包含5或6項(xiàng)的數(shù)組
與對象一樣,使用數(shù)組字面量表示法時(shí),也不會(huì)調(diào)用Array構(gòu)造函數(shù)。

1,對象,2,數(shù)組,3,函數(shù)
//多個(gè)值構(gòu)成的對象,保存在內(nèi)存中,不能直接操作,需要操作其值的引用對象 ```
3,基本包裝類型3種
Boolean Number String
//基本包裝類型可以當(dāng)做對象來訪問,操作基本類型值一經(jīng)完畢會(huì)立即銷毀,

Null==Undefined //true
Number("xxxxx")//可用于任何類型的轉(zhuǎn)化為數(shù)值
Number("")//0
parseInt("xxxx")//字符串轉(zhuǎn)化為整數(shù)數(shù)值
parseInt("")//NaN
parseFloat("xxxx")//字符串轉(zhuǎn)化為浮點(diǎn)數(shù)數(shù)值
parseFloat("")//NaN ```


**
1,parselnt("22.5") // 22
2,parseFloat(“22.5”) //22.5
3, var age =11;
 var a= age.toString(); //字符串“11”
 null和undefined沒有toString方法
4,var nu=null;var nu;
 var a= String(nu)// 輸出“null”和“undefined”
 String() 任何值都是轉(zhuǎn)化。
5,--a 和a--的區(qū)別//a--第一次運(yùn)算不減,第二次再減去
  var a=10;
  var b= --a-1 ;    //8
  var a;       //9
   var c=a-- +1; //11
   var d=a+1;  //10
6,var a= i %2     //求?;蚯笥? 能被2整除的都是偶數(shù),2除以 i
7,== 和===      //==如果不是同類型,會(huì)自動(dòng)轉(zhuǎn)化后比較。
          //===不會(huì)轉(zhuǎn)化,會(huì)直接比較,如何比較的是對象,
          會(huì)比較對象的指引是不是同一個(gè)
8,+=        //加賦值 。 -= //減賦值,*=,/=,%=,<<=, >>=
9,do-while      //至少執(zhí)行一次,符合條件再執(zhí)行
10,for -in     //可以用來枚舉對象的屬性。
         //使用for-in之前,請先檢測對象是不是null或者undefined
11, label語句 start: for (var i=0; i < count; i++) {}//以后可以由break或者continue語句引用
12,brack和continue的區(qū)別,break立即退出循環(huán)不再繼續(xù)執(zhí)行,continue退出單層循環(huán),會(huì)繼續(xù)執(zhí)行下面的。
13,switch case 中的default 的意思是,都不滿足case中的選項(xiàng)就會(huì)執(zhí)行
**


四,變量,作用域和內(nèi)存(86-100)

1,typeOf x //是檢查對象是那種基本類型
2,instanceOf //是檢查對象是那種引用類型,如果用來檢查基本類型會(huì)始終返回 false
3,局部環(huán)境中代碼執(zhí)行完畢,函數(shù),變量都會(huì)自動(dòng)銷毀,全局環(huán)境直到程序關(guān)閉,比如關(guān)閉網(wǎng)頁或者瀏覽器時(shí)會(huì)全部銷毀。
4, 特殊情況下,也可以延長作用域鏈,try-catch和with
5,if 和for里面的聲明的變量會(huì)在循環(huán)條件結(jié)束后,依然存在,且在全局環(huán)境中可以訪問得到!切記

五,引用類型(101-155)

1,Object類型
創(chuàng)建引用類型有2種方法
1.1;var person =new Object(),person.name = "Nicholas";person.age = 29;//這是第一種
1.2;var a={name:“哈南”,age:18};//后者是對象字面量語法,屬性名稱自動(dòng)轉(zhuǎn)化為字符串,如果var a={}== new Object //
2,array類型 ,其實(shí)就是數(shù)組類型
創(chuàng)建array類型有2中方法
1.1;var color=new Array(20); //創(chuàng)建一個(gè)包含20項(xiàng)的數(shù)組,array類型其實(shí)就是數(shù)組
var color=new Array{"red","blue","green"}。//創(chuàng)建一個(gè)...的數(shù)組,數(shù)組的length只有3項(xiàng)
1.2;var color=["red","blue"] //創(chuàng)建一個(gè)...的數(shù)組,數(shù)組的length只有2項(xiàng)目
切記如果使用color[0], //讀取和使用數(shù)組的值時(shí),要使用方括號且是基于0索引的下標(biāo)。
3,檢查某個(gè)對象是不是數(shù)組,用instanceOf 有作用域的問題,現(xiàn)在可以使用Array.isArray(color)//檢查color是不是數(shù)組。返回true或者flase。
4,colors.join(",")//join()//數(shù)組按照“,”作為分隔符進(jìn)行返回
5,colors.push("yelloy")//在數(shù)組的末端添加一項(xiàng)
6,colors.pop()//取出或者刪除數(shù)組最后一項(xiàng)值是多少
7,colors.unshift("0","00" );//在數(shù)組的前端添加2項(xiàng)
8,colors.shift();//取出或者刪除數(shù)組的一項(xiàng)
9,data.reverse()//可以對數(shù)進(jìn)行反轉(zhuǎn)數(shù)組原來的順序
10,short() //單獨(dú)的short()其實(shí)是對字符串進(jìn)行排序,需是對數(shù)組進(jìn)行排序需要
function sortNumber(a, b)
{
return b - a//如果是a-b就是從大到小 調(diào)用的時(shí)候就用arr.short("sortNumber")
}
11,concat()// colors.concat("apple")//在colors數(shù)組后面追加一組數(shù)組,返回合在一起的數(shù)組// var newJson = json.concat();數(shù)組json的克隆clone
12,slice() colors.slice(1,4) //返回?cái)?shù)組下標(biāo)1到4的數(shù)組
13,splice()// colors.splice(0,2)//刪除數(shù)組中的前兩項(xiàng),
splice(1, 0, "yellow", "orange");// 從位置1 開始插入兩項(xiàng),0代表不刪除
var newJson = json.splice(0);數(shù)組json的克隆 clone
removed = colors.splice(1, 1, "red", "purple"); // 先刪除位置下標(biāo)1的項(xiàng),再在1位置上插入2項(xiàng)
14,indexOf(),lastIndexOf()//會(huì)返回查詢數(shù)組,位置的下標(biāo)
15, 數(shù)組的迭代方法
every() ,filter() ,for Each() ,map(), some(),
every()//遍歷數(shù)組中的每一項(xiàng)都返回true,就返回true
some()//遍歷數(shù)組中的任何一項(xiàng)返回true,就返回true
forEach()//遍歷數(shù)組,給數(shù)組中的每一項(xiàng)運(yùn)行函數(shù),沒有返回值
map()//遍歷數(shù)組,對數(shù)組中的每一項(xiàng)運(yùn)行函數(shù),返回函數(shù)調(diào)用結(jié)果組成的新數(shù)組。
filter()//遍歷數(shù)組,對數(shù)組中每一項(xiàng)運(yùn)行函數(shù),返回為函數(shù)為true的項(xiàng)組成的新數(shù)組
16,歸并方法
reduce()//從數(shù)組第一項(xiàng)開始,逐個(gè)遍歷
reduceRigth()//從數(shù)組最后一項(xiàng)開始,逐個(gè)遍歷
var values = [1,2,3,4,5];
var sum = values.reduce(function(prev, cur, index, array){//第一個(gè)參數(shù)前一個(gè)
return prev + cur;
});
alert(sum); //15這個(gè)案例是個(gè)求和案例
17,日期,var d=new Date();d.getFullYear()年 ,d.getMonth()+1月 (這個(gè)要加1是因?yàn)椋ヾ.getDate();當(dāng)前日期
d.getHours()//時(shí),d.getMinutes()//分,d.getSeconds()//秒,d.getMilliseconds()//毫秒
18,RegExp實(shí)例屬性 ?????(找個(gè)機(jī)會(huì) 好好看看)
19,每個(gè)函數(shù)都包含2個(gè)屬性:length 和prototype
函數(shù)名.length// 此函數(shù)接受參數(shù)的個(gè)數(shù)
20,JQ中bind()的用法

$(document).ready(function(){
  $("button").bind({
    click:function(){$("p").slideToggle();},
    mouseover:function(){$("body").css("background-color","red");},  
    mouseout:function(){$("body").css("background-color","#FFFFFF");}  
  });
});

21,num.toFixed(2)//數(shù)字保留2位小數(shù),超過2位則四舍五入
22,使用new操作符創(chuàng)建的引用類型的實(shí)例,在執(zhí)行流離開當(dāng)前作用域之前都一直保存在內(nèi)存中。而自動(dòng)創(chuàng)建的基本包裝類型的對象,則只存在于一行代碼的執(zhí)行瞬間,然后立即被銷毀。
23,stringValue.charAt(1)//返回下標(biāo)為1的字符串。
24,stringValue.concat(“world”)//hello world,concat連接字符串的
25,slice()和substring()和substr()的區(qū)別

 var stringValue = "hello world";
alert(stringValue.slice(3)); //"lo world"
alert(stringValue.substring(3)); //"lo world"
alert(stringValue.substr(3)); //"lo world"
alert(stringValue.slice(3, 7)); //"lo w"
alert(stringValue.substring(3,7)); //"lo w"
alert(stringValue.substr(3, 7));  ```
26,indexof(“o”),lastIndexof(“o”)//返回第一個(gè)/最后一個(gè)字符串所在的下標(biāo)位置
27,stringValue.trim()//返回清除前后空格的字符串
trimRight(),trimLeft()//返回清除左/右空格的字符串
28,字符串大小寫轉(zhuǎn)化的,最經(jīng)典的兩個(gè)方法如下,還有特定區(qū)域,如土耳其語需要另外兩種轉(zhuǎn)化方法。toLocaleLowerCase()和toLocaleUpperCase()

alert(stringValue.toUpperCase()); //"HELLO WORLD"
alert(stringValue.toLowerCase()); //"hello world"

29,在全局作用域中的this指的是 Global對象,如果是在瀏覽器中就是windows對象。
30,URI好URL的區(qū)別//uri是資源標(biāo)識(shí)符 ,而URL是資源定位符,后者包含前者,是前者的具體,URI是指定標(biāo)識(shí)web字符串各個(gè)不同的部分,有效的Uri不能包含某些字符,比如空格。
31,用來檢驗(yàn)URL或者Url是否包含其他字符,可以使用encodeURI()、encodeURIComponent()、decodeURI()和decode-URIComponent()進(jìn)行編碼和解碼行為,來保證這是有效的URI和URL!
32,Math對象的計(jì)算功能

Math.min(1,3,6,8,9)//直接比較最小值
Math.max(1,3,6,8,9)//直接比較最小值


var values = [1, 2, 3, 4, 5, 6, 7, 8];
var max = Math.max.apply(Math, values);//傳入?yún)?shù)進(jìn)行比較

33,四舍五入

Math.ceil(25.1)//26 向上舍入
Math.floor(25.9)//25 向下舍入
Math.round(25.9)//26 標(biāo)準(zhǔn)四舍五入

34,隨機(jī)數(shù)random

parseInt(10Math.random()) //輸出0~10之間的隨機(jī)整數(shù)
Math.floor(Math.random()
10+1)//輸出0~10之間的隨機(jī)整數(shù)

值 = Math.floor(Math.random() * 數(shù)值的總數(shù) + 第一個(gè)值)//

function selectFrom(lowerValue, upperValue) {//參數(shù)的最大值和最小值
var choices = upperValue - lowerValue + 1;//總數(shù)等于,最大值-最小值+1,第一個(gè)值就是最小數(shù)
return Math.floor(Math.random() * choices + lowerValue);
}
var num = selectFrom(2, 10);
alert(num); // 介于 2 和10 之間(包括 2 和 10)的一個(gè)數(shù)值


//也可以用于數(shù)組間的隨機(jī)
var colors = ["red", "green", "blue", "yellow", "black", "purple", "brown"];
var color = colors[selectFrom(0, colors.length-1)];//隨機(jī)數(shù)組的下標(biāo)
aler t(color); // 可能是數(shù)組中包含的任何一個(gè)字符串


####六,面向?qū)ο蟮某绦蛟O(shè)計(jì)(156-192)
**1,java和js面向?qū)ο罄斫?*
java是類式面向?qū)ο笳Z言,對象的狀態(tài)(state)由對象的實(shí)例(instance)所持有,對象的行為和方法(method)則有聲明該對象的類所持有,并且只有對象的結(jié)構(gòu)和方法能夠被繼承
js是原型式面向?qū)ο笳Z言,對象的行為和屬性,狀態(tài)都屬于對象本身,并且都能一起別繼承
**2,創(chuàng)建對象2種方式**

創(chuàng)建一個(gè)對象最簡單的方式就是創(chuàng)建一個(gè)Object的實(shí)例,然后為他添加方法和屬性如下:
var person = new Object();
person.name = "Nicholas";
person.age = 29;
person.job = "Software Engineer";
person.sayName = function(){
alert(this.name);
};
---------------第二種---------對象字面量是創(chuàng)建對象的首選模式,如下:
var person={
name: "Nicholas",
age: 29,
job: "Software Engineer",
sayName: function(){
alert(this.name);
}
}

**數(shù)據(jù)的4種屬性**
1,表示能通過delete刪除屬性從而重新定義屬性,就是能否修改屬性的特性
2,能否通過for-in 循環(huán)返回屬性
3,能否修改屬性的值
4,包含這個(gè)屬性的數(shù)據(jù)值,就是讀取屬性的時(shí)候,從這個(gè)位置讀。寫入屬性的時(shí)候,把新值保存到這個(gè)位置。

**3,工廠模式,封裝以特定接口創(chuàng)建對象的細(xì)節(jié)**

function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = createPerson("Nicholas", 29, "Software Engineer");
var person2 = createPerson("Greg", 27, "Doctor");

**4,構(gòu)造函數(shù)模式**

**構(gòu)造函數(shù)模式略勝于工廠模式**
創(chuàng)建自定義構(gòu)造函數(shù)意味著可以將它的實(shí)例標(biāo)識(shí)為一種特定的類型,這正是構(gòu)造函數(shù)略勝于工廠模式的地方。


**調(diào)用構(gòu)造函數(shù)會(huì)經(jīng)歷4中步驟**
1,創(chuàng)建一個(gè)新對象
2,將構(gòu)造函數(shù)的作用域賦給新對象(this就指向了這個(gè)新對象)
3,執(zhí)行構(gòu)造函數(shù)中的代碼(為這個(gè)新對象添加屬性和方法)
4,返回新對象

//按照慣例,構(gòu)造函數(shù)始終都是以一個(gè)大寫字母開頭,非構(gòu)造函數(shù)都是以一個(gè)小寫字母開頭。
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");

4.1 什么是構(gòu)造函數(shù)
 > 構(gòu)造函數(shù)和其他函數(shù)的區(qū)別,在于調(diào)用他們的方式不同
任何函數(shù),只要是new操作符來調(diào)用,就可以稱之為構(gòu)造函數(shù)
反之任何函數(shù),如果不是new操作符來調(diào)用,那么就是普通函數(shù)

// 當(dāng)作構(gòu)造函數(shù)使用
var person = new Person("Nicholas", 29, "Software Engineer");
person.sayName(); //"Nicholas"
// 作為普通函數(shù)調(diào)用
Person("Greg", 27, "Doctor"); // 會(huì)添加到window對象上來
window.sayName(); //"Greg"
// 在另一個(gè)對象的作用域中調(diào)用
var o = new Object();
Person.call(o, "Kristen", 25, "Nurse");//在o作用域中調(diào)用,就擁有了Person的對象和實(shí)例
o.sayName(); //"Kristen"

**5,原型模式prototype**
原型模式的構(gòu)造函數(shù)好處是:讓所有對象的實(shí)例共享它的方法和屬性。
換句話說:不必在構(gòu)造函數(shù)中定義對象的實(shí)例信息,而是將這些實(shí)例信息添加到原型對象上去。 
> ``` function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
person1.name="lilei"
person1.sayName(); //"lilei"  因?yàn)闀?huì)先去實(shí)例搜索,實(shí)例搜索不到才會(huì)去原型,如果實(shí)例有就算是null也只是返回實(shí)例屬性??梢允褂胐elete刪除屬性。hasOwnProperty可以查出來自實(shí)例還是來自原型
alert(person1.hasOwnProperty("name")); //ture實(shí)例屬性返回true
**------------------------- 
delete person1.name;
person1.sayName(); //"Nicholas" 
alert(person1.hasOwnProperty("name")); //false原型屬性返回false
**---------------- 
var person2 = new Person();
person2.sayName(); //"Nicholas"
alert(person1.sayName == person2.sayName); //true
alert(person1.hasOwnProperty("name")); //false原型屬性返回false

還可以寫成這種格式的原型函數(shù)

}
Person.prototype = {
//使用對象字面量重寫原型,如果已經(jīng)已經(jīng)創(chuàng)建了實(shí)例它會(huì)切換和現(xiàn)有實(shí)例和新原型之間的聯(lián)系,所以需要后new
constructor: Person,
name : "Nicholas",
age : 29,
job : "Software Engineer",
sayName : function () {
alert(this.name);
}
};
var friend = new Person();//這里切記要后new,先new出報(bào)錯(cuò)。
//如果是 Person.prototype.sayHi = function(){ alert("hi");};這種格式,先new后new都無所謂了
friend.sayName(); //Nicholas


也可以給原生對象添加屬性和方法但是一般不建議這么做,因?yàn)槿绻院笥幸环揭{(diào)用,可能會(huì)出現(xiàn)沖突。
> ```String.prototype.startsWith = function (text) {
return this.indexOf(text) == 0;
};
var msg = "Hello world!";
alert(msg.startsWith("Hello")); //true 給原生對象String添加方法,msg為String類型調(diào)用的時(shí)候可以用,但是下個(gè)String 可能就。。。有命名沖突的問題

6,原型對象的問題
1,它省略了構(gòu)造函數(shù)參數(shù)初始化的問題,所有的實(shí)例在默認(rèn)的情況下都是相同的值,這不是最大的問題
2,有共享的本性所導(dǎo)致的。如果有2個(gè)實(shí)例,操作其中一個(gè)實(shí)例A的給其屬性數(shù)組添加一個(gè)數(shù)據(jù)"Lili",由于是共享的,所以另一個(gè)實(shí)例B中也會(huì)存在“Lili”。如下:

/ / 這里有一個(gè)很神奇的地方,如果是firends是定義在構(gòu)造函數(shù)內(nèi)的一個(gè)數(shù)組,
/ / 輸入的結(jié)果person1和person2的.friends的值就是不相同的
function Person(){
//this.firends= ["Shelby", "Court"];//在這里創(chuàng)建屬性,new出來的實(shí)例,后有push上的就不會(huì)重復(fù)。
}
Person.prototype = {
constructor: Person,
name : "Nicholas",
age : 29,
job : "Software Engineer",
friends : ["Shelby", "Court"],
sayName : function () {
alert(this.name);
}
};
var person1 = new Person();
var person2 = new Person();
person1.friends.push("Van");
alert(person1.friends); //"Shelby,Court,Van"
alert(person2.friends); //"Shelby,Court,Van"
alert(person1.friends === person2.friends); //true

因此創(chuàng)建自定義類型最常見的方式就是:組合使用構(gòu)造函數(shù)模式和原型模式
**構(gòu)造函數(shù)模式用于定義實(shí)例屬性,而原型模式用于定義方法和共享屬性**
這樣每個(gè)函數(shù)都有自己的一套實(shí)例副本但同時(shí)又共享著對方法的引用。

**7,構(gòu)造函數(shù)和原型混合模式**(重要)

>``` 
//也就是說,構(gòu)造函數(shù)有自己的私有方法,而原型模式用來定義共享的的屬相和方法
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["Shelby", "Court"];
}//在這里實(shí)例的屬性都是在構(gòu)造方法中定義的,而由所有實(shí)例共享的屬性和方法則是在原型中定義的。
Person.prototype = {
constructor : Person,
sayName : function(){
alert(this.name);
}
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
person1.friends.push("Van");
alert(person1.friends); //"Shelby,Count,Van"
alert(person2.friends); //"Shelby,Count"
alert(person1.friends === person2.friends); //false
alert(person1.sayName === person2.sayName); //true

因此這種構(gòu)造函數(shù)和原型混合模式是最廣泛認(rèn)識(shí)度最高的一種創(chuàng)建自定義類型的方法,可以說未來默認(rèn)的一種方式

8,動(dòng)態(tài)原型模式

//構(gòu)造方法的屬性
//切記在已經(jīng)創(chuàng)建了實(shí)例的情況下,不可以使用對象字面量形式,會(huì)切斷和新原型之間的聯(lián)系。
this.name = name;
this.age = age;
this.job = job;
//動(dòng)態(tài)添加的方法
//此方法只有在sayName不存在的情況下,才會(huì)添加
if (typeof this.sayName != "function"){
Person.prototype.sayName = function(){//注意在這里對原型的修改,會(huì)共享在所有實(shí)例里面,因?yàn)槭窃谠椭卸x的。
alert(this.name);
};
}
}


**9,寄生構(gòu)造函數(shù)模式**
巴拉巴拉 ,不建議使用。
**10,穩(wěn)妥構(gòu)造函數(shù)模式**
穩(wěn)妥對象指的是沒有公共屬性,而且其方法也不引用this對象
>```function Person(name, age, job){
//創(chuàng)建要返回的對象
var o = new Object();
//可以在這里定義私有變量和函數(shù)
//添加方法
o.sayName = function(){
alert(name);
};
//返回對象
return o;
}
**----------
var friend = Person("Nicholas", 29, "Software Engineer");
friend.sayName(); //"Nicholas"
**---------------------
變量friend 中保存的是一個(gè)穩(wěn)妥對象,而除了調(diào)用sayName()方法外,沒有別的方式可
以訪問其數(shù)據(jù)成員。即使有其他代碼會(huì)給這個(gè)對象添加方法或數(shù)據(jù)成員,但也不可能有別的辦法訪問傳
入到構(gòu)造函數(shù)中的原始數(shù)據(jù)。穩(wěn)妥構(gòu)造函數(shù)模式提供的這種安全性,使得它非常適合在某些安全執(zhí)行環(huán)
境——

11,原型鏈繼承
當(dāng)以讀取模式訪問一個(gè)屬性時(shí),首先會(huì)搜索實(shí)例中該屬性,如果沒有找到,就會(huì)繼續(xù)搜索實(shí)例的原型的該屬性,再?zèng)]有,就搜索該實(shí)例有無繼承的。進(jìn)行到原型末端才會(huì)停下來。
1,同樣是原型鏈添加方法,重寫同名方法,后者會(huì)替換前者。
2,通過原型鏈實(shí)現(xiàn)繼承時(shí),不能使用對象字面量創(chuàng)建原型方法,因?yàn)檫@樣會(huì)重寫原型鏈,會(huì)切斷實(shí)例和原型之間的聯(lián)系。設(shè)想現(xiàn)原型包含的是一個(gè)某Object的實(shí)例,如果使用對象字面量會(huì)直接把指針重定向了。

寄生組合式繼承

開發(fā)人員普遍認(rèn)為寄生組合式繼承是引用類型最理想的繼承范式!
所謂寄生組合式繼承,即通過借用構(gòu)造函數(shù)來繼承屬性,通過原型鏈的混成形式來繼承方法

這個(gè)函數(shù)接受2個(gè)參數(shù)子類型構(gòu)造參數(shù)和超類型構(gòu)造參數(shù)。
在函數(shù)的內(nèi)部,第一步是創(chuàng)建超類型原型的一個(gè)副本,
第二步是為創(chuàng)建副本添加constructor屬性,從而彌補(bǔ)因重寫原型而失去的默認(rèn)的constructor屬性,
最后一步,將新創(chuàng)建的對象(即副本)賦值給子類型的原型。
function inheritPrototype(subType, superType){
var prototype = object(superType.prototype); //創(chuàng)建對象
prototype.constructor = subType; //增強(qiáng)對象
subType.prototype = prototype; //指定對象
}


###七,函數(shù)的表達(dá)式 193- 210
**1,定義函數(shù)有兩種方式**
1,函數(shù)聲明,2,函數(shù)表達(dá)式
匿名函數(shù)定義:匿名函數(shù)的name是空字符串,也就是匿名函數(shù)沒有函數(shù)名。
 >```function functionName(arg0, arg1, arg2) {  //1,函數(shù)聲明
//函數(shù)體 有函數(shù)聲明提升的作用
}
var functionName = function(arg0, arg1, arg2){   //2,函數(shù)的表達(dá)式
//函數(shù)體  
};

2,arguments.callee 是一個(gè)正在執(zhí)行的函數(shù)的指針。
可以用arguments.callee 代替當(dāng)前執(zhí)行函數(shù)的函數(shù)名
但是在嚴(yán)格模式執(zhí)行下,訪問這個(gè)屬性會(huì)導(dǎo)致錯(cuò)誤,可以修改如下

if (num <= 1){
return 1;
} else {
return num * f(num-1);
}
});

    
**2,閉包**
1,閉包定義:有權(quán)訪問另一個(gè)函數(shù)作用域中的**變量**的函數(shù)。
      也就是說:函數(shù)用到外部的變量,不要傳參就可以獲取。
2,創(chuàng)建閉包:在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)。
3,閉包中的外部函數(shù)執(zhí)行完畢,其執(zhí)行環(huán)境的作用域鏈會(huì)被銷毀,但是其活動(dòng)參數(shù),變量也不會(huì)被銷毀,因?yàn)槟涿瘮?shù)的作用域鏈仍引用著這個(gè)活動(dòng)對象,直到匿名函數(shù)被銷毀后,外部函數(shù)的活動(dòng)對象才會(huì)被銷毀。
4,依據(jù)3,故由于閉包會(huì)攜帶包含它的函數(shù)的作用域,因此會(huì)比其他類型的函數(shù)占更多的內(nèi)存,再三靠考慮后再用。
5,閉包最大的用處:1,可以讀取函數(shù)內(nèi)部的變量。2,可以讓這些變量保存在內(nèi)存中,不會(huì)在外部函數(shù)調(diào)用結(jié)束后銷毀。
6,閉包應(yīng)用的2種情況如下:
1,第一,函數(shù)作為返回值
 
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/4034743-c1c3d08cf3cf54cb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
 
如上代碼,bar函數(shù)作為返回值,賦值給f1變量。執(zhí)行f1(15)時(shí),用到了fn作用域下的max變量的值。至于如何跨作用域取值,可以參考上一節(jié)。

 

第二,函數(shù)作為參數(shù)被傳遞

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/4034743-b25cde6aced16e06.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

>```
//閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁。//f2()就是一個(gè)閉包。
function f1(){
    var n=999;
    function f2(){
      alert(n); 
    }
    return f2;
  }
  var result=f1();
  result(); // 999

在jq中閉包的用法

//這里的$只是形參,但是jq是全局變量,所以不需要調(diào)用該函數(shù)就會(huì)自動(dòng)執(zhí)行,或者分2步,就是轉(zhuǎn)化成正常的函數(shù),先寫函數(shù),后調(diào)用。
(function($){
$("div p").click();
})(jQuery);


**3,this對象**
this的對象的運(yùn)行時(shí)基于函數(shù)執(zhí)行環(huán)境綁定的:
1,全局函數(shù)中調(diào)用,this指向windows。
2,被構(gòu)造函數(shù)調(diào)用時(shí),指向是調(diào)用對象,即new出來的對象。
3,call或者apply調(diào)用 this指向call apply傳遞的上下文。
  在閉包中this的使用問題
> ```
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()()); //"The Window"(在非嚴(yán)格模式下)
//匿名函執(zhí)行具有全局性,所以。。。

var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()()); //"My Object"
//如果想要訪問某個(gè)作用域中的arguments對象,必須將該對象的引用保存到另一個(gè)閉包能夠訪問的變量中。


**4,內(nèi)存泄露**
**5,模仿塊級作用域**
>```
(function(){
//這里是塊級作用域
})();//這里的小括號,意思是直接調(diào)用的意思。且只有函數(shù)表達(dá)式可以跟小括號,函數(shù)聲明不可以后面跟這個(gè)。

//一般在for循環(huán)的外部,也可以訪問到i。如果給這個(gè)for循環(huán)外部加個(gè)私有作用域的匿名函數(shù)。
//即在匿名函數(shù)中定義的任何變量,都會(huì)在執(zhí)行結(jié)束時(shí)被銷毀。
//而且這個(gè)還可以訪問到count,因?yàn)樗且粋€(gè)閉包。
function outputNumbers(count){
(function () {//這種做法還可以減少閉包占用內(nèi)存的問題,因?yàn)闆]有指向匿名函數(shù)的引用,執(zhí)行完畢后就可以銷毀了。
for (var i=0; i < count; i++){
alert(i);
}
})();
alert(i); //導(dǎo)致一個(gè)錯(cuò)誤!
}



**6,私有變量**207  226


##13,事件
**1,事件流**   
“DOM2級事件流”規(guī)定事件流包括三個(gè)階段:事件捕獲階段,處于目標(biāo)階段,和事件冒泡階段,其中冒泡階段和捕獲階段是相反的流。
由于瀏覽器的兼容性,一般建議用事件冒泡,特殊情況下在使用事件捕獲。
**2,動(dòng)態(tài)移除onclick事件**
jq中使用操作元素屬性的方法:$("#a").removeAttr("onclick");  添加為:$("#a").attr("onclick","test()")
js中:a.onclick=null;或者a.onclick=function(){//空方法};
**3,事件處理程序添加或者刪除**
> ```var btn = document.getElementById("myBtn");
var handler = function(){
alert(this.id);
};
btn.addEventListener("click", handler, false);//true是代表捕獲階段的事件。
//還可以給btn添加其他事件處理程序也可以添加2個(gè)click同樣的事件,按照先后的執(zhí)行順序。
btn.removeEventListener("click", handler, false); //有效!remove不了匿名函數(shù)
------------------------------在IE下添加事件處理程序------------------------
btn.attachEvent("onclick",handler);//添加事件處理程序
btn.detachEvent("onclick",handler)//刪除事件處理程序

需要注意的一點(diǎn)是:
1,IE事件處理程序 是“onclick”,非IE處理程序是“click”,且參數(shù)一個(gè)是2個(gè),另一個(gè)是3個(gè)。
2,作用域不一樣 IE處理程序的作用域會(huì)在全局作用域中運(yùn)行this===windows,非IE是當(dāng)前作用域中運(yùn)行。
3,IE,為一個(gè)按鈕添加不同的事件處理程序,其執(zhí)行的順序是按照其相反的添加順序執(zhí)行的。
4,IE9以及以上兼容addEventListent,全I(xiàn)E包括9以下都兼容attachEvent
5,支持IE事件處理程序的只有ie瀏覽器和opera

4,跨瀏覽器事件處理程序

瀏覽器事件兼容性代碼如下:

window.onload = function() {
var EventUtil = {
addHandler: function(element, type, handler){
//若瀏覽器支持addEventListener,則使用addEventListener來添加事件
if(element.addEventListener){
element.addEventListener(type, handler, false);
} else if(element.attachEvent){
element.attachEvent("on" + type, handler);
} else {
//若以上兩種添加事件的方法都不支持,則使用默認(rèn)的行為來添加事件
element["on" + type] = handler;
}
},
//移除事件
removeHandler: function(element, type, handler){
if (element.removeEventListener){
element.removeEventListener(type, handler, false);
} else if(element.detachEvent){
element.detachEvent("on" + type, handler);
} else{
element["on" + type] = null;
}
}
}
var btn1 = document.getElementById("myBtn1");
var handler = function(){
alert("hello handler");
}
EventUtil.addHandler(btn1, "click", handler);//調(diào)用,傳參,使用
}


**5,事件對象**
event對象代表事件的狀態(tài)。
所有的事件都會(huì)有下表列出的成員

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/4034743-f5ecebe0b4aebda8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/4034743-49356c41831f3331.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

為一個(gè)元素添加多個(gè)事件時(shí),可以使用type屬性,如下:
> ```var btn = document.getElementById("myBtn");
var handler = function(event){
switch(event.type){
case "click":
alert("Clicked");
break;
case "mouseover":
event.target.style.backgroundColor = "red";
break;
case "mouseout":
event.target.style.backgroundColor = "";
break;
}
};
btn.onclick = handler;
btn.onmouseover = handler;
btn. onmouseout = handler;

**

6,IE下的事件對象

Paste_Image.png

7,跨瀏覽器(兼容性)的事件對象

var EventUtil = {
addHandler: function(element, type, handler){
//省略的代碼
},
getEvent: function(event){
return event ? event : window.event;
},
getTarget: function(event){
return event.target || event.srcElement;
},
preventDefault: function(event){
if (event.preventDefault){
event.preventDefault();
} else {
event.returnValue = false;
}
},
removeHandler: function(element, type, handler){
//省略的代碼
},
stopPropagation: function(event){
if (event.stopPropagation){
event.stopPropagation();
} else {
event.cancelBubble = true;
}
}
};
--------------------一下是代碼調(diào)用兼容IE的事件對象Event-----------------------------
//注意IE不支持事件捕獲
var btn = document.getElementById("myBtn");
btn.onclick = function(event){
alert("Clicked");
event = EventUtil.getEvent(event);
EventUtil.stopPropagation(event);
};
document.body.onclick = function(event){
alert("Body clicked");
};


**8,事件類型**
  ``` 1,焦點(diǎn)事件。2,鼠標(biāo)事件。3,滾輪事件。4,文本事件。5,鍵盤事件。6,合成事件。7,變動(dòng)。 ```


**8.1,UI事件**
 
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/4034743-ab5bb94ad795f670.png?imageMogr2/auto-orient/strip%7CimageView2/2/
+/1240)
**8.2,焦點(diǎn)事件**
1,blur :元素失去焦點(diǎn)時(shí)觸發(fā),此事件不會(huì)冒泡,所有瀏覽器都支持。
2,focus:在元素獲得焦點(diǎn)時(shí)觸發(fā),次事件不會(huì)冒泡。
3,其他一些 失去獲得焦點(diǎn)的事件,瀏覽器支持步統(tǒng)一。
**8.3,鼠標(biāo)與滾輪事件**
9個(gè)鼠標(biāo)事件:click(單擊)dblclick(雙擊)mousedown(按下任意鼠標(biāo))mouseup(釋放鼠標(biāo)時(shí)觸發(fā)  )mouseenter(移動(dòng)到)mouseleave(移出)mousemove(內(nèi)部重復(fù)移動(dòng)觸發(fā),謹(jǐn)慎使用)
【mouseout()mouseover(移動(dòng)到)//可能子元素經(jīng)過也會(huì)觸發(fā),冒泡】
**8.4,客戶區(qū)坐標(biāo)位置**
鼠標(biāo)位置坐標(biāo)信息:
 screenX( )    screenY(  )       //鼠標(biāo)相對于整個(gè)電腦屏幕的坐標(biāo)  和滾動(dòng)條無關(guān)。
clientX(左到鼠標(biāo))clienY(上到鼠標(biāo))// 鼠標(biāo)相對于瀏覽器內(nèi)容顯示的視窗  和滾動(dòng)條無關(guān)  
pageX()  pageY()  //鼠標(biāo)相當(dāng)于瀏覽器內(nèi)容顯示的視窗,但是會(huì)加上滾動(dòng)的區(qū)域。
 **8.5,鼠標(biāo)滾輪事件**
mousewheel
scroll
**8.6,觸摸設(shè)備**
**8.7,移除事件**
**8.8,插入節(jié)點(diǎn)事件**
**9,鍵盤與文本事件**
keydown:當(dāng)用戶按下鍵盤上的任意鍵時(shí)觸發(fā),而且如果按住不放的話,會(huì)重復(fù)觸發(fā)此事件
keypress:當(dāng)用戶按下鍵盤上的字符鍵時(shí)觸發(fā),而且如果按住不放的話,會(huì)重復(fù)觸發(fā)此事件。
keyup:當(dāng)用戶釋放鍵盤上的鍵時(shí)觸發(fā)
**9.1,鍵碼**
**10,HTML5事件**
1,contextmenu事件
-------------------以上是N多事件------------------------------》



 ####為每個(gè)按鈕添加事件處理程序,性能會(huì)不好,因?yàn)槊總€(gè)函數(shù)都是一個(gè)對象,對象是占內(nèi)存的,所以對象越多,性能越差,解決“事件處理程序過多”的問題可以用到事件委托如下
>```
//JS中事件委托代碼:利用冒泡事件,給所在的父元素添加一個(gè)事件。
var list = document.getElementById("myLinks");
EventUtil.addHandler(list, "click", function(event){
event = EventUtil.getEvent(event);
var target = EventUtil.getTarget(event);  //目標(biāo)事件target
switch(target.id){
case "doSomething":
document.title = "I changed the document's title";
break;
case "goSomewhere":
location.;
break;
case "sayHi":
alert("hi");
break;
}
});

建議在瀏覽器卸載頁面之前移除頁面中的所有事件處理程序。onunload,特別是在ie瀏覽器下,建議這么做。
428

第十章,DOM節(jié)點(diǎn) 265-

DOM的屬性和方法整理:

1,創(chuàng)建節(jié)點(diǎn)createElement

    var createNode = document.createElement("div");
    var createTextNode = document.createTextNode("hello world");
    createNode.appendChild(createTextNode);
    document.body.appendChild(createNode);

2,刪除和替換節(jié)點(diǎn)remove/replaceChild

//刪除節(jié)點(diǎn)
   document.body.removeChild(createNode);//需要?jiǎng)h除的新節(jié)點(diǎn)一定要是子節(jié)點(diǎn)
-------------------------------------------------------------
//替換節(jié)點(diǎn)
 document.body.replaceChild(createNode,div1);//div1是被替換的節(jié)點(diǎn)。createNode是新節(jié)點(diǎn)

3,插入節(jié)點(diǎn)appendChild,insertBefore,insertBefore

//可以使用appendChild,insertBefore,insertBefore接收兩個(gè)參數(shù),
//第一個(gè)是插入的節(jié)點(diǎn),第二個(gè)是參照節(jié)點(diǎn),如insertBefore(a,b),則a會(huì)插入在b的前面
     var createNode = document.createElement("div");
    var createTextNode = document.createTextNode("hello world");
    createNode.appendChild(createTextNode);
    var div1 = document.getElementById("div1");
    document.body.insertBefore(createNode,div1);
//  document.body一定要是父節(jié)點(diǎn),且是在指定的子節(jié)點(diǎn)div1前面插入新的子節(jié)點(diǎn)createNode。

4,節(jié)點(diǎn)的屬性,父節(jié)點(diǎn),子節(jié)點(diǎn),兄弟節(jié)點(diǎn)last/firstChild/nextElementtSibling

 //lastElementChild;//nextElementtSibling (下一同級節(jié)點(diǎn)))
//previousElementSibling 上一同級節(jié)點(diǎn)
 if(ul.lastElementChild){ 
            console.log("111E"+ul.lastElementChild.innerHTML);
        }else {
            console.log("11"+ul.lastChild.innerHTML);
        }
 ---------------------------------------------------------
//父節(jié)點(diǎn)
   console.log(li.parentNode.innerHTML)
 //子節(jié)點(diǎn)
children是指元素的第一層子節(jié)點(diǎn)。chiledren是Element的屬性,
childNotes 也是指元素的第一層子節(jié)點(diǎn),但是在高級瀏覽器中它還包括很多其它的類型,比如說文本節(jié)點(diǎn)等,childNotes是node的屬性

5,克隆節(jié)點(diǎn)(沒有兼容性問題)cloneNode(true)

var ul = document.getElementById("ul");
var a=  ul.cloneNode(true);//設(shè)為false,則是輕度克隆,不會(huì)復(fù)制子節(jié)點(diǎn)。
document.getElementById("div").appendChild(a);
-------------------------
$("p").clone();//jq中clone的使用

6, innerHTML和outerHTML

<div id="test"> 
   <span style="color:red">test1</span> test2 
</div>
test的innerHTML值是<span>....</span>
test的outerHTML值是<div></div>
//注意:因?yàn)橛胕nnerHTML時(shí)會(huì)創(chuàng)建一個(gè)HTML解析器,效率要高很多,但是一定要避免循環(huán)操作innerHTML

7,insertAdjacentHTML在文本容器前后插入代碼(沒有兼容性問題)

document.getElementById("a").insertAdjacentHTML("afterBegin","<h1> 在文本前容器內(nèi)插入內(nèi)容1</h1>");
document.getElementById("a").insertAdjacentHTML("beforeEnd","<h1> 在文本后容器內(nèi)插入內(nèi)容2</h1>");
document.getElementById("a").insertAdjacentHTML("beforeBegin","<h1> 在文本前容器外插入內(nèi)容4</h1>");
document.getElementById("a").insertAdjacentHTML("afterEnd","<h1> 在文本后容器外插入內(nèi)容5</h1>");

8,JS選擇器querySelector/querySelectorAll

1,getElementById 
2,getElementsByName 
3,getElementsByTagName  
4,getElementsByClassName //IE8以及以下瀏覽器不兼容
5,document.querySelector('#foo > div.bar')//返回第一個(gè)匹配元素
6,document.querySelectorAll('.bar')//所有匹配元素的集合
----------**注意事項(xiàng)**:---------------
1,querySelector()不是實(shí)時(shí)的,所以動(dòng)態(tài)添加一個(gè)元素的時(shí)候,元素集合不會(huì)更新。
     IE8以及以上瀏覽器支持,IE8以下 不支持
2,想要獲得集合中每個(gè)元素,需要遍歷解決,如下:
// Using Array.from()
Array.from(myElements).forEach(doSomethingWithEachElement)
// Or prior to ES6
Array.prototype.forEach.call(myElements, doSomethingWithEachElement
// Shorthand:
[].forEach.call(myElements, doSomethingWithEachElement)
3,因?yàn)镋lement接口繼承自Node接口,它也有以下的屬性:
myElement.children,myElement.firstElementChild,myElement.lastElementChild,myElement.previousElementSibling,myElement.nextElementSibling
或者
myElement.childNodes,myElement.firstChild,myElement.lastChild,myElement.previousSibling,myElement.nextSibling,myElement.parentNode,myElement.parentElement

9,修改classname,.classList.add()/.remove/.toggle()

//IE10 以及以上瀏覽器才支持
document.querySelector("div>span").classList.add(“boo”)//添加class
document.querySelector("div>span").classList.remove(“boo”)//刪除class
document.querySelector("div>span").classList.toggle(“xx”)//再添加一個(gè)class
document.querySelector("div>span").classList.contains('myclass');//檢查是否包含myclass類

10,設(shè)置和獲取和刪除屬性值getAttribute

//IE7以及以下瀏覽器不
var div=document.getElementById("a");
  if(div.getAttribute("class")){
            console.log(div.getAttribute("class"));//在IE8以及以上瀏覽器獲取class的值
        }else {
            console.log(div.getAttribute("className"));//在IE7以及以上瀏覽器獲取class的值
        }
//div.setAttribute("value",“xxx”);//設(shè)置元素的value,也可以設(shè)置class和id以及其他屬性值。
注意class和className在IE下的區(qū)別
//div.removeAttribute("value");//刪除這個(gè)屬性
//div.hasAttribute("onclick");//查看元素是否有onclick屬性,返回true和false,
// div.hasAttributes()//查看元素是否有任何屬性,有一個(gè)則返回true,否則false
 //檢查元素div是否有子元素
document.getElementById("div").hasChildNodes();

11,各種寬高

**width:**
1,標(biāo)準(zhǔn)盒子模型:width=元素的內(nèi)容
2,怪異盒子模型:width=元素的內(nèi)容+內(nèi)邊距pading+邊框border
**clientWidth:可視區(qū)域的寬度**
1,標(biāo)準(zhǔn):clientWidth 可視區(qū)域的寬度,出去滾動(dòng)條17px
**offsetHeight:**與Height的區(qū)別是增加了border的高度,
http://blog.csdn.net/piziliweiguang/article/details/7762770
網(wǎng)頁可見區(qū)域?qū)挘?document.body.clientWidth;//即border
網(wǎng)頁可見區(qū)域高: document.body.clientHeight;
網(wǎng)頁可見區(qū)域?qū)挘?document.body.offsetWidth (包括borfer的寬);
網(wǎng)頁可見區(qū)域高: document.body.offsetHeight (包括邊線的寬);
網(wǎng)頁正文全文寬: document.body.scrollWidth;
網(wǎng)頁正文全文高: document.body.scrollHeight;
網(wǎng)頁被卷去的高: document.body.scrollTop;
網(wǎng)頁被卷去的左: document.body.scrollLeft;
網(wǎng)頁正文部分上: window.screenTop;
網(wǎng)頁正文部分左: window.screenLeft;
屏幕分辨率的高: window.screen.height;
屏幕分辨率的寬: window.screen.width;
屏幕可用工作區(qū)高度: window.screen.availHeight;
屏幕可用工作區(qū)寬度:window.screen.availWidth;

12,自定義屬性:掛鉤data-

<div id="a"  data-appId="12345">    測試     </div>//設(shè)置data-appId
取值:
var div = document.getElementById("myDiv");
div.getAttribute("data-appId");
-------------------------------------------------
  div.setAttribute("data-appId","123454");//設(shè)置data-appId
?。篸iv.getAttribute("data-appId");
------------------------------------
div.dataset.appId = 23456;//設(shè)置data-appId
取值“” console.log( div.dataset.appId);

**13,scrollIntoView 滾動(dòng)頁面

1,document.getElementById('showscroll').scrollIntoView();//true,false ;true元素頂端對其瀏覽器頂端
2,相當(dāng)于錨點(diǎn),寫法<a href="divId.scrollIntoView(false)">//divId是某個(gè)元素id名稱

14,表單腳本430-462 32

1,阻止表單提交

var form = document.getElementById("myForm");
EventUtil.addHandler(form, "submit", function(event){//以便跨瀏覽器執(zhí)行
//取得事件對象
event = EventUtil.getEvent(event);
//阻止默認(rèn)事件
EventUtil.preventDefault(event);
//提交表單
form.submit();3
});

2,阻止重復(fù)提交表單

 <form action="${pageContext.request.contextPath}/servlet/DoFormServlet" onsubmit="return dosubmit()" method="post">
 <script type="text/javascript">
       var isCommitted = false;//表單是否已經(jīng)提交標(biāo)識(shí),默認(rèn)為false
        function dosubmit(){
          if(isCommitted==false){
           isCommitted = true;//提交表單后,將表單是否已經(jīng)提交標(biāo)識(shí)設(shè)置為true
             return true;//返回true讓表單正常提交
           }else{
            return false;//返回false那么表單將不提交
           }
         }
    </script>
------------------------------
//避免多次提交表單
EventUtil.addHandler(form, "submit", function(event){
event = EventUtil.getEvent(event);
var target = EventUtil.getTarget(event);
//取得提交按鈕
var btn = target.elements["submit-btn"];
//禁用它
btn.disabled = true;
});

3,重置表單
form.reset();//表單值全部重置原始,可能會(huì)清空
<select>...</select> "select-one"http://單選特性
<select multiple>...</select>//多選特性
focus:獲得焦點(diǎn)事件
brur:失去焦點(diǎn)事件
<input type="number" min="0" max="100" step="5" name="count">//數(shù)字可以按5遞加.stepDown(10);10遞減
<input type="text" size="25" maxlength="50" value autofocus >//autofocus是不用js即可獲取焦點(diǎn)的方法,另外顯示25個(gè)字符輸入不能超過50個(gè)
<textarea rows="2" cols="20">initial value</textarea>//2行,每行20個(gè)字符
change:失去焦點(diǎn)且元素value值改變時(shí)觸發(fā),<select>則是在選項(xiàng)發(fā)生改變時(shí)觸發(fā)

 document.getElementById("txt1").select() ;  //選中值
textbox.value = "Hello world!"  
//選擇所有文本  IE9以及以上
textbox.setSelectionRange(0, textbox.value.length); //"Hello world!"
//選擇前3 個(gè)字符
textbox.setSelectionRange(0, 3); //"Hel"
//選擇第4 到第6 個(gè)字符
textbox.setSelectionRange(4, 7); //"o w"
-----------------------------------
textbox.value = "Hello world!"
//選擇所有文本
selectText(textbox, 0, textbox.value.length); //"Hello world!"
//選擇前3 個(gè)字符
selectText(textbox, 0, 3); //"Hel"
//選擇第4 到第6 個(gè)字符
selectText(textbox, 4, 7); //"o w"

tabForward()//實(shí)現(xiàn)自動(dòng)切換焦點(diǎn)

十五:canvas

<canvas id="myCanvas" width="200" height="100"style="border:1px solid #000000;"></canvas>
var c=document.getElementById("myCanvas");
//確定瀏覽器支持<canvas>元素
if (drawing.getContext){
var ctx=c.getContext("2d");
ctx.fillStyle="#FF0000";
ctx.fillRect(0,0,150,75);
}
//-------------后續(xù)補(bǔ)充----------

第二十章,JSON

1,json和js對象字面量的區(qū)別:json:1,屬性值key必須加雙引號。2,沒有變量,3,沒有分號
2,json分類:1,簡單值,2,對象,3,數(shù)組
3,JSON 對象有兩個(gè)方法:stringify()和parse()。
JSON.stringify(book);//把js對象序列化成json字符串
JSON.parse(jsonText);//把json字符串轉(zhuǎn)化為js類型格式

var book = {
title: "Professional JavaScript",
authors: [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};
1:var jsonText = JSON.stringify(book);//把js對象序列化成json字符串
//{"title":"Professional JavaScript","authors":["Nicholas C. Zakas"],"edition":3,
"year":2011}
2:var jsonText = JSON.stringify(book, ["title", "edition"]);//只返回這2個(gè)屬性
//{"title":"Professional JavaScript","edition":3}
3:var jsonText = JSON.stringify(book, function(key, value){。。。})//還可以是個(gè)函數(shù),就有些復(fù)雜
4:var bookCopy = JSON.parse(jsonText);//把json字符串轉(zhuǎn)化為js類型格式
**4,**toJSON() 方法可以將 Date 對象轉(zhuǎn)換為字符串,并格式化為 JSON 數(shù)據(jù)格式

第二十一章Ajax和comet

var xmlhttp=new XMLHttpRequest();
1,xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);//true代表異步
2,xmlhttp.send();//啟動(dòng)派發(fā)請求的操作
3,responseText:作為響應(yīng)主體被返回的文本。
4,responseXML:如果響應(yīng)的內(nèi)容類型是"text/xml"或"application/xml",這個(gè)屬性中將保
存包含著響應(yīng)數(shù)據(jù)的XML DOM 文檔。
5,status:響應(yīng)的HTTP 狀態(tài)//200成功,304說明請求資源沒有修改,可以使用緩存數(shù)據(jù)
6,statusText:HTTP 狀態(tài)的說明。
7,readyState 屬性
0:未初始化。尚未調(diào)用open()方法。
? 1:啟動(dòng)。已經(jīng)調(diào)用open()方法,但尚未調(diào)用send()方法。
? 2:發(fā)送。已經(jīng)調(diào)用send()方法,但尚未接收到響應(yīng)。
? 3:接收。已經(jīng)接收到部分響應(yīng)數(shù)據(jù)。//可以在3里面做loading
? 4:完成。已經(jīng)接收到全部響應(yīng)數(shù)據(jù),而且已經(jīng)可以在客戶端使用了。
8,get和post的區(qū)別:
get:參數(shù)放在URL后面?。如果數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送,如果是空格,轉(zhuǎn)換為+,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進(jìn)制表示的ASCII。
GET 請求可被緩存
GET 請求保留在瀏覽器歷史記錄中
GET 請求可被收藏為書簽
GET 請求不應(yīng)在處理敏感數(shù)據(jù)時(shí)使用
GET 請求有長度限制
GET 請求只應(yīng)當(dāng)用于取回?cái)?shù)據(jù)

post:多了xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");和xhr.send(serialize(form));//參數(shù)放在這里面
POST 請求不會(huì)被緩存
POST 請求不會(huì)保留在瀏覽器歷史記錄中
POST 不能被收藏為書簽
POST 請求對數(shù)據(jù)長度沒有要求
POST 發(fā)送敏感數(shù)據(jù)時(shí)post更安全
9.new FormData()表單數(shù)據(jù)系列話,好處在于不必明確地在XHR 對象上設(shè)置請求頭
10,timeout和回調(diào)函數(shù)
11,overrideMimeType()

<script>
function loadXMLDoc()
{
    var xmlhttp;
    if (window.XMLHttpRequest)
    {
        //  IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執(zhí)行代碼
        xmlhttp=new XMLHttpRequest();
    }
    else
    {
        // IE6, IE5 瀏覽器執(zhí)行代碼
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200  //這個(gè)寫在前面可以避免瀏覽器兼容性
        {
            document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
        }
    }
    xmlhttp.open("GET","/try/ajax/ajax_info.txt",true);
    xmlhttp.send();
}
</script>

第八章

1,location對象
//假設(shè)初始URL 為http://www.wrox.com/WileyCDA/
//將URL 修改為"http://www.wrox.com/WileyCDA/#section1"
location.hash = "#section1";//單頁面設(shè)計(jì)主要思想
//將URL 修改為"http://www.wrox.com/WileyCDA/?q=javascript"
location.search = "?q=javascript";
//將URL 修改為"http://www.yahoo.com/WileyCDA/"
location.hostname = "www.yahoo.com";
//將URL 修改為"http://www.yahoo.com/mydir/"
location.pathname = "mydir";
//將URL 修改為"http://www.yahoo.com:8080/WileyCDA/"
2,history 對象
//后退一頁
history.go(-1);
//前進(jìn)一頁
history.go(1);
//前進(jìn)兩頁
history.go(2);
//跳轉(zhuǎn)到最近的wrox.com 頁面
history.go("wrox.com");
//跳轉(zhuǎn)到最近的nczonline.net 頁面
history.go("nczonline.net");

跨域

1,定義:只要協(xié)議,域名,端口有任何一個(gè)不同的地方就叫跨域
2,我需要跨域的域名,測試啊 測試
http://m.blog.csdn.net/article/details?id=51285688
http://www.lxweimin.com/p/26925900a389
3,同源策越,即使同域名,同協(xié)議,同端口。如果任意一個(gè)不同,需要進(jìn)行跨域訪問。
4,src進(jìn)行跨域的時(shí)候,只能有g(shù)et請求,get請求進(jìn)行跨域的時(shí)候,主要是jsonp跨域
瀏覽器限制對其返回的內(nèi)容無法進(jìn)行讀寫。
5,用src進(jìn)行跨域的時(shí)候又叫做jsonp跨域,主要在頁面生成script標(biāo)簽 只能有g(shù)et請求
通常 jsonp請求是src跨域,有回調(diào)函數(shù),跨域不同的網(wǎng)站,

3.分類:
(1)主機(jī)不同
(2)主域相同子域不同a.c.com和b.c.com
(3)主域不同www.a.comwww.b.com
端口不同www.a.com:8080www.a.com:8088
協(xié)議不同http://www.a.com和https://www.a.com

http://mail.163.com/index.html
http://協(xié)議
mial 服務(wù)器名
163.com 域名
mail.163.com網(wǎng)站名 由服務(wù)器和域名組成
8080:端口號
index.html:默認(rèn)根目錄

子域名和二級域名
例如www.dns0755.netdns0755.net的子域名,而dns0755.net又是net的子域名。國際頂級域名的子域名叫做二級域名。例如www.dns0755.netftp.dns0755.net都是dns0755.net的二級域名。

端口和協(xié)議不同而造成的跨域問題只能通過后臺(tái)代理解決。

回調(diào)函數(shù)

1,定義:回調(diào)函數(shù)作為變量傳遞給另外一個(gè)函數(shù)的(作為參數(shù)傳遞)函數(shù),在他主體執(zhí)行完畢后

回調(diào)函數(shù)代碼如下:
function a(callbackFunction){//函數(shù)b作為參數(shù)傳遞給函數(shù)a
   alert("這是parent函數(shù)a");
   var m =1;
   var n=3;
  return callbackFunction(m,n);//同時(shí)此回調(diào)函數(shù)也是一個(gè)閉包
 }
 function b(m,n){
   alert("這是回調(diào)函數(shù)B");
   return m+n;
 }
 $(function(){
   var result = a(b);//執(zhí)行a(b)
   alert("result = "+ result);
 });
執(zhí)行順序?yàn)椋?這是parent函數(shù)a
這是回調(diào)函數(shù)B
result = 4
----------------------------------
$("#btn_1").click(function() {//jq最簡單的回調(diào)函數(shù)例子
  alert("Btn 1 Clicked");
});
-----------------------
var friends = ["Mike", "Stacy", "Andy", "Rick"];//js的回調(diào)函數(shù)案例
friends.forEach(function (eachName, index){
console.log(index + 1 + ". " + eachName); // 1. Mike, 2. Stacy, 3. Andy, 4. Rick
});

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

this的指向問題

1,在普通函數(shù)中,this指向它的直接調(diào)用者。如果找不到,則是指向windows對象
2,

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

推薦閱讀更多精彩內(nèi)容

  • 第一章: JS簡介 從當(dāng)初簡單的語言,變成了現(xiàn)在能夠處理復(fù)雜計(jì)算和交互,擁有閉包、匿名函數(shù), 甚至元編程等...
    LaBaby_閱讀 1,703評論 0 6
  • 單例模式 適用場景:可能會(huì)在場景中使用到對象,但只有一個(gè)實(shí)例,加載時(shí)并不主動(dòng)創(chuàng)建,需要時(shí)才創(chuàng)建 最常見的單例模式,...
    Obeing閱讀 2,103評論 1 10
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,842評論 2 17
  • 有人說過,很多彎路到最后都成了直路,所有的坑到最后也都成了坦途;所謂的直路和坦途并不是擺在眼前的,都是不斷的的...
    老衲法號一眉道人閱讀 1,368評論 0 4
  • Chapter 5 引用類型 Object類型 創(chuàng)建Object實(shí)例new Object()var person ...
    云之外閱讀 398評論 0 0