国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Ajax的語法淺析

開發 前端
通過Ajax我們可以向服務器發送請求,在不阻塞頁面的情況下進行數據交互,也可以理解為異步數據傳輸。在Ajax的幫助下我們的網頁只需局部刷新即可更新數據的顯示,減少了不必要的數據量,大大提高了用戶體驗,縮短了用戶等待的時間,使得web應用程序更小、更快,更友好。

[[171191]]

Ajax是目前很普遍的一門技術,也是很值得探討和研究的一門技術。本文將針對Ajax的發展過程并結合其在不同庫框架中的使用方式來和大家分享下Ajax的那些新老語法。

Ajax簡介

Ajax全稱為“Asynchronous Javascript And XML”, 即“異步JavaScript和XML”的意思。通過Ajax我們可以向服務器發送請求,在不阻塞頁面的情況下進行數據交互,也可以理解為異步數據傳輸。在Ajax的幫助下我們的網頁只需局部刷新即可更新數據的顯示,減少了不必要的數據量,大大提高了用戶體驗,縮短了用戶等待的時間,使得web應用程序更小、更快,更友好。

當然以上都是司空見慣的內容了,作為一名合格的開發人員基本都再熟悉不過了,這里只為那些剛入門的新手做一個簡單的介紹。更多的關于Ajax的簡介請移步W3School進行了解:http://www.w3school.com.cn/ph...

原生Ajax

基本上所有現代的瀏覽器都支持原生Ajax的功能,下面就來詳細介紹下利用原生JS我們怎樣來發起和處理Ajax請求。

1.獲取XMLHttpRequest對象

  1. var xhr = new XMLHttpRequest(); // 獲取瀏覽器內置的XMLHttpRequest對象 

如果你的項目應用不考慮低版本IE,那么可以直接用上面的方法,所有現代瀏覽器 (Firefox、Chrome、Safari 以及 Opera) 都內建了 XMLHttpRequest 對象。如果需要兼容老版本IE(IE5、IE6),那么可以使用 ActiveX 對象:

  1. var xhr; 
  2.  
  3. if (window.XMLHttpRequest) { 
  4.     xhr=new XMLHttpRequest(); 
  5. else if (window.ActiveXObject) {    // 兼容老版本瀏覽器 
  6.     xhr=new ActiveXObject("Microsoft.XMLHTTP"); 
  7.  

2.參數配置

有了XMLHttpRequest對象,我們還需要配置一些請求的參數信息來完成數據交互,利用open方法即可:

  1. var xhr; 
  2.  
  3. if (window.XMLHttpRequest) { 
  4.     xhr=new XMLHttpRequest(); 
  5. else if (window.ActiveXObject) { 
  6.     xhr=new ActiveXObject("Microsoft.XMLHTTP"); 
  7.  
  8. if (xhr) { 
  9.     xhr.open('GET''/test/'true); // 以GET請求的方式向'/test/'路徑發送異步請求 
  10.  

open方法為我們創建了一個新的http請求,其中第一個參數為請求方式,一般為'GET'或'POST';第二個參數為請求url;第三個參數為是否異步,默認為true。

3.發送請求

配置完了基本參數信息,我們直接調用send方法發送請求,代碼如下:

  1. var xhr; 
  2.  
  3. if (window.XMLHttpRequest) { 
  4.     xhr=new XMLHttpRequest(); 
  5. else if (window.ActiveXObject) { 
  6.     xhr=new ActiveXObject("Microsoft.XMLHTTP"); 
  7.  
  8. if (xhr) { 
  9.     xhr.open('GET''/test/'true);  
  10.     xhr.send(); // 調用send方法發送請求 
  11.  

這里需要注意的是如果使用GET方法傳遞參數,我們可以直接將參數放在url后面,比如'/test/?name=luozh&size=12';如果使用POST方法,那么我們的參數需要寫在send方法里,如:

  1. xhr.open('POST''/test/'true); 
  2. xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); // 將請求頭設置為表單方式提交 
  3. xhr.send('name=luozh&size=12'); 

 最終會以Form Data的形式傳遞:

 

如果不設置請求頭,原生Ajax會默認使用Content-Type是'text/plain;charset=UTF-8'的方式發送數據,如果按照上面的參數書寫形式,我們最終傳輸的形式這樣的:

 

顯然這并不是服務器期望的數據格式,我們可以這樣寫:

  1. xhr.open('POST''/test/'true); 
  2.  
  3. xhr.send(JSON.stringify({name'luozh'size: 12})); 

 最終傳輸的格式如下:

 

這樣我們可以直接傳遞JSON字符串給后臺處理,當然后臺也許進行相應配置。

4.監測狀態

發送完Ajax請求之后,我們需要針對服務器返回的狀態進行監測并進行相應的處理,這里我們需要使用onreadystatechange方法,代碼如下:

  1. var xhr; 
  2.  
  3. if (window.XMLHttpRequest) { 
  4.     xhr=new XMLHttpRequest(); 
  5. else if (window.ActiveXObject) { 
  6.     xhr=new ActiveXObject("Microsoft.XMLHTTP"); 
  7.  
  8. if (xhr) { 
  9.     xhr.open('GET''/test/'true);     // 以GET請求的方式向'/test/'路徑發送異步請求 
  10.     xhr.send(); 
  11.     xhr.onreadystatechange = function () {    // 利用onreadystatechange監測狀態 
  12.         if (xhr.readyState === 4) {    // readyState為4表示請求響應完成 
  13.             if (xhr.status === 200) {    // status為200表示請求成功 
  14.                 console.log('執行成功'); 
  15.             } else { 
  16.                 console.log('執行出錯'); 
  17.             }    
  18.         } 
  19.     } 
  20.  

上面我們利用onreadystatechange監測狀態,并在內部利用readyState獲取當前的狀態。readyState一共有5個階段,當其為4時表示響應內容解析完成,可以在客戶端調用了。當readyState為4時,我們又通過status來獲取狀態碼,狀態碼為200時執行成功代碼,否則執行出錯代碼。

當然我們可以用onload來代替onreadystatechange等于4的情況,因為onload只在狀態為4的時候才被調用,代碼如下:

  1. xhr.onload = function () {    // 調用onload 
  2.     if (xhr.status === 200) {    // status為200表示請求成功 
  3.         console.log('執行成功'); 
  4.     } else { 
  5.         console.log('執行出錯'); 
  6.     }    
  7.  

然而需要注意的是,IE對onload這個屬性的支持并不友好。

除了onload還有

  • onloadstart
  • onprogress
  • onabort
  • ontimeout
  • onerror
  • onloadend

等事件,有興趣的同學可以親自去實踐它們的用處。

以上便是原生Ajax請求數據的常見代碼。

其他庫框架中的Ajax

1.jQuery中的Ajax

jQuery作為一個使用人數最多的庫,其Ajax很好的封裝了原生Ajax的代碼,在兼容性和易用性方面都做了很大的提高,讓Ajax的調用變得非常簡單。下面便是一段簡單的jQuery的Ajax代碼:

  1. $.ajax({ 
  2.     method: 'GET', // 1.9.0本版前用'type' 
  3.     url: "/test/"
  4.     dataType: 'json' 
  5. }) 
  6. .done(function() { 
  7.     console.log('執行成功'); 
  8. }) 
  9. .fail(function() { 
  10.     console.log('執行出錯'); 
  11. })  

與原生Ajax不同的是,jQuery中默認的Content-type是'application/x-www-form-urlencoded; charset=UTF-8', 想了解更多的jQuery Ajax的信息可以移步官方文檔:http://api.jquery.com/jquery....

2.Vue.js中的Ajax

Vue.js作為目前熱門的前端框架,其實其本身并不包含Ajax功能,而是通過插件的形式額外需要在項目中引用,其官方推薦Ajax插件為vue-resource,下面便是vue-resource的請求代碼:

  1. Vue.http.get('/test/').then((response) => { 
  2.     console.log('執行成功'); 
  3. }, (response) => { 
  4.     console.log('執行出錯'); 
  5. });  

vue-resource支持Promise API,同時支持目前的Firefox, Chrome, Safari, Opera 和 IE9+瀏覽器,在瀏覽器兼容性上不兼容IE8,畢竟Vue本身也不兼容IE8。想了解更多的vue-resource的信息可以移步github文檔:https://github.com/vuejs/vue-...

3.Angular.js中的Ajax

這里Angular.js中的Ajax主要指Angular的1.×版本,因為Angular2目前還不建議在生產環境中使用。

  1. var myApp = angular.module('myApp',[]); 
  2.  
  3. var myCtrl = myApp.controller('myCtrl',['$scope','$http',function($scope, $http){ 
  4.     $http({ 
  5.         method: 'GET'
  6.         url: '/test/'
  7.         headers: {'Content-Type''application/x-www-form-urlencoded; charset=UTF-8'}   
  8.     }).success(function (data) { 
  9.         console.log('執行成功'); 
  10.     }).error(function () { 
  11.         console.log('執行出錯'); 
  12.     }); 
  13. }]);  

在Angular中,我們需要在控制器上注冊一個$http的事件,然后才能在內部執行Ajax。Angular的Ajax默認的Content-type是'application/json;charset=UTF-8',所以如果想用表單的方式提交還需設置下headers屬性。想了解更多的Angular Ajax的信息可以移步官方文檔:https://docs.angularjs.org/ap...$http(可能需要翻墻)

4.React中的Ajax

在React中我比較推薦使用fetch來請求數據,當然其不僅適用于React,在任何一種框架如上面的Vue、Angular中都可以使用,因為其已經被目前主流瀏覽器所支持,至于其主要功能和用法,我在下面會做下講解。

Fetch API

Fetch API 是基于 Promise 設計,由于Promise的瀏覽器兼容性問題及Fetch API本身的兼容問題,一些瀏覽器暫時不支持Fetch API,瀏覽器兼容圖如下:

 

當然我們可以通過使用一些插件來解決兼容性問題,比如:fetch-polyfill、es6-promise、fetch-ie8等。

使用Fetch我們可以非常便捷的編寫Ajax請求,我們用原生的XMLHttpRequst對象和Fetch來比較一下:

XMLHttpRequst API

  1. // XMLHttpRequst API 
  2. var xhr = new XMLHttpRequest(); 
  3. xhr.open('GET''/test/'true); 
  4.  
  5. xhr.onload = function() { 
  6.     console.log('執行成功'); 
  7. }; 
  8.  
  9. xhr.onerror = function() { 
  10.     console.log('執行出錯'); 
  11. }; 
  12.  
  13. xhr.send();  

Fetch API

  1. fetch('/test/').then(function(response) { 
  2.     return response.json(); 
  3. }).then(function(data) { 
  4.     console.log('執行成功'); 
  5. }).catch(function(e) { 
  6.     console.log('執行出錯'); 
  7. }); 

可以看出使用Fetch后我們的代碼更加簡潔和語義化,鏈式調用的方式也使其更加流暢和清晰。隨著瀏覽器內核的不斷完善,今后的XMLHttpRequest會逐漸被Fetch替代。關于Fetch的詳細介紹可以移步:https://segmentfault.com/a/11...

跨域Ajax

介紹了各種各樣的Ajax API,我們不能避免的一個重要問題就是跨域,這里重點講解下Ajax跨域的處理方式。

處理Ajax跨域問題主要有以下4種方式:

  1. 利用iframe
  2. 利用JSONP
  3. 利用代理
  4. 利用HTML5提供的XMLHttpRequest Level2

第1和第2種方式大家應該都非常熟悉,都屬于前端的活,這里就不做介紹了,這里主要介紹第3和第4種方式。

利用代理的方式可以這樣理解:

通過在同域名下的web服務器端創建一個代理:

北京服務器(域名:www.beijing.com)

上海服務器(域名:www.shanghai.com)

比如在北京的web服務器的后臺(www.beijing.com/proxy-shanghaiservice.php)來調用上海服務器(www.shanghai.com/services.php)的服務,然后再把訪問結果返回給前端,這樣前端調用北京同域名的服務就和調用上海的服務效果相同了。

利用XMLHttpRequest Level2的方式需要后臺將請求頭進行相應配置:

// php語法

header('Access-Control-Allow-Origin: *');

header('Access-Control-Allow-Methods: GET,POST');

以上的*號可以替換成允許訪問的域名,*表示所有域名都可以訪問。

由此可見,第3和第4種方式主要是后臺的活,前端只需調用就可以。

總結

無論Ajax的語法多么多變,無論庫和框架如何封裝Ajax,其只是一種實現異步數據交互的工具,我們只需理解原生JS中Ajax的實現原理,了解XMLHttpRequest及promise的概念和流程,便可以輕松的在數據異步交互的時代游刃有余。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2009-07-24 13:41:15

ASP.NET AJA

2009-08-27 11:43:31

C#語法

2009-07-28 15:28:35

ASP.NET AJA

2010-01-21 09:34:57

C++語法

2010-09-30 15:19:33

2009-08-18 12:52:33

C#枚舉類型

2009-07-28 16:08:43

ASP.NET AJA

2009-07-06 12:49:33

JSP編譯器

2010-09-07 10:33:04

CSS

2024-08-27 10:34:05

2009-07-27 13:34:15

ASP.NET編程

2009-06-01 15:44:18

2009-07-28 16:21:03

Asp.net AjaAutoComplet

2019-07-10 10:00:42

PHPPython語法

2009-12-02 10:32:02

PHP語法解析函數

2009-09-07 14:41:48

GridView展開與

2009-08-20 13:23:00

C#正則表達式

2020-10-20 18:42:17

Vue 3.0vue2.x數據

2016-02-26 09:38:02

Ajax技術簡述

2011-02-24 11:02:03

人才
點贊
收藏

51CTO技術棧公眾號

在线观看日韩羞羞视频| 日本免费不卡一区二区| 日本大片在线播放| 国产精品久久久久毛片软件| 日本一区二区三区www| 国产精品一区二区av交换| www.国产精品一二区| 岛国av在线播放| 亚洲成人激情视频| 国产99在线| 亚洲女人被黑人巨大进入| 美女av在线免费看| 亚洲人成绝费网站色www| 欧美xxxx视频| 日韩一区二区三区三四区视频在线观看| h网址在线观看| 亚洲美女在线国产| 日本搞黄视频| 午夜精品免费在线观看| 22288色视频在线观看| 精品久久久久久中文字幕| 簧片在线观看| 一本一道波多野结衣一区二区| 色在线免费视频| 欧美色区777第一页| 日韩免费网站| 亚洲第一av网站| 国产日韩电影| 色综合久久久久久中文网| 欧美1区2区3区4区| 国产精品亚洲网站| 欧美日本精品| 久久精品国产美女| 国产主播一区二区| 黄色片视频在线播放| 亚洲激情六月丁香| 午夜免费播放观看在线视频| 日韩美女视频一区二区在线观看| jizz内谢中国亚洲jizz| 久久国产天堂福利天堂| 综合伊思人在钱三区| 国产福利久久精品| 国产一区二区三区四区五区入口| 大肉大捧一进一出好爽视频| 一区二区国产视频| 日本最新在线视频| 中文日韩在线观看| 杨幂一区二区三区免费看视频| 91久久精品一区二区别| 久久福利资源站| 天天干天天操天天玩| 欧美性69xxxx肥| 黄色在线看片| 久久精品国产99国产精品澳门| 国产剧情一区| 亚洲丰满在线| 亚洲天堂a在线| av在线二区| 中文字幕精品国产| 色琪琪久久se色| 日韩国产在线一区| 日本一区二区视频在线观看| 粉嫩av一区| 久久久av电影| 亚洲国产精品一区制服丝袜| 久久人人爽人人爽人人av| 亚洲一区二区不卡免费| 超碰在线公开| 国产精品www色诱视频| 久久免费黄色| 成人片在线播放| 亚洲成人激情图| 精品国产一区二区三区久久久蜜臀| 欧美性色黄大片人与善| 国产精品网友自拍| 欧美videossex| 亚州国产精品久久久| 视频在线观看一区二区三区| 少妇一级淫免费放| 日韩欧美国产小视频| 亚洲精品一级二级三级| 一区二区三区四区久久| 欧美日韩精品中文字幕| 疯狂欧洲av久久成人av电影 | 国产在线更新| 日本老师69xxx| 国产乱码一区二区三区| 有码在线播放| 久久九九热免费视频| 亚洲激情综合| caoporn超碰国产公开| 国产一区二区三区高清在线观看| 欧美高清一区| 99视频入口| 久久亚洲影音av资源网| 肉肉av福利一精品导航| 人成在线免费视频| 热re91久久精品国99热蜜臀| 国内成人自拍视频| av国产在线观看| 国产ts人妖一区二区三区 | 久久女人天堂| 日本a级片久久久| 色天天综合久久久久综合片| 精品一区三区| **三级三级97片毛片| 中文字幕国产精品久久| 久久福利资源站| 超碰在线网址| 国产精品18毛片一区二区| 亚洲va天堂va国产va久| 日韩av系列| 天天插天天操天天射| 色吧影院999| 成人国产免费视频| 中文在线免费二区三区| 四虎永久国产精品| 欧美日韩亚洲综合在线| 精品盗摄女厕tp美女嘘嘘| 色爱综合网站| 97视频在线观看免费| 国产欧美在线观看一区| 在线不卡一区| 北条麻妃在线视频观看| 色琪琪综合男人的天堂aⅴ视频| 国产福利一区二区三区视频| 丝袜美腿一区| 男人用嘴添女人下身免费视频| 亚洲网站在线看| 粉嫩aⅴ一区二区三区四区五区| 欧美中文字幕精在线不卡| 台湾无码一区二区| 亚洲天堂久久av| 成人精品视频一区二区三区| 成人一级视频| 欧美女人性生活视频| 欧美猛少妇色xxxxx| 久久久久一区二区三区四区| 亚洲精选av| 午夜国产视频| 99re国产| 精品国精品国产| 高清国产一区二区| 精品国产一区二区三区2021| 日韩欧美国产片| 国产激情视频一区| 在线免费不卡视频| 美女免费视频一区| 4438五月综合| 超碰在线公开超碰在线| 好看的日韩精品| 国产视频精品一区二区三区| av不卡一区二区三区| 外国成人在线视频| 国产剧情在线观看| 男人的天堂成人| 欧美国产在线视频| 欧美日韩亚洲高清| 日韩国产在线观看| 国产麻豆一区二区三区| 九色免费视频| 鲁丝一区二区三区免费| 伊人久久免费视频| 一区二区三区高清不卡| 最新亚洲激情| 国产日本久久| 一区二区电影网| 在线视频不卡一区二区| 韩国美女主播一区| 欧美精品三级日韩久久| av不卡免费电影| 亚洲女同中文字幕| 欧美xxxhd| 嫩草影院2018| 日韩精品欧美一区二区三区| 久久亚洲影音av资源网 | 影音先锋中文字幕一区| 免费观看欧美大片| 午夜激情影院| 国产对白在线播放| 国产精品69av| 国产偷亚洲偷欧美偷精品| 亚洲免费在线观看视频| 亚洲深夜福利| 99热这里只有精品首页| 最新真实国产在线视频| caoporn超碰97| 国产精品免费看一区二区三区| 亚洲色在线视频| 亚洲国产精品一区二区久久恐怖片| 日韩国产欧美在线播放| 小说区图片区色综合区| h片在线观看下载| 神马久久精品| 国产情侣av自拍| 亚洲欧美日韩在线综合| 91在线视频免费| 久久青草福利网站| 91在线porny国产在线看| 欧美日韩中文字幕精品|