在前端開發中,Ajax是非常常用的技術,用于實現異步數據交互,讓網站更加流暢、高效。而javascript作為前端的主要編程語言,Ajax也是由其來實現的。但是,隨著網站越來越復雜,Ajax調用也就越來越頻繁,為了方便調用和管理,我們可以考慮封裝Ajax函數。
以獲取天氣信息接口為例,在不封裝Ajax的情況下,我們會有如下代碼:
function getWeather(city){ var url = "http://api.weatherapi.com/v1/current.json?key=xxxxxx&q=" + city; var xhr = new XMLHttpRequest(); xhr.open("GET", url, true); xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ var response = JSON.parse(xhr.responseText); console.log(response.current); } } xhr.send(); } getWeather("Shenzhen");
以上代碼中,我們先定義了一個getWeather函數,它接收一個城市名的參數,然后拼接出查詢天氣的url,并用XMLHttpRequest對象發送請求。當請求狀態發生改變時,我們再去處理返回的數據。這種方式雖然能夠實現功能,但是每次調用都需要寫一大堆繁瑣的重復代碼,而且沒有統一管理。
因此,我們可以封裝Ajax函數來簡化代碼,并增加可讀性、可維護性。下面是一個比較基礎的封裝Ajax函數:
function ajax(url, method, data, success, error){ var xhr = new XMLHttpRequest(); xhr.open(method, url, true); xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ if(xhr.status == 200){ success(xhr.responseText); }else{ error(xhr.status); } } } if(method.toUpperCase() == "POST"){ xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); } xhr.send(data); }
對于上面的代碼,我們可以通過參數的方式來傳入url、請求方式、請求數據、成功回調、失敗回調。這樣不僅可以減少代碼冗余,而且還可以讓代碼更清晰易懂。比如下面這段調用代碼:
ajax("http://api.weatherapi.com/v1/current.json?key=xxxxxx&q=Shenzhen", "GET", null, function(response){ console.log(JSON.parse(response).current); }, function(status){ console.log("Error: " + status); });
以上代碼中,我們直接傳入了請求的url、請求方式、請求數據為null。然后在成功回調中,我們將返回的數據打印出來;在失敗回調中,我們打印出錯信息。
除了封裝基礎的Ajax函數之外,我們還可以根據實際需求進行更加復雜的封裝。比如,我們需要在每個Ajax請求中加上token頭信息,我們可以這樣:
function Ajax(){ this.token = "xxxx"; } Ajax.prototype.ajax = function(url, method, data, success, error){ var xhr = new XMLHttpRequest(); xhr.open(method, url, true); xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ if(xhr.status == 200){ success(xhr.responseText); }else{ error(xhr.status); } } } if(method.toUpperCase() == "POST"){ xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); } xhr.setRequestHeader("Authorization", "Bearer " + this.token); xhr.send(data); } var ajax = new Ajax(); ajax.ajax(url, method, data, success, error);
以上代碼中,我們使用了一個構造函數Ajax來定義一個token屬性,并使用原型鏈的方式將ajax方法添加到Ajax的原型中。而在ajax方法中,我們在請求頭中加入了Authorization頭信息,實現了全局加token頭信息的效果。
在封裝Ajax的過程中,我們需要結合實際需求進行靈活使用。將一些常用的代碼通過封裝,可以大大提高效率,同時也有利于代碼的整潔和可讀性。值得一提的是,目前市面上有許多優秀的Ajax庫,比如jQuery的$.ajax、axios、fetch等,也可以考慮使用它們來進行Ajax操作。