国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

關(guān)于ajax,json以及jsonp

alighters / 3039人閱讀

摘要:中間部分由或多個(gè)以,分隔的關(guān)鍵字值對構(gòu)成,關(guān)鍵字字符串和值之間以分隔數(shù)組結(jié)構(gòu)以開始,結(jié)束。

Q:AJAX以何種格式來交換數(shù)據(jù)?跨域的需求如何解決?

A:用JSON來傳數(shù)據(jù),靠JSONP來跨域(具體參見下文)

AJAX 創(chuàng)建對象

AJAX = Asynchronous(英[e??s??kr?n?s]) JavaScript and XML(異步的 JavaScript 和 XML)。

XMLHttpRequest 用于在后臺與服務(wù)器交換數(shù)據(jù)。這意味著可以在不重新加載整個(gè)網(wǎng)頁的情況下,對網(wǎng)頁的某部分進(jìn)行更新。

創(chuàng)建兼容對象

所有現(xiàn)代瀏覽器均支持 XMLHttpRequest 對象(IE5 和 IE6 使用 ActiveXObject)。

// 創(chuàng)建 XMLHttpRequest 對象
var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
// 向服務(wù)器發(fā)送請求
// 當(dāng)使用 async=true 時(shí),請規(guī)定在響應(yīng)處于 onreadystatechange 事件中的就緒狀態(tài)時(shí)執(zhí)行的函數(shù)
// async=false 時(shí),請不要編寫 onreadystatechange 函數(shù) - 把代碼放到 send() 語句后面即可
xmlhttp.onreadystatechange=function(){
  if (xmlhttp.readyState==4 && xmlhttp.status==200){
    // 來自服務(wù)器的響應(yīng) responseText:字符串形式 responseXML:XML形式
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
  }
}
xmlhttp.open("GET","test1.txt",true);
xmlhttp.send();
發(fā)送請求 XMLHttpRequest 方法

open(method,url,async)

method:請求的類型;GET 或 POST
url:文件在服務(wù)器上的地址(該文件可以是任何類型的文件或服務(wù)器腳本文件)
async:true(異步)或 false(同步)

send(string)

string:僅用于 POST 請求

GET 還是 POST?

與 POST 相比,GET 更簡單也更快,并且在大部分情況下都能用。
然而,在以下情況中,請使用 POST 請求:
無法使用緩存文件(更新服務(wù)器上的文件或數(shù)據(jù)庫)
向服務(wù)器發(fā)送大量數(shù)據(jù)(POST 沒有數(shù)據(jù)量限制)
發(fā)送包含未知字符的用戶輸入時(shí),POST 比 GET 更穩(wěn)定也更可靠

避免得到的是緩存的結(jié)果,向URL添加一個(gè)唯一的 ID

xmlhttp.open("GET","demo_get.asp?t=" + Math.random(),true);

希望通過 GET 方法發(fā)送信息,請向 URL 添加信息

xmlhttp.open("GET","demo_get2.asp?fname=Bill&lname=Gates",true);

需要像 HTML 表單那樣 POST 數(shù)據(jù),請使用 setRequestHeader() 來添加 HTTP 頭。然后在 send() 方法中規(guī)定您希望發(fā)送的數(shù)據(jù)

// 向請求添加 HTTP 頭。
// setRequestHeader(header,value)
// header: 規(guī)定頭的名稱 value: 規(guī)定頭的值
xmlhttp.open("POST","ajax_test.asp",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Bill&lname=Gates");
服務(wù)器響應(yīng)

XMLHttpRequest 對象的 responseText 或 responseXML 屬性

responseText:字符串形式
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
responseXML:XML形式
// 請求 books.xml 文件,并解析響應(yīng)   
xmlDoc=xmlhttp.responseXML;
txt="";
x=xmlDoc.getElementsByTagName("ARTIST");
for (i=0;i";
  }
document.getElementById("myDiv").innerHTML=txt;    
readyState

當(dāng)請求被發(fā)送到服務(wù)器時(shí),我們需要執(zhí)行一些基于響應(yīng)的任務(wù)。
readyState 屬性存有 XMLHttpRequest 的狀態(tài)信息。
每當(dāng) readyState 改變時(shí),就會(huì)觸發(fā) onreadystatechange 事件。

XMLHttpRequest 對象的三個(gè)重要的屬性

onreadystatechange

存儲(chǔ)函數(shù)(或函數(shù)名),每當(dāng) readyState 屬性改變時(shí),就會(huì)調(diào)用該函數(shù)。

readyState

存有 XMLHttpRequest 的狀態(tài)。從0到4發(fā)生變化。(一共被觸發(fā) 5 次)
0: 請求未初始化
1: 服務(wù)器連接已建立
2: 請求已接收
3: 請求處理中
4: 請求已完成,且響應(yīng)已就緒

status

200: "OK"
404: 未找到頁面

使用 Callback 函數(shù)

callback 函數(shù)是一種以參數(shù)形式傳遞給另一個(gè)函數(shù)的函數(shù)

JSON

JavaScript 對象表示法(JavaScript Object Notation)
是存儲(chǔ)和交換文本信息的語法。類似 XML,比XML更小、更快,更易解析。
JSON有六種類型的值:對象,數(shù)組,字符串,數(shù)字,布爾值和特殊值null。

JSON 語法規(guī)則

數(shù)據(jù)在名稱/值對中
數(shù)據(jù)由逗號分隔
花括號保存對象
方括號保存數(shù)組

JSON具有兩種結(jié)構(gòu):對象,數(shù)組

對象結(jié)構(gòu)以”{”大括號開始,以”}”大括號結(jié)束。中間部分由0或多個(gè)以”,”分隔的”key(關(guān)鍵字)/value(值)”對構(gòu)成,關(guān)鍵字字符串和值之間以”:”分隔

{
    key1:value1,
    key2:value2,
    ...
}

數(shù)組結(jié)構(gòu)以”[”開始,”]”結(jié)束。中間由0或多個(gè)以”,”分隔的值列表組成

[
   {
       key1:value1,
       key2:value2,
      ...
   },
   {
       key1:value1,
       key2:value2,
      ...
   },
]

JSON的解析與序列化

JSON對象(ECMAScript 5中添加的, 早期JSON解析基本都使用javascript的eval()函數(shù)。但是eval有一些性能和安全上的缺點(diǎn),ECMAScript對解析JSON對象進(jìn) 行了規(guī)范,定義了全局對象JSON,支持的瀏覽器有標(biāo)準(zhǔn)瀏覽器和IE8+。對于不支持的瀏覽器可以引入json2.js文件。)有stringify與parse這兩個(gè)方法。

JSON.stringify

將javascript對象序列化為JSON格式的字符串

JSON.stringify(ob,filter,indent)包含三個(gè)參數(shù),通常我們在使用的時(shí)候只帶第一個(gè)參數(shù),來返回字符串。

ob:要轉(zhuǎn)化成JSON字符串的對象,數(shù)組,原始值。

filter:是一個(gè)可選的參數(shù),通常是一個(gè)函數(shù),用來在字符串化前對值做一些替換。也可以是一個(gè)數(shù)組,包含哪些需要字符串化的屬性名。就是用來過濾的。

// 第二個(gè)參數(shù)是數(shù)組過濾器
var oJson = { name: "hum", age: 20, sex: 1};
console.log(JSON.stringify(oJson, ["age", "sex"])); 
// {"age":20,"sex":1}

// 第二個(gè)參數(shù)是函數(shù)過濾器
// 如果該參數(shù)是函數(shù),則它是一個(gè)替換函數(shù),該函數(shù)會(huì)在每一個(gè)需要字符串化的對象上調(diào)用。
// 這個(gè)函數(shù)的第一個(gè)參數(shù)是該對象中的屬性名或數(shù)組的序號,第二個(gè)則是值本身。
// 函數(shù)的返回值會(huì)替換掉需要字符串化的值,如果函數(shù)返回undefined或沒有任何的返回值,則會(huì)在字符串化的時(shí)候忽略這個(gè)值。
var oJson = { name: "hum", age: 26, sex: 1, love: ["swing", "jump"]};
console.log(JSON.stringify(oJson, function(k, v){
    switch (k){
        case "age":
            return v > 20 ? "成年": "未成年";
        case "love":
            return v.join(",");
        case "sex":
            return undefined;
        default :
            return v;
    }
})); 
// {"name":"hum","age":"成年","love":"swing,jump"}

indent:也是一個(gè)可選參數(shù),在需要輸出格式化的可閱讀的代碼時(shí),使用indent參數(shù)來指定用來縮進(jìn)的字符串或空格。如果省略該參數(shù),返回的字符串將不帶任何的額外的空格,這樣輸出的值很難閱讀。就是用來格式化的。

JSON.parse

JSON.parse用來解析json格式的字符串(返回一個(gè)對象,數(shù)組或原始值)
JSON.parse(s,reviver)包含兩個(gè)參數(shù)

s:要解析的字符串

reviver:用來轉(zhuǎn)換解析值得可選函數(shù)

通常使用只使用第一個(gè)參數(shù),可選參數(shù)reviver,主要是在返回解析值之前,對其進(jìn)行過濾或后期處理。
reviver函數(shù)會(huì)在從s中解析的每個(gè)原始值調(diào)用一次。
調(diào)用reviver函數(shù)是帶有兩個(gè)參數(shù),第一個(gè)屬性名(對象的屬性名或是轉(zhuǎn)換成字符串的數(shù)組序號),第二個(gè)參數(shù)是對象的屬性或是數(shù)組的元素值。
reviver函數(shù)會(huì)作為包含原始值的對象/數(shù)組的方法來調(diào)用。
reviver函數(shù)的返回值會(huì)成為屬性的新值,如果reviver返回第二個(gè)參數(shù),則屬性不變。
如果reviver返回undefined或不凡會(huì)任何值,則會(huì)從對象或是數(shù)組中刪除屬性。

var oJson = { name: "hum", age: 26, sex: 1, love: ["swing", "jump"], birthday: "1988-01-12"};
var sJson = JSON.stringify(oJson);
console.log(sJson);
//{"name":"hum","age":26,"sex":1,"love":["swing","jump"],"birthday":"1988-01-12"}
console.log(JSON.parse(sJson));
console.log(JSON.parse(sJson, function (k, v) {
    if(k == "birthday"){ // 返回日期對象
        return new Date(v);
    }else if(k == "sex"){ // sex不在了
        return undefined;
    }else{
        return v;
    }
}));
JSON格式化工具

http://www.runoob.com/jsontool

JSONP

Jsonp(JSON with Padding) 是 json 的一種"使用模式",可以讓網(wǎng)頁從別的域名(網(wǎng)站)那獲取資料,即跨域讀取數(shù)據(jù)。

JSONP是怎么產(chǎn)生的?

1、眾所周知,Ajax直接請求普通文件存在跨域無權(quán)限訪問的問題(原因參見 同源策略-web腳本安全)

2、但是,HTML的

閱讀需要支付1元查看
<