91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ajax函數封裝的基本實現方法

發布時間:2020-09-21 09:17:15 來源:億速云 閱讀:204 作者:小新 欄目:web開發

這篇文章主要介紹ajax函數封裝的基本實現方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

前言

前面一篇文章講了ajax的原理,作用和實現。但是都只是實現一個ajax請求響應操作,瀏覽器和服務器之間請求響應不會只有一次,加入請求響應100次,那么要寫100次近似的代碼嗎?

這篇文章就是解決如何發送多個ajax的問題。如果你對ajax沒有了解,我的上一篇文章《認識ajax》用心看完,大約5分鐘就可以get到這篇文章內容。

這篇文章其實就是講了一個函數。接下來一起來看看吧。

封裝的思想

發送多個請求的操作都是相同的,如果寫多個就會有重復的代碼。避免代碼冗余就可以借助函數的思想,將ajax操作的代碼封裝到一個函數中,不同的請求函數傳遞的參數所有不同。如果要多次發送ajax請求的時候,就調用我們封裝好的函數就好了。

ajax函數封裝的基本實現

前面說用函數封裝ajax,那么ajax實現的四步放到函數中,然后調用這個函數,因為傳遞的參數比較多,所以參數用一個對象options來表示。這個對象里面包括請求方式,請求地址,請求發送成功后觸發的請求處理函數。

我么看看下面的例子。代碼中將ajax操作封裝到ajax函數中,調用ajax函數,傳入參數,xht下的onload事件觸發后,調用了sunccess函數,將相應內容xhr.responsetext打印到控制臺中。

function ajax(options) {
    var xhr = new XMLHttpRequest();
    xhr.open(options.type, options.url);
    xhr.send();
    xhr.onload = function () {
        options.success(xhr.responsetext);
    }
}
ajax({ 
     type: 'get',
     url: 'http://www.example.com',
     success: function (data) { 
         console.log(data);
     }
 })復制代碼

請求參數的封裝

上面代碼實現了基本的封裝,接下來講一講如何對請求參數進行封裝,上一篇文章中介紹了post方法和get方法這兩種方法發送請求,不同的請求方式請求參數也是放置在不同的位置的,比如get方法拼接在url后,post方法放在send方法里面。我們在ajax方法的實參對象中加一個data屬性,data屬性值就是請求參數。

在ajax這個函數中利用for-in循環拼接請求參數,將請求參數多余的的&去掉。后然對請求類型做出判斷,如果是get請求就把剛剛拼接好的params拼接到url后面;如果是post請求將參數放到send方法中,并使用xhr對象下的setRequestHeader方法設置請求參數格式的類型。

代碼如下:

	var xhr = new XMLHttpRequest();
	// 拼接請求參數的變量
	var params = '';
	// 循環用戶傳遞進來的對象格式參數	for (var attr in options.data) {
		// 將參數轉換為字符串格式
		params += attr + '=' + options.data[attr] + '&';
	}
	// 將參數最后面的&截取掉 
	// 將截取的結果重新賦值給params變量
	params = params.substr(0, params.length - 1);

	// 判斷請求方式	if (options.type == 'get') {
		options.url = options.url + '?' + params;
	}


	// 配置ajax對象
	xhr.open(options.type,options.url);
	// 如果請求方式為post	if (options.type == 'post') {
		// 設置請求參數格式的類型
		xhr.setRequestHeader('Content-Type', contentType);
    	// 向服務器端傳遞請求參數
		xhr.send(params);
		
	}else {
		// 發送請求
		xhr.send();
	}
        xhr.onload = function () {
        options.success(xhr.responsetext);
        }
        
  ajax({ 
     type: 'get',
     url: 'http://www.example.com',
     data: {
         name:'linglong',
         age:20
     },
     success: function (data) { 
         console.log(data);
     }
 })復制代碼

封裝終極版

進過前面兩個熱身后直接看ajax封裝的最后版本。 終極版封裝解決了以下幾個問題。

  • 服務器返回數據格式的處理
  • 瀏覽器請求參數格式的處理
  • 狀態碼不是200調用失敗函數
  • 設置默認參數減少冗余

這是終極版的代碼,代碼后面會有針對性的解釋。

分析終極版代碼:

設置默認參數減少冗余

  1. 在ajax函數中設置defaults參數對象。為什么在調用ajax函數的時候傳入了參數還要再在函數里添加默認參數呢,說到底也是為了避免代碼冗余,如果創建多個ajax對象的話就會傳入可能會相同的參數,我們只在調用的時候傳入特定的參數options,讓options覆蓋默認參數defaults。在函數內部使用defaults就可以完美的解決這個問題。Object.assign(defaults, options)方就是讓defaults覆蓋options。
	var defaults = {			type: 'get',
			url: '',
			data: {},
			header: {				'Content-Type': 'application/x-www-form-urlencoded'
				},
			success: function () {},
			error: function () {}
		};
		// 使用options對象中的屬性覆蓋defaults對象中的屬性
		Object.assign(defaults, options);復制代碼
Object.assign方法

補充:Object.assign方法

這里舉個代碼,夠應付這篇文章,具體深入的還是看官方文檔

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };

const returnedTarget = Object.assign(target, source);

console.log(target);
// expected output: Object { a: 1, b: 4, c: 5 }

console.log(returnedTarget);
// expected output: Object { a: 1, b: 4, c: 5 }復制代碼

創建ajax對象,拼接請求參數

		// 創建ajax對象
		var xhr = new XMLHttpRequest();
		// 拼接請求參數的變量
		var params = '';
		// 循環用戶傳遞進來的對象格式參數		for (var attr in defaults.data) {
				// 將參數轉換為字符串格式
				params += attr + '=' + defaults.data[attr] + '&';
			}
		// 將參數最后面的&截取掉 
		// 將截取的結果重新賦值給params變量
		params = params.substr(0, params.length - 1);復制代碼

瀏覽器請求參數格式的處理

  1. 判斷請求方式是get合適post。如果是get就將請求參數拼接到請求地址后面,再配置ajax對象,用send方法發送請求;如果是post就先配置ajax對象,然后判斷請求參數的數據類型,如果是json類型就把數據類型轉換成字符串處理,如果是application/x-www-form-urlencoded就直用send方法向服務器傳遞普通請求參數發送請求。
		if (defaults.type == 'get') {
				defaults.url = defaults.url + '?' + params;
			}
		// 配置ajax對象
		xhr.open(defaults.type, defaults.url);
		// 如果請求方式為post		if (defaults.type == 'post') {
				// 用戶希望的向服務器端傳遞的請求參數的類型
				var contentType = defaults.header['Content-Type']
				// 設置請求參數格式的類型
				xhr.setRequestHeader('Content-Type', contentType);
				// 判斷用戶希望的請求參數格式的類型
				// 如果類型為json				if (contentType == 'application/json') {
					// 向服務器端傳遞json數據格式的參數
					xhr.send(JSON.stringify(defaults.data))
				}else {
					// 向服務器端傳遞普通類型的請求參數
					xhr.send(params);
				}

			}else {
			// 發送請求
			xhr.send();
		}復制代碼

服務器返回數據格式的處理

4.當請求發送成功,就會觸發onload事件,執行函數。我們要對服務器響應的數據進行格式判斷,用getResponseHeader方法獲取響應頭的數據,Content-Type是響應頭的屬性名稱。如果響應頭中包含application/json這個字符,就說明響應的是json對象,但是傳輸的時候是字符串形式傳輸,所以用json下的parse方法轉字符串為對象。 如果http的狀態碼是200就說明客戶端發來的請求在服務器端得到了正確的處理。調用success函數,否則調用錯伏處理函數。

		xhr.onload = function () {
			// xhr.getResponseHeader()
			// 獲取響應頭中的數據
			var contentType = xhr.getResponseHeader('Content-Type');
			// 服務器端返回的數據
			var responseText = xhr.responseText;
			// 如果響應類型中包含applicaition/json			if (contentType.includes('application/json')) {
				// 將json字符串轉換為json對象
				responseText = JSON.parse(responseText)
			}
			// 當http狀態碼等于200的時候			if (xhr.status == 200) {
				// 請求成功 調用處理成功情況的函數
				defaults.success(responseText, xhr);
			}else {
				// 請求失敗 調用處理失敗情況的函數
				defaults.error(responseText, xhr);
			}
		}
	}復制代碼

完整的封裝代碼貼出來,如下所示:

<script type="text/javascript">	function ajax (options) {
		// 存儲的是默認值
		var defaults = {			type: 'get',
			url: '',
			data: {},
			header: {				'Content-Type': 'application/x-www-form-urlencoded'
				},
			success: function () {},
			error: function () {}
		};
		// 使用options對象中的屬性覆蓋defaults對象中的屬性
		Object.assign(defaults, options);
		// 創建ajax對象
		var xhr = new XMLHttpRequest();
		// 拼接請求參數的變量
		var params = '';
		// 循環用戶傳遞進來的對象格式參數		for (var attr in defaults.data) {
				// 將參數轉換為字符串格式
				params += attr + '=' + defaults.data[attr] + '&';
			}
		// 將參數最后面的&截取掉 
		// 將截取的結果重新賦值給params變量
		params = params.substr(0, params.length - 1);
		// 判斷請求方式		if (defaults.type == 'get') {
				defaults.url = defaults.url + '?' + params;
			}
		// 配置ajax對象
		xhr.open(defaults.type, defaults.url);
		// 如果請求方式為post		if (defaults.type == 'post') {
				// 用戶希望的向服務器端傳遞的請求參數的類型
				var contentType = defaults.header['Content-Type']
				// 設置請求參數格式的類型
				xhr.setRequestHeader('Content-Type', contentType);
				// 判斷用戶希望的請求參數格式的類型
				// 如果類型為json				if (contentType == 'application/json') {
					// 向服務器端傳遞json數據格式的參數
					xhr.send(JSON.stringify(defaults.data))
				}else {
					// 向服務器端傳遞普通類型的請求參數
					xhr.send(params);
				}

			}else {
			// 發送請求
			xhr.send();
		}
		// 監聽xhr對象下面的onload事件
		// 當xhr對象接收完響應數據后觸發
		xhr.onload = function () {
			// xhr.getResponseHeader()
			// 獲取響應頭中的數據
			var contentType = xhr.getResponseHeader('Content-Type');
			// 服務器端返回的數據
			var responseText = xhr.responseText;
			// 如果響應類型中包含applicaition/json			if (contentType.includes('application/json')) {
				// 將json字符串轉換為json對象
				responseText = JSON.parse(responseText)
			}
			// 當http狀態碼等于200的時候			if (xhr.status == 200) {
				// 請求成功 調用處理成功情況的函數
				defaults.success(responseText, xhr);
			}else {
				// 請求失敗 調用處理失敗情況的函數
				defaults.error(responseText, xhr);
			}
		}
	}
	ajax({		type: 'post',
		// 請求地址
		url: 'http://localhost:3000/responseData',
		success: function (data) {
			console.log('這里是success函數');
			console.log(data)
		}
	})
</script>復制代碼

封裝ajax函數要考慮到以下幾點:

  • 請求方式(get),請求參數要與地址拼接后放到open方法中。
  • 請求方式post,請求參數類型是json數據類型,要將json轉字符串后放到send方法中。
  • 對服務器響應處理時獲取響應頭中的響應數據格式。
  • 響應的格式是json對象,處理響應結果要將字符串轉json對象。
  • 設置ajax函數的默認參數減少代碼冗余。

以上是ajax函數封裝的基本實現方法的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广德县| 丹棱县| 东丰县| 瑞安市| 新泰市| 阿合奇县| 乐山市| 高邮市| 延边| 昭平县| 崇信县| 涟水县| 武鸣县| 开阳县| 镇安县| 合阳县| 平乡县| 柘荣县| 扶绥县| 六枝特区| 长顺县| 弥渡县| 台东市| 青浦区| 武宁县| 尉犁县| 新闻| 曲沃县| 平定县| 安平县| 高雄县| 寻乌县| 鄂伦春自治旗| 临沂市| 南丰县| 汽车| 旺苍县| 大安市| 岳西县| 三原县| 墨江|