AJAX優勢、跨域方案及JSON數據格式和瀏覽器中JSON對象

来源:https://www.cnblogs.com/chenyingying0/archive/2020/02/18/12327717.html
-Advertisement-
Play Games

ajax 不重新載入整個網頁的情況下,更新部分網頁的技術 註意:ajax只有在伺服器上運行才能生效,我在本地一般用phpstudy 優點: 1、優化用戶體驗 2、承擔了一部分本該伺服器端的工作,減輕了伺服器端的壓力 3、優化了伺服器端和瀏覽器端的傳輸,減少了帶寬占用 缺點: 1、不支持回退按鈕 2、 ...


ajax 不重新載入整個網頁的情況下,更新部分網頁的技術

註意:ajax只有在伺服器上運行才能生效,我在本地一般用phpstudy

優點:

1、優化用戶體驗

2、承擔了一部分本該伺服器端的工作,減輕了伺服器端的壓力

3、優化了伺服器端和瀏覽器端的傳輸,減少了帶寬占用

缺點:

1、不支持回退按鈕

2、對搜索引擎的支持比較弱

3、安全問題,暴露了與伺服器端交互的細節


 

XMLHttpRequest 對象

1、可以向伺服器端發起請求並處理響應,而不阻塞用戶

2、可以在不更新整個網頁的的情況下,更新部分內容

如何使用ajax

1、創建XMLHttpRequest 對象

2、創建一個HTTP請求,並指定方式、URL(必填)

3、設置響應HTTP請求狀態變化的函數

4、發起請求


 

創建XMLHttpRequest 對象的兩種方式:(相容各瀏覽器)

1、完整版

        //封裝相容各瀏覽器的xhr對象
        function createXhr(){
            //IE7+,其他瀏覽器
            if(typeof XMLHttpRequest!="undefined"){
                return new XMLHttpRequest();//返回xhr對象的實例
            }else if(typeof ActiveXObject!="undefined"){
                //IE7及以下
                //所有可能出現的ActiveXObject版本
                var arr=["Microsoft.XMLHTTP","MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP.2.0"];
                var xhr;
                //迴圈
                for(var i=0,len=arr.length;i<len;i++){
                    try{
                        xhr=new ActiveXObject(arr[i]);//任意一個版本支持,即可退出迴圈
                        break;
                    }catch(e){

                    }
                }
                return xhr;//返回創建的ActiveXObject對象
            }else{
                //都不支持
                throw new Error("您的瀏覽器不支持XHR對象!");
            }
        }

 

2、簡略版

        function createXhr(){
            //IE7+,其他瀏覽器
            if(window.XMLHttpRequest){
                return new XMLHttpRequest();
            }else{
                //IE7以下
                return new ActiveXObject("Microsoft.XMLHTTP");
            }
        }

測試是否創建成功

        //創建XMLHttpRequest對象
        var xhr=createXhr();
        console.log(xhr);

 

 .open(method, url, async) 初始化請求並準備發送(只能對同一個域中使用相同埠和協議的URL發送請求)

method :get 或者 post( get 更快更簡單,但不能發送大量數據,無法使用緩存文件,而且沒有 post 穩定和可靠)

url :必填(文件在伺服器上的位置,可以是任何類型,如.txt  .xml  .asp  .php)

async:是否非同步,true 非同步,false 同步(同步時,伺服器處理完成之間瀏覽器必須等待;非同步時,伺服器未處理完成前,瀏覽器可以進行其他操作)

get 準備請求直接加上參數,post 準備請求不在此加參數

        //2、get創建請求
        xhr.open("get","./server/slider.json?user=cyy&age=25",true);
        //post創建請求
        xhr.open("post","./server/slider.json",true);

響應XMLHttpRequest 對象狀態變化的函數

.onreadystatechange  檢測狀態變化的函數

.readyState==4  響應內容解析完成

.status>=2==&&.status<300 非同步調用成功

.status==304 請求資源沒有被修改,可以使用瀏覽器的緩存


 

發送請求.send()

發送post請求需要傳入參數(以對象形式),發送get請求不需要,可以傳入null

post請求需要添加HTTP頭

.setRequestHeader("Content-type", "application/x-www-form-urlencoded")

        //get發送請求
        xhr.send(null);
        
        //post發送請求
        xhr.send({user:"cyy",age:25});
        //設置post請求頭
        xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");

獲取到伺服器返回的數據

responseText 伺服器返回的數據的字元串形式

responseXML 伺服器返回的數據的相容DOM的文檔數據對象(XML形式)

status 返回的狀態碼(如404表示沒找到,200表示已就緒)

status Text 狀態碼的字元串信息

//獲取伺服器端返回的數據
                    console.log(xhr.responseText);

 

 查看network狀態

 

 json 數據格式

全稱是javascript對象表示法,目的是為了取代笨重的XML格式

json 可以表示以下三種類型的值:

1、簡單值

與js語法相同,可以是字元串、數值、布爾值、null,但不支持undefined

字元串必須用雙引號表示,不能用單引號

數值必須是十進位,不能是 NaN 和 Infinity

2、對象

鍵名必須放在雙引號中

同一個對象不應該出現兩個同名屬性

3、數組

數組或者對象最後一個成員,後面不能加逗號

示例:slider.json

{
  "code": 0,
  "slider": [
    {
      "linkUrl": "http://www.baidu.com",
      "picUrl": "img/cat1.jpg"
    },
    {
      "linkUrl": "http://www.baidu.com",
      "picUrl": "img/cat2.jpg"
    },
    {
      "linkUrl": "http://www.baidu.com",
      "picUrl": "img/cat3.jpg"
    },
    {
      "linkUrl": "http://www.baidu.com",
      "picUrl": "img/cat4.jpg"
    }
  ]
}

 

.responseText 返回的數據是字元串,因此需要先轉為對象

使用.eval() 函數

//獲取伺服器端返回的數據
console.log(typeof xhr.responseText);//string
//把字元串轉為對象
console.log(eval("("+xhr.responseText+")"));

eval("("+xhr.responseText+")"); 的意思是強制轉化成json對象,之所以寫成 eval“("("+data+")");這種格式,原因是由於json是以”{}”的方式來開始以及結束的。在JavaScript中,它會被當成一個語句塊來處理,所以必須強制性的將它轉換成一種表達式,加上圓括弧的目的是迫使eval函數在處理JavaScript代碼的時候強制將括弧內的表達式轉化為對象,而不是作為語句來執行,舉一個例子,例如對象字面量{},如若不加外層的括弧,那麼eval會將大括弧識別為JavaScript代碼塊的開始和結束標記,那麼{}將會被認為是執行了一句空語句,所以下麵兩個執行結果是不同的:

 console.log(eval("{}"));//undefined
 console.log(eval("({})"));//{}

還有 json 對象的兩個方法:

1、 JSON.parse()  用於將json字元串轉為對象

2、JSON.stringify  將一個值轉為JSON字元串

由於eval() 可以執行不符合json格式的代碼,有可能會包含惡意代碼,所以不推薦使用,建議還是使用.parse()

data=JSON.parse(xhr.responseText);
console.log(data.slider);

最後一步,渲染數據到頁面中

放出文件index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>demo</title>
    <style>
        *{margin:0;padding:0;}
        .wrap{width:250px;height:250px;margin:50px auto;overflow:hidden;}
        .banner{height:250px;width:1000px;}
        .banner a{width:250px;height:250px;display: block;float: left;}
        .banner a img{width:250px;height:250px;display: block;}
    </style>
    <script src="jquery.js"></script>

</head>
<body>
    <div class="wrap">
        <div class="banner" id="banner"></div>
    </div>
    <script>
        //封裝相容各瀏覽器的xhr對象
        function createXhr(){
            //IE7+,其他瀏覽器
            if(typeof XMLHttpRequest!="undefined"){
                return new XMLHttpRequest();//返回xhr對象的實例
            }else if(typeof ActiveXObject!="undefined"){
                //IE7及以下
                //所有可能出現的ActiveXObject版本
                var arr=["Microsoft.XMLHTTP","MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP.2.0"];
                var xhr;
                //迴圈
                for(var i=0,len=arr.length;i<len;i++){
                    try{
                        xhr=new ActiveXObject(arr[i]);//任意一個版本支持,即可退出迴圈
                        break;
                    }catch(e){

                    }
                }
                return xhr;//返回創建的ActiveXObject對象
            }else{
                //都不支持
                throw new Error("您的瀏覽器不支持XHR對象!");
            }
        }

        //1、創建XMLHttpRequest對象
        var xhr=createXhr(),data;

        //響應XMLHttpRequest狀態變化的函數
        //onreadystatechange監測狀態變化
        xhr.onreadystatechange=function(){
            if(xhr.readyState==4){//響應內容解析完成
                if((xhr.status>=200&&xhr.status<300)||xhr.status==304){
                    //xhr.status>=200&&xhr.status<300 表示交易成功
                    //xhr.status==304 表示緩存後未發生改變,因此可以從緩存中讀取
                    //獲取伺服器端返回的數據
                    //console.log(typeof xhr.responseText);//string
                    //把字元串轉為對象
                    data=JSON.parse(xhr.responseText);
                    //console.log(data.slider);
                    //渲染數據
                    renderData();
                    
                }
            }
        }
        //2、get創建請求
        xhr.open("get","./server/slider.json?user=cyy&age=25",true);
        //get發送請求
        xhr.send(null);

        //post創建請求
        //xhr.open("post","./server/slider.json",true);
        //post發送請求
        //xhr.send({user:"cyy",age:25});
        //設置post請求頭
        //xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        
        //渲染數據
        function renderData(){
            var imgs=data.slider,str="";
            var banner=document.getElementById("banner");
            for(var i=0,len=imgs.length;i<len;i++){
                //console.log(imgs[i]);
                str+="<a href='"+imgs[i].linkUrl+"'><img src='"+imgs[i].picUrl+"'></a>";
            }
            console.log(str);
            banner.innerHTML=str;
        }
    </script>
</body>
</html>

效果圖(大概就是模擬獲取輪播圖)

 

 jquery的ajax方法:

$.ajax()

$.get()

$.post()

$.getJson()

        //jquery的$.ajax()
        $.ajax({
            url:"./server/slider.json",  //請求地址
            type:"post",  //請求方式,預設是get
            async:true,  //非同步同步,預設是true非同步
            dataType:"json",  //返回的數據格式
            success:function(data){  //響應成功的操作
                JQRenderData(data.slider); //data是返回的數據
            }
        });
        function JQRenderData(data){
            var str="";
            $.each(data,function(index,obj){
                str+="<a href='"+obj.linkUrl+"'><img src='"+obj.picUrl+"'></a>";
            });
            $("#banner2").html(str);
        }

$.each( obj, function(index, value){ } ) 方法,遍歷對象或數組

index 數組索引或者對象屬性名

value 數組項或者對象屬性值

以下是用javascript 和 jqeury 兩種方式實現的代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>demo</title>
    <style>
        *{margin:0;padding:0;}
        .wrap{width:250px;height:250px;margin:50px auto;overflow:hidden;}
        .banner{height:250px;width:1000px;}
        .banner a{width:250px;height:250px;display: block;float: left;}
        .banner a img{width:250px;height:250px;display: block;}
    </style>
    <script src="jquery.js"></script>

</head>
<body>
    <div class="wrap">
        <div class="banner" id="banner"></div>        
    </div>
    <div class="wrap">
        <div class="banner" id="banner2"></div>        
    </div>
    <script>
        //封裝相容各瀏覽器的xhr對象
        function createXhr(){
            //IE7+,其他瀏覽器
            if(typeof XMLHttpRequest!="undefined"){
                return new XMLHttpRequest();//返回xhr對象的實例
            }else if(typeof ActiveXObject!="undefined"){
                //IE7及以下
                //所有可能出現的ActiveXObject版本
                var arr=["Microsoft.XMLHTTP","MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP.2.0"];
                var xhr;
                //迴圈
                for(var i=0,len=arr.length;i<len;i++){
                    try{
                        xhr=new ActiveXObject(arr[i]);//任意一個版本支持,即可退出迴圈
                        break;
                    }catch(e){

                    }
                }
                return xhr;//返回創建的ActiveXObject對象
            }else{
                //都不支持
                throw new Error("您的瀏覽器不支持XHR對象!");
            }
        }

        //1、創建XMLHttpRequest對象
        var xhr=createXhr(),data;

        //響應XMLHttpRequest狀態變化的函數
        //onreadystatechange監測狀態變化
        xhr.onreadystatechange=function(){
            if(xhr.readyState==4){//響應內容解析完成
                if((xhr.status>=200&&xhr.status<300)||xhr.status==304){
                    //xhr.status>=200&&xhr.status<300 表示交易成功
                    //xhr.status==304 表示緩存後未發生改變,因此可以從緩存中讀取
                    //獲取伺服器端返回的數據
                    //console.log(typeof xhr.responseText);//string
                    //把字元串轉為對象
                    data=JSON.parse(xhr.responseText);
                    //console.log(data.slider);
                    //渲染數據
                    renderData();
                    
                }
            }
        }
        //2、get創建請求
        xhr.open("get","./server/slider.json?user=cyy&age=25",true);
        //get發送請求
        xhr.send(null);

        //post創建請求
        //xhr.open("post","./server/slider.json",true);
        //post發送請求
        //xhr.send({user:"cyy",age:25});
        //設置post請求頭
        //xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        
        //渲染數據
        function renderData(){
            var imgs=data.slider,str="";
            var banner	   

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

-Advertisement-
Play Games
更多相關文章
  • 介紹馬蜂窩如何通過 App 地理相冊空間索引的應用,為用戶提供直觀、好用的圖片分享服務。 ...
  • 首先我們看ListView實現之後的的效果,如下圖所示: 現在我們來看看如何來實現這個可以進行上下活動的ListView: 首先是主界面Activity_Main.xml的代碼: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a ...
  • css3和css有什麼區別?首先css33是css(層疊樣式表)技術的升級版本,而css是一種用來表現HTML(標準通用標記語言的一個應用)或XML(標準通用標記語言的一個子集)等文件樣式的電腦語言。然後是內容上css3主要包括盒子模型、列表模塊、超鏈接方式、語言模塊、背景和邊框、文字特效、多欄布... ...
  • ajax實例,檢測用戶與註冊 檢測用戶名是否被占用: 在用戶填寫完用戶名之後,ajax會非同步向伺服器發送請求,判斷用戶名是否存在 首先寫好靜態頁面: index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> < ...
  • 模板字元串:我理解為將字元串格式化、模板化,將字元串加強處理,此處的模板有動詞的意思。 字元串模板基本格式: `xxxxxx`(前後都用反引號【tab鍵上面按鍵】引起來)。除了作為普通字元串 外;還可以用來定義多行字元串;也可以在字元串中加入變數和表達式,進行字元串內容擴充和計算。 1、普通字元串: ...
  • 前言 一直身在武漢,基於眾所周知的疫情原因,這個春節只能宅著。 不過其實這個春節是這些年來過得最爽的一個了。 沒有鞭炮,不用四處跑,安安心心呆在家裡玩玩游戲看看書寫寫代碼,其實日子過得還是挺悠閑的。 廢話少說,這段時間買了《古劍奇譚3》,全成就拿齊了之後,就抽了點時間來分享在玩游戲的過程中自製的一個 ...
  • 解構賦值概述 1、解構賦值是對賦值運算符的擴展。 2、它是一種針對數組或者對象進行模式匹配,然後對其中的變數進行賦值。 3、代碼書寫上顯得簡潔且易讀,語義更加清晰明瞭;而且還方便獲取複雜對象中的數據欄位。 解構模型 在解構賦值操作過程中,有下麵兩部分參與: 1、解構的源:解構賦值表達式的右邊部分。如 ...
  • [TOC] 1.vue框架使用註意事項和經驗 本文主要總結了在開發vue項目中的一些實踐經驗和踩過的一些坑,後續會接著更新,便於後期復盤,希望也對你有所幫助 1.1 解決Vue動態路由參數變化,頁面數據不更新 問題描述: 遇到動態路由如:/page/:id 從/page/1 切換到 /page/2 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...