JAVASCRIPT高程筆記-------JSON與AJAX

json對象——語法mysql

    簡單值:與JS相同語法,能夠是字符串,數值,布爾值,null;但不支持undefinedweb

    對象: 複雜數據類型,表示一組有序的鍵值對,鍵值對的值能夠是簡單數據,也能夠是複雜數據sql

    數組:也是複雜數據類型,數組的值也能夠是簡單或者複雜類型json

  json字符串必需要使用雙引號跨域

json對象方法  數組

    JSON.stringify(js對象),此方法接收一個或者兩個參數,第一個參數爲js對象並將其解析返回一個json對象 ,在解析過程當中,全部的函數及原型成員都會被有意忽略,此外值爲undefined的任何屬性也會被跳過,第二個參數爲解析規則能夠是數組也能夠是函數,若是是數組那麼只解析數組中包含的屬性,若是爲函數那麼根據函數的定義返回須要的值瀏覽器

var book = {
    title : "mysql clksx",
    authors : ["zhangsan","lisi"],
    edition : 3,
    year :2011
};
var jsonText = JSON.stringify(book);
console.log(jsonText); //{"title":"mysql clksx","authors":["zhangsan","lisi"],"edition":3,"year":2011}

var jsonText = JSON.stringify(book,["title","year","name"]);
console.log(jsonText); //{"title":"mysql clksx","year":2011}

var jsonText = JSON.stringify(book,function(key,value){
    switch(key){
        case "authors":
            return value.join("-");
        case "year":
            return 2017;
        default:
            return value;
    }
});
console.log(jsonText); //{"title":"mysql clksx","authors":"zhangsan-lisi","edition":3,"year":2017}

 

 

 

若是一個js對象自己擁有toJSON方法 那麼序列化時就默認調用此方法 緩存

var book = {
    title : "mysql clksx",
    authors : ["zhangsan","lisi"],
    edition : 3,
    year :2011,
    toJSON : function(){
        return this.title;
    }
};
var jsonText = JSON.stringify(book);
console.log(jsonText);//"mysql clksx"

 

json.stringify()的序列化順序爲: 第一步——查找被序列化的對象的toJSON方法,而且是能取到有效的值,則調用該方法!不然默認順序執行序列化安全

             第二步——若是提供了第二個參數,應用這個函數過濾器,那麼傳入這個函數過濾器的值是第一步返回的值服務器

             第三步——對第二步返回的值進行序列化

             第四步——若是提供了第三個參數,那麼將第三步的值進行格式化

JSON.parse() 方法    ---將一個字符串解析成JSON對象    第一個參數爲字符串  第二個參數爲解析函數,以下示例

var book = {
    title : "mysql clksx",
    authors : ["zhangsan","lisi"],
    edition : 3,
    year : 2011
    
};
console.log(book.title);
var jsonText = JSON.stringify(book);
console.log(jsonText);

var bookCopy = JSON.parse(jsonText,function(key,value){
    if(key == "title"){
        return "mysql 從零開始學";
    }else{
        return value;
    }
});
console.log(bookCopy.title); //mysql 從零開始學

 

 

AJAX ——Asynchronous Javascript And XML    

  XMLHttpRequest對象的用法

      IE7 以及其餘的瀏覽器   建立XHR 對象的方式  var xhr = new XMLHttpRequest();

      open()——此方法接收三個參數, 第一個參數爲 請求的方法如(get,post等),第二個參數爲請求的URL,第三個參數爲是否異步發送請求的布爾值    以下示例

        xhr.open("get","xxx.jsp",false);

        xhr.send(null);

      注意的是open方法並非直接發送請求,而是建立一個請求等待發送,send方法接收發送請求的參數若沒有參數則必須傳遞null值,因爲此處代碼是同步的會等到服務器響應以後在繼續執行!收到響應後會自動填充到XHR對象的屬性中

        responseText:做爲響應主體被返回的文本

        responseXML:若是響應的內容是「text/xml」或者「application/xml」,那麼這個屬性中保存的是響應回來的XML DOM文檔

        status : 響應的HTTP狀態碼

        statusText : HTTP狀態的說明

    異步發送的檢測《xhr的readState屬性》 ,在異步發送的果過程當中,這個屬性反映了請求和響應過程的狀態變化,此屬性的值有以下

      0: 未初始化,還沒有調用open方法

      1: 啓動,調用了open方法,但爲調用send方法

      2:發送,已經調用了send方法,但未收到迴應,

      3:正在接收響應,已經接收了部分響應內容

      4: 響應接收完畢,可使用響應的數據

  此屬性每次發生變化都會觸發readystatechange事件,不過要在xhr對象調用open方法前指定事件處理函數,一個完整的例子

var  xhr = new XMLHttpRequest();
xhr.readystatechange  = function(){
    if(xhr.readyState == 4){  
        if((xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 ){
            alert(xhr.responseText);
        }else{
            alert("error");
        }
    }
}
xhr.open("get","xxx.jsp",true);
xhr.send(null);

 

       

 HTTP頭部信息  

    Accep:瀏覽器能處理的內容類型

    Accep-charset : 瀏覽器能顯示的字符集

    Accep-Encoding : 瀏覽器可以處理的壓縮編碼

    Accep-Language:瀏覽器能當前設置的語言

    Connection:瀏覽器與服務器之間鏈接的類型

    Cookie:當前頁面設置的任何Cookie

    Host:發出請求的頁面所在的域

    Referer:發出請求的頁面URI

    User-agent : 瀏覽器的用戶代理字符串

在調用open方法以後而且在調用send方法以前 能夠設置HTTP頭部信息  ,建議使用自定義頭部信息,以便服務器進行解析!

xhr.getResponseHeader()方法 指定頭部名稱能夠獲取相應的服務器響應信息

xhr.getAllResponseHeaders()  能夠獲取全部的HTTP頭部服務器響應信息

get請求----將請求參數名稱和值直接添加在url末尾的一個請求方式

因爲gei請求常常會由於字符串格式發生意外,建議使用以下函數進行url編碼

function addURLParam(url,name,value){
    url += (url.indexOf("?")) == -1 ? "?" : "&";
    url += encodeURIComponet(name) + "=" + encodeURIComponet(value);
    return url;
}

 

post請求 - 在send方法中傳入參數字符串或者是xml文檔,一個post請求的示例

xhr.open("post","xxx.jsp",true);
xhr.send("name=zhangsan&age=18");

 

post 與get請求的區別

  Get是向服務器發索取數據的一種請求,而Post是向服務器提交數據的一種請求

  長度問題--受限於瀏覽器以及服務器 大多數對get請求有長度限制,而post則沒有

  安全問題--get請求是明文請求,其參數直接反映在瀏覽器的地址欄上,而且get請求能夠被緩存,而post沒法緩存以及參數被隱藏在http請求中

 

formData對象   用於簡化xhr進行操做的一個類型  , 建立一個formData對象  而後調用其append方法 就能夠很方便的添加參數內容  ,在send方法中之間傳入這個formData對象實例,使用formData的好處是沒必要明確的設置請求頭部信息,XHR對象能正確識別formData對象並配置合適的頭部信息

超時設定  timeout屬性  能夠設置請求的超時時間默認單位毫秒

overrideMimeType()方法  此方法用於重寫XHR響應的MIME類型,此方法也必須在send方法以前進行調用,以下所示,就是告知XHR對象將響應的內容看成XML文檔進行處理,支持的瀏覽器有谷歌,火狐,opera,safari4+

var  xhr = new XMLHttpRequest();
xhr.open("post","xxx.jsp",true);
xhr.overrideMimeType("text/xml");
xhr.send("name=zhangsan&age=18");

 

   

 跨資源共享 CORS   定義了在必須訪問跨源資源時,瀏覽器與服務器如何溝通! 就是經過自定義的HTTP頭部信息讓瀏覽器和服務器進行決定是否請求成功或是響應成功

     IE對CORS的支持,IE8中引入了XDR對象*(XDomainRequest)類型,XDR與XHR的不一樣之處   XDR請求 :cookie 不會隨請求發送,也不會隨響應返回,只能設置請求頭的content-type字段,不能訪問響應頭部信息,只支持get和post請求

      xdr.open() 只接收兩個參數:請求類型和URL,全部的XDR請求都是異步的,不能建立同步請求,請求返回後,會觸發load事件,響應的數據也會保存在responseText屬性中

   其餘瀏覽器的支持,都是經過XHR對象進行跨域訪問,只要傳入絕對地址的URL便可; 其餘瀏覽器能夠訪問status和statusText屬性,而且支持同步請求,   也一樣存在一些限制

      不能使用setRequestHeader設置自定義頭部,不能接收和發送cookie,調用getAllResponseHeaders()方法會返回空字符串

 

其餘跨域技術 

   圖片img  利用img的src屬性進行頁面與服務器的單向通信,以下代碼所示,只要請求完成就能獲得通知!圖片Ping最經常使用於跟蹤用戶點擊頁面或者動態廣告曝光次數,缺點:第一隻能get請求  全部的src都是get請求,第二點沒法訪問服務器響應文本

var  img = new Image();
img.onload = img.onerror = function(){
    alert("done")
}
img.src = "https://www.zhihu.com/question/19618769";

 

 

   jsonp——由兩部分組成:回調函數和數據。回調函數是當響應回到頁面時要調用的函數(通常在請求中指定),而數據則是傳入回調函數中的json數據,  簡單來講就是預約義函數體和參數內容,當並不當即執行,由跨域請求後返回的js代碼和參數進行調用

優勢:可以直接訪問響應文本,支持瀏覽器服務器的雙向通信,而缺點則是若是其餘域返回惡意代碼,沒有辦法進行追究,其次要肯定jsonp的請求是否失敗並不肯定,不過HTML5中增長了script標籤的onerror事件處理程序用於處理script標籤的是否加載

function handleResponse(response){
    alert(response);
}     //handleResponse回調函數
var script  = document.createElement("script");
script.src = "xxx.jsp?callback=handleResponse";
document.body.insertBefore(script,document.body.firstChild);

 

 

 comet ——一種服務器向頁面推送數據的技術,長輪詢和流

  長輪詢: 頁面發起一個到服務器的請求,而後服務器一直保持鏈接打開,直到有數據發送,發送完畢後瀏覽器關閉鏈接,隨即又發起一個新的請求

  HTTP流: 瀏覽器向服務器發送一個請求,而服務器保持鏈接打開,而後週期性的向瀏覽器發送數據。

web sockets ——在一個單獨的持久鏈接上提供雙全工,雙向通信!在js中建立了web sockets 以後會有一個http請求發送到瀏覽器以發起鏈接,在得到服務器響應後,創建的鏈接會將http協議交換爲web socket協議 該協議以wss://開頭

//建立web socket 
 var socket = new WebSocket("xxx.jsp");
 socket.send("hello world");  //發送簡單數據
 var  message = {
     time : new Date(),
     text : "helo world !",
     id : 1
 };
 socket.send(JSON.stringify(message)); //發送複雜數據
 
 socket.onmessage = function(event){   //接收處理服務器返回的數據
     var data = event.data;
     //coding.....處理數據
 }

 

 web socket 對象的狀態  

      WebSocket.opening(0) : 正在創建鏈接

      WebSocket.open(1) :鏈接創建完成

      WebSocket.closeing(2) :正在關閉鏈接

       WebSocket.close(3) :已經關閉鏈接

WebSocket的其餘事件

    WebSocket.open : 在成功創建鏈接時觸發

     WebSocket.error:在發生錯誤時觸發,鏈接不能持續

    WebSocket.close: 在鏈接關閉時觸發(而且此事件附帶三個額外屬性)

 socket.close = function(event){
     console.log(event.wasClean);    //布爾值,表示鏈接是否已經明確關閉
     console.log(event.code);        //服務器返回的數值碼狀態,
     console.log(event.reason);        //字符串,包含服務器返回的消息
 }
相關文章
相關標籤/搜索