JavaScript之JSON&AJAX

来源:https://www.cnblogs.com/ruhaoren/archive/2019/09/19/11543355.html
-Advertisement-
Play Games

今天為大家講解JavaScript中的數據傳輸形式JSON和AJAX技術。同時,這也是JavaScript系列的最後一篇。 一 JSON JSON的全稱是JavaScript Object Notation(js對象表示法),它是一種存儲和交換文本信息的語法,主要用於序列化對象、數組、字元串、Boo ...


  今天為大家講解JavaScript中的數據傳輸形式JSON和AJAX技術。同時,這也是JavaScript系列的最後一篇。

 

一   JSON

  JSON的全稱是JavaScript Object Notation(js對象表示法),它是一種存儲和交換文本信息的語法,主要用於序列化對象、數組、字元串、Boolean、數字和null。JSON以純文本形式存儲數據。

  1,  JSON語法和數據類型

  JSON可以支持以下六種數據類型:對象、數組、字元串、Boolean、數字和null。

  JSON採用JavaScript語法,所以JSON表示數組,對象等和JavaScript完全一樣。大括弧保存對象,方括弧保存數組。

  唯一的區別是JSON只支持雙引號,所以在JSON文件中表示字元串必須使用雙引號,並且對象的鍵也需要用雙引號包裹。

  JSON文件的尾碼名是.json。

  2,  JSON對象的方法

  在JavaScript中,你可以給JSON對象外添加一對單引號,以字元串形式來表示JSON對象。

  JSON.parse方法:將JSON數據轉化為JavaScript對象。

1 var myJson = '{"name" : "ren","age" : 12}';
2 var myObj = JSON.parse(myJson);
3 console.log(myObj);//{name:"ren",age:12}

  JSON.stringify方法:將JavaScript對象轉換成JSON字元串。

1 var myObj = {
2     name:'ren',
3     age:12
4 };
5 var myJson = JSON.stringify(myObj);
6 console.log(myJson);//"{"name":"ren","age":12}"

  註意:如果伺服器返回的是字元串類型數據,JavaScript可以用一個變數接受它,並且能直接使用它。如果伺服器返回的是JSON類型數據,請務必使用parse方法把它轉換成JavaScript標準對象再對其進行操作。當然,要向伺服器發送JSON數據,也應該使用stringify方法把JavaScript對象轉換成JSON字元串再發送。

 

二   AJAX

  1,  簡介

  AJAX的全稱是Asynchronous JavaScript And XML(非同步javascript和XML)。

  AJAX通過XMLHttpRequest對象與伺服器進行通信。它可以發送和接受各種數據,包括文本文件,XML,HTML,JSON。當然這都不是它最吸引人的地方,AJAX迷人的地方在於它可以是非同步的,這意味著它可以在不刷新頁面的的情況下向伺服器發送請求,並接受和處理伺服器返回的信息,從而使我們能夠在不刷新頁面的情況下使用伺服器上的數據修改當前頁面。

  2,  使用

  第一步,我們應該先創建一個XMLHttpRequest對象。通過這個對象我們便有了與伺服器通信的條件。

1 var httpRequest = new XMLHttpRequest();

  註意,在老版本的IE瀏覽器(IE6及之前)起中,應該使用ActiveXObject創建。 

1 var httpRequest = new ActiveXObject('Microsoft.XMLHTTP');

  第二步,在發送請求之前我們應該先定義好與伺服器通信的方式並建立連接。  

1 httpRequest.open(method,url,async);

         method表示請求類型:get,post,head。

         get和post方式在傳輸上沒有本質的區別,但在實際使用中有以下幾點差異:

      a)       get主要用戶從伺服器獲取數據,post具備往伺服器發送數據的能力,get方式的請求數據會在url中顯示,而post不會,所以說post方式有潛在的危險,而get方式相對安全。

      b)       get方式的數據能被緩存,能被保留在BOM對象history中,能添加頁面標簽。而post方式不行。

      c)       get方式只允許發送ASCII字元,而post無限制。由於url長度的限制,get方式限制位元組長度2048而post方式無限制。

    不知道大家是否還記得前面的《JavaScript之本地數據存儲》,裡面在講解location.hash時提到url的長度是由瀏覽器或伺服器限制的,而不是javascript語言或通信協議本身限制的。忘記的朋友可以再回去看一下。

          head和get方式差不多,唯一的區別是head只包含http報文的頭信息,而不會有實際內容。常用來檢測伺服器上是否已經存在某些數據了。

          url是請求的伺服器地址,逆序遵守同源策略。

          async是一個布爾值,true表示非同步,false表示同步(別用這個)

  由於瀏覽器一般會先從緩存中讀取數據,所以我們在使用get方式發送請求時,可以添加一個唯一ID讓我們每次都直接從伺服器獲取數據:

1 httpRequest.open('get','url?=' + new Date().getTime());//時間戳
2 httpRequest.open('get','url?=' + Math.random());//隨機數

  請註意,如果您想要post數據,則可能必須設置請求的MIME類型。比如,你想要向表單一樣post數據,那麼你必須在open和send方法之間調用setRequestHeader方法(該方法用於設置請求的http頭信息,兩個參數,第一個屬性名,第二個屬性值):

1 httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');//第二點五步

  關於http請求頭信息,請看這裡:https://baike.baidu.com/item/http請求頭

  第三步,發送請求。

1 httpRequest.send();

  如果在open中你選擇了post方式,那麼你可以在send方法中添加你想要向伺服器發送的數據,否則即使添加了數據也無效。

1 httpRequest.send('{name:"ren",age:12}');

  第四步,數據處理。

  XMLHttpRequest對象有一個事件屬性:onreadystatechange。你可以給該屬性添加一個函數引用或一個匿名函數,用以處理從伺服器返回的信息。

1 httpRequest.onreadystatechange = function (){};

  另外XMLHttpRequest對象還有兩個存儲通信狀態的屬性:readyState和status(每當readyState的值改變時,都會觸發上面的onreadystatechange事件),和兩個存儲接收內容的屬性:responseText,responseXML。

         readyState表示請求狀態:

                   0:請求未初始化,還沒有調用open();

                   1:已與伺服器建立連接,剛調用了send();

                   2:http請求已發送,send()執行完畢;

                   3:http請求處理中,伺服器正在解析請求的內容;

                   4:請求已完成,內容解析完畢,響應已準備就緒。

         status表示響應狀態,返回http狀態碼:

                   200:成功接受到伺服器返回內容;

                   404:伺服器未找到相關內容;

                   503:伺服器不可用。

         responseText:解析為字元串類型的響應。

         responseXML:解析為DOM對象類型的響應

我們要想使用伺服器返回的信息,需要先確保正確的拿到了這些信息,所以事件處理函數內部應該有檢測機制:

1 if(httpRequest.readyState == 4 && httpRequest.Status == 200){
2     fnSuc(responseText);
3 }else{
4     if(fnFail){
5         fnFail();
6     }
7 }

         並且,可以把相應的伺服器響應信息當做參數傳遞進去。

  最後附上完整的ajax函數封裝:

 1 function ajax(method,url,Fnsucc,Fnfail){
 2     var httpRequest = new XMLHttpRequest() || new ActiveXObject('Microsoft.XMLHTTP');
 3     httpRequest.open(method,url,true);
 4     httpRequest.send();
 5     httpRequest.onreadystatechange = function (){
 6         if(httpRequest.readyState == 4){
 7           if(httpRequest.status == 200){
 8             FnSuc(httpRequest.responseText);//處理完成後的文件內容。
 9           }else{
10             if(FnFail){
11               FnFail(httpRequest.status);//根據http錯誤狀態碼,進行相應處理。
12                 }    
13             }
14         }
15     }
16 }

 

  建議學習時間一天。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 此頁面效果以Angular實現,Vue也可按照其大致流程實現,其核心本質沒有改變。 功能效果為:頁面初始化效果為要有所有角色的覆選框,要求初始化預設勾選的角色要顯示勾選,之後,能按照最終勾選的狀態提交發請求。 先查看效果:可以看到初始頁面的此用戶被賦予的角色只有一個“核算經辦”,如圖1紅框所示,點擊 ...
  • console.log(a); //undefined console.log(show); //函數的定義 show(); //aaa123 var a = 1; function show(){ console.log("aaa123"); } console.log(a); //1 conso ...
  • input標簽類型:button是一個沒有任何功能的按鈕,需要用javascript加上動作才可以使用。功能簡單,比起<button></button>是一個功能強大的按鈕,更美觀。 <input type="button" /> input標簽類型:checkbox是多選框 用label綁定inp ...
  • 事情的起因是在b站投稿了一個高級彈幕測試的視頻(av9940487),但是由於b站的彈幕池機制是新的彈幕頂掉舊的彈幕,所以導致一些人發的高級彈幕很快就被頂掉了。 所以就想著寫個腳本來自動刪除屬性為普通的彈幕,語言用的是javascript,在chrome的控制台就可以執行這個腳本。 1.刪除彈幕的流 ...
  • 首先用vue-cli創建前端項目 參考:https://www.cnblogs.com/ouyangkai/p/11549290.html 新建play.vue文件 編寫play組件 <template> <div> <el-row> <el-col :span="4"> <el-popover p ...
  • 1全局安裝vue-cli 2創建項目框架 3依次按照提示輸入,項目名、項目描述、項目作者等等, 4.進入vueapi目錄 5.安裝element-ui 因為是基於Vue.js和elementUI進行的項目開發,所以當然要導入Vue.j包和elementUI包: 6.安裝vue-router 要進行頁 ...
  • 技術棧 服務端: koa、koa-route、koa-websocket、request。 客戶端: html、css、js、websocket。 遠程聊天API: http://api.qingyunke.com/api.php?key=free&appid=0&msg=msg。 客戶端展示 開發 ...
  • 0919自我總結 常見的滑鼠hover效果 展示效果:http://ianlunn.github.io/Hover/ 部分動畫製作 使用 拿 為例子 導入上述的方法 全是再樣式中操作 配置方法 參考文檔'https://www.w3school.com.cn/cssref/index.asp ani ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...