使用ajax技術發送請求代碼比較繁瑣,因此我們自己封裝了ajax函數

但是在jQuery這個庫中也封裝了ajax方法,而且jQuery封裝的方法要比我們自己封裝的方法功能上更加強大

一、 $.ajax()

作用:發送ajax請求

$.ajax({
     type: 'get',
     url: 'http://www.example.com',
     data: { name: 'zhangsan', age: '20' },
     contentType: 'application/x-www-form-urlencoded',
     beforeSend: function () { 
         return false
     },
     success: function (response) {},
     error: function (xhr) {}
});
{
     data: 'name=zhangsan&age=20'
 }
//data也可以寫成上面這種形式

contentType: 'application/json'

  

serialize方法

作用:將表單中的數據自動拼接成字符串類型的參數

var params = $('#form').serialize();
// name=zhangsan&age=30

 

二、發送jsonp請求

 jsonp請求就是屬於get請求

 

$.ajax({
    url:'',
    // 代表現在要發送的是jsonp請求
    dataType:'jsonp',
    // 修改callback參數名稱
    // 通過callback把函數名稱傳遞給服務器端,有些不使用callback,使用其他的簡寫比如:cb
jsonp:'cb',
    // 指定函數名稱
jsonCallback:'fnName',
    success:function(response){
        console.log(response);
    }
})

 

  • jsonp屬性的使用

一般情況下調用$.ajax(), 向服務器端傳遞函數名字的參數名稱,原來是callback,現在通過jsonp修改這個名字

 

// 客户端修改傳遞的函數的名字 
<button id="btn">發送請求</button>
    <!-- 沒有添加jsonp屬性之前發送的請求是 "./js/jquery.min.js?callback=XXX "-->
    <!-- 使用了jsonp屬性之後就可以寫成 "./js/jquery.min.js?cb=XXX" -->
    <script src="./js/jquery.min.js"></script>
    <script>
        $('#btn').on('click', function(){
            $.ajax({
                url:'/jsonp',
                // 向服務器端傳遞函數名字的參數名稱
                jsonp:'cb',
                // 代表現在是發送jsonp請求
                dataType:'jsonp',
                success:function(response){
                    console.log(response);
                    
                }
            })
        })
    </script>

 

// 服務器端修改
app.get('/jsonp', (req, res) => {
    // 接收客户端傳遞過來的函數名字
    const cb = req.query.cb;
    const data = cb+"({name:'zhaoliu'})";
    res.send(data);
})
  • jsonpCallback屬性的使用

正常情況下,請求發送成功之後,就會調用success函數,但是如果不想調用success函數,可以添加jsonpCallback屬性,屬性值是函數名稱,在發送請求之前定義好這個函數名稱的函數,但是一般情況下這個函數使用不上的,使用success就可以了

// response就是服務器端返回的數據形參
        function fn(response){
            console.log(response);
            
        }

        $('#btn').on('click', function(){
            $.ajax({
                url:'/jsonp',
                // 向服務器端傳遞函數名字的參數名稱,原來是callback,現在通過jsonp修改這個名字
                jsonp:'cb',
                // 請求發送之後如果不想調用success函數,就使用jsonpCallback屬性,數據返回之後就會調用這個函數
                jsonpCallback:'fn',
                // 代表現在是發送jsonp請求
                dataType:'jsonp',
                // success:function(response){
                //     console.log(response);
                    
                // }
            })
        })

 

serialize()和 new FormData()的區別

serialize()和FormData對象都可將表單數據序列化,後通過ajax異步提交 ,序列化表單就是將form表單中所有name屬性序列化成KEY-VALUE的形式,提交到後台,後台以對象相應的字段接收

1.serialize()

  serialize()是JQuery方法,必須依賴jQuery,可序列化表單值創建 URL 編碼文本字符串,就是將表單數據以字符串的形式返回,在ssm框架中可通過對象直接接收數據。

       缺點:只能序列化一般數據,文件上傳則無法序列化,不支持文件二進制流提交。

2.FormData對象

  FormData是HTML5對象,目前可兼容大多主流的瀏覽器,但不兼容低版本IE瀏覽器。

      與普通的Ajax相比,使用FormData 的最大優點就是可以異步上傳二進制文件。

  通過ajax異步提交表單數據,可實現文件上傳

 

來源: 

 


 

ajax和jsonp的區別

ajax是通過創建ajax對象發送請求的,ajax技術的原理是實例化xmlhttp對象,使用此對象與後台通信。ajax通信的過程不會影響後續javascript的執行,從而實現異步。

ajax請求的頁面或資源只能是同一個域下面的資源,不能是其他域的資源,這是在設計ajax時基於安全的考慮。

jsonp是通過創建script標籤來發送請求的,jsonp可以跨域請求數據,它的原理主要是利用了script標籤可以跨域鏈接資源的特性。


 

三、$.get()和$.post()

<button id="btn">發送請求</button>
    <script src="./js/jquery.min.js"></script>
    <script>
        $('#btn').on('click',function(){
            // 第一個參數是請求地址,
            // 第二個參數是一個對象,也可以是一個字符串,是向服務器端傳遞的請求參數,參數可選
            // 第三個參數是一個回調函數 其實就是success函數,請求成功後自動調用。函數的形參response就是服務器端返回的響應數據
            // $.get('/base', 'name=zhangsan&age=14', function(response){
            //     console.log(response);
                
            // })

            $.post('/base', function(response){
                console.log(response);
                
            })
        })
    </script>

四、jQuery中ajax全局事件

目的:當頁面中有ajax請求被髮送時,我們需要給用户一個等待的提示,提示用户當前請求正在操作的過程中,但是尤其當網速比較慢的時候,這個需求比較有用。

在ajax請求參數中加入beforeSend屬性可以解決這個問題,但是當頁面中請求比較多的時候,我們要在每一個ajax請求中都加入這個,代碼的重複率就比較高

ajax全局事件就可以解決這個問題

全局事件:只要頁面中有ajax請求被髮送,對應的全局事件就會被觸發

.ajaxStart() // 當請求開始發送時觸發
.ajaxComplete()  // 當請求完成時觸發

 

全局事件需要綁定在$(document )身上

 

// 當頁面中有ajax請求發送時觸發
$(document).on('ajaxStart',function() {
    console.log('start');
})

// 當頁面中有ajax請求完成時觸發
$(document).on('ajaxStart',function() {
    console.log('complete');
})

 

 

NProgress進度條插件的使用

1. 引入相關文件

<link rel="stylesheet" href="js/nprogress/nprogress.css">

<script src="/js/nprogress/nprogress.js"></script>

 

2.

// 當頁面中有ajax請求發送時觸發
$(document).on('ajaxStart',function() {
    NProgress.start();   // 進度條開始運動             
})

// 當頁面中有ajax請求完成時觸發
$(document).on('ajaxComplete',function() {
    NProgress.done();  // 進度條結束運動
})

 

 

五、RESTful 風格的API




<body>
    <script src="./js/jquery.min.js"></script>
    <script type="text/javascript">
        // 獲取用户列表信息
        $.ajax({
            type:'get',
            url:'/users',
            success:function(response){
                console.log(response);
                
            }
        })

        // 獲取id為1的用户信息
        $.ajax({
            type:'get',
            url:'/users/1',
            success:function(response){
                console.log(response);
                
            }
        })

        //刪除id為1的信息
        $.ajax({
            type:'delete',
            url:'/users/1',
            success:function(response){
                console.log(response);
                
            }
        })

        // 修改
        $.ajax({
            type:'put',
            url:'/users/10',
            success:function(response){
                console.log(response);
                
            }
        })
    </script>
</body>

 

 

六、XML基礎

XML:全稱是extensible markup language,代表可擴展標記語言,它的作用是傳輸和存儲數據

XML所有的標籤都是開發者定義的,他用來存儲和傳輸數據,關注於數據的內容

而HTML標籤是有預定義的,它的用來展示數據的,關注於數據的外觀

 

XML DOM:XML文檔對象模型,是w3c組織定義的一套操作XML文檔對象的api。瀏覽器會把XML文檔解析成文檔對象模型

 

如何把服務器端返回的XML類型的數據展示到HTML頁面中?

<button id="btn">發送請求</button>
    <div id="container"></div>
    <script type="text/javascript">
        var btn = document.getElementById('btn');
        var container = document.getElementById('container');

        btn.onclick = function(){
            var xhr = new XMLHttpRequest();
            xhr.open('get','/xml');
            xhr.send();
            xhr.onload = function(){
                // xhr.responseXML 獲取服務器段返回的xml數據
                var xmlDocument = xhr.responseXML;
                var title = xmlDocument.getElementsByTagName('title')[0].innerHTML;
                container.innerHTML = title;
            }
        }
    </script>

 

通過 xhr.responseXML 獲取服務器段返回的xml類型的數據

將該值賦值給信息的變量,新變量就可以像HTML一樣,下面也有很多 getElementsByTagName、getElementsById等等這樣的方法屬性