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
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...