亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

window.XMLHttpRequest對象詳解

2024-04-27 15:11:20
字體:
來源:轉載
供稿:網友

window.xmlHttPRequest

      xmlhttpRequest對象是當今所有Ajax和Web 2.0應用程序的技術基礎。盡管軟件經銷商和開源社團現在都在提供各種AJAX框架以進一步簡化XMLHttpRequest對象的使用;但是,我們仍然很有必要理解這個對象的詳細工作機制。  一、 引言  AJAX利用一個構建到所有現代瀏覽器內部的對象-XMLHttpRequest-來實現發送和接收HTTP請求與響應信息。一個經由XMLHttpRequest對象發送的HTTP請求并不要求頁面中擁有或回寄一個<form>元素。AJAX中的"A"代表了"異步",這意味著XMLHttpRequest對象的send()方法可以立即返回,從而讓Web頁面上的其它HTML/javaScript繼續其瀏覽器端處理而由服務器處理HTTP請求并發送響應。盡管缺省情況下請求是異步進行的,但是,你可以選擇發送同步請求,這將會暫停其它Web頁面的處理,直到該頁面接收到服務器的響應為止?! ∥④浽谄銲nternet Explorer(IE) 5中作為一個ActiveX對象形式引入了XMLHttpRequest對象。其他的認識到這一對象重要性的瀏覽器制造商也都紛紛在他們的瀏覽器內實現了XMLHttpRequest對象,但是作為一個本地Javascript對象而不是作為一個ActiveX對象實現。而如今,在認識到實現這一類型的價值及安全性特征之后,微軟已經在其IE 7中把XMLHttpRequest實現為一個窗口對象屬性。幸運的是,盡管其實現(因而也影響到調用方式)細節不同,但是,所有的瀏覽器實現都具有類似的功能,并且實質上是相同方法。目前,W3C組織正在努力進行XMLHttpRequest對象的標準化,并且已經發行了有關該W3C規范的一個草案?! ”疚膶MLHttpRequest對象API進行詳細討論,并將解釋其所有的屬性和方法。  二、 XMLHttpRequest對象的屬性和事件  XMLHttpRequest對象暴露各種屬性、方法和事件以便于腳本處理和控制HTTP請求與響應。下面,我們將對此展開詳細的討論。readyState屬性  當XMLHttpRequest對象把一個HTTP請求發送到服務器時將經歷若干種狀態:一直等待直到請求被處理;然后,它才接收一個響應。這樣以來,腳本才正確響應各種狀態-XMLHttpRequest對象暴露一個描述對象的當前狀態的readyState屬性,如表格1所示?! ”?#26684;1.XMLHttpRequest對象的ReadyState屬性值列表。ReadyState取值 描述 0  描述一種"未初始化"狀態;此時,已經創建一個XMLHttpRequest對象,但是還沒有初始化。 1  描述一種"發送"狀態;此時,代碼已經調用了XMLHttpRequest open()方法并且XMLHttpRequest已經準備好把一個請求發送到服務器。 2  描述一種"發送"狀態;此時,已經通過send()方法把一個請求發送到服務器端,但是還沒有收到一個響應。 3  描述一種"正在接收"狀態;此時,已經接收到HTTP響應頭部信息,但是消息體部分還沒有完全接收結束。 4  描述一種"已加載"狀態;此時,響應已經被完全接收。   onreadystatechange事件  無論readyState值何時發生改變,XMLHttpRequest對象都會激發一個readystatechange事件。其中,onreadystatechange屬性接收一個EventListener值-向該方法指示無論readyState值何時發生改變,該對象都將激活?! esponseText屬性  這個responseText屬性包含客戶端接收到的HTTP響應的文本內容。當readyState值為0、1或2時,responseText包含一個空字符串。當readyState值為3(正在接收)時,響應中包含客戶端還未完成的響應信息。當readyState為4(已加載)時,該responseText包含完整的響應信息?! esponseXML屬性  此responseXML屬性用于當接收到完整的HTTP響應時(readyState為4)描述XML響應;此時,Content-Type頭部指定MIME(媒體)類型為text/xml,application/xml或以+xml結尾。如果Content-Type頭部并不包含這些媒體類型之一,那么responseXML的值為null。無論何時,只要readyState值不為4,那么該responseXML的值也為null?! ∑鋵崳@個responseXML屬性值是一個文檔接口類型的對象,用來描述被分析的文檔。如果文檔不能被分析(例如,如果文檔不是良構的或不支持文檔相應的字符編碼),那么responseXML的值將為null。  status屬性  這個status屬性描述了HTTP狀態代碼,而且其類型為short。而且,僅當readyState值為3(正在接收中)或4(已加載)時,這個status屬性才可用。當readyState的值小于3時試圖存取status的值將引發一個異常?! tatusText屬性  這個statusText屬性描述了HTTP狀態代碼文本;并且僅當readyState值為3或4才可用。當readyState為其它值時試圖存取statusText屬性將引發一個異常。三、 XMLHttpRequest對象的方法  XMLHttpRequest對象提供了各種方法用于初始化和處理HTTP請求,下列將逐個展開詳細討論。  abort()方法  你可以使用這個abort()方法來暫停與一個XMLHttpRequest對象相聯系的HTTP請求,從而把該對象復位到未初始化狀態。  open()方法  你需要調用open(DOMString method,DOMString uri,boolean async,DOMString username,DOMString passWord)方法初始化一個XMLHttpRequest對象。其中,method參數是必須提供的-用于指定你想用來發送請求的HTTP方法(GET,POST,PUT,DELETE或HEAD)。為了把數據發送到服務器,應該使用POST方法;為了從服務器端檢索數據,應該使用GET方法。另外,uri參數用于指定XMLHttpRequest對象把請求發送到的服務器相應的URI。借助于window.document.baseURI屬性,該uri被解析為一個絕對的URI-換句話說,你可以使用相對的URI-它將使用與瀏覽器解析相對的URI一樣的方式被解析。async參數指定是否請求是異步的-缺省值為true。為了發送一個同步請求,需要把這個參數設置為false。對于要求認證的服務器,你可以提供可選的用戶名和口令參數。在調用open()方法后,XMLHttpRequest對象把它的readyState屬性設置為1(打開)并且把responseText、responseXML、status和statusText屬性復位到它們的初始值。另外,它還復位請求頭部。注意,如果你調用open()方法并且此時readyState為4,則XMLHttpRequest對象將復位這些值?! end()方法  在通過調用open()方法準備好一個請求之后,你需要把該請求發送到服務器。僅當readyState值為1時,你才可以調用send()方法;否則的話,XMLHttpRequest對象將引發一個異常。該請求被使用提供給open()方法的參數發送到服務器。當async參數為true時,send()方法立即返回,從而允許其它客戶端腳本處理繼續。在調用send()方法后,XMLHttpRequest對象把readyState的值設置為2(發送)。當服務器響應時,在接收消息體之前,如果存在任何消息體的話,XMLHttpRequest對象將把readyState設置為3(正在接收中)。當請求完成加載時,它把readyState設置為4(已加載)。對于一個HEAD類型的請求,它將在把readyState值設置為3后再立即把它設置為4?! end()方法使用一個可選的參數-該參數可以包含可變類型的數據。典型地,你使用它并通過POST方法把數據發送到服務器。另外,你可以顯式地使用null參數調用send()方法,這與不用參數調用它一樣。對于大多數其它的數據類型,在調用send()方法之前,應該使用setRequestHeader()方法(見后面的解釋)先設置Content-Type頭部。如果在send(data)方法中的data參數的類型為DOMString,那么,數據將被編碼為UTF-8。如果數據是Document類型,那么將使用由data.xmlEncoding指定的編碼串行化該數據?! etRequestHeader()方法  該setRequestHeader(DOMString header,DOMString value)方法用來設置請求的頭部信息。當readyState值為1時,你可以在調用open()方法后調用這個方法;否則,你將得到一個異常?! etResponseHeader()方法  getResponseHeader(DOMString header,value)方法用于檢索響應的頭部值。僅當readyState值是3或4(換句話說,在響應頭部可用以后)時,才可以調用這個方法;否則,該方法返回一個空字符串?! etAllResponseHeaders()方法  該getAllResponseHeaders()方法以一個字符串形式返回所有的響應頭部(每一個頭部占單獨的一行)。如果readyState的值不是3或4,則該方法返回null。四、 發送請求  在AJAX中,許多使用XMLHttpRequest的請求都是從一個HTML事件(例如一個調用JavaScript函數的按鈕點擊(onclick)或一個按鍵(onkeypress))中被初始化的。AJAX支持包括表單校驗在內的各種應用程序。有時,在填充表單的其它內容之前要求校驗一個唯一的表單域。例如要求使用一個唯一的UserID來注冊表單。如果不是使用AJAX技術來校驗這個UserID域,那么整個表單都必須被填充和提交。如果該UserID不是有效的,這個表單必須被重新提交。例如,一個相應于一個要求必須在服務器端進行校驗的Catalog ID的表單域可能按下列形式指定:

[html] view plain copy<form name="validationForm" action="validateForm" method="post">  <table>  ?。紅r><td>Catalog Id:</td>   ?。紅d>     <input type="text" size="20" id="catalogId" name="catalogId" autocomplete="off" onkeyup="sendRequest()">   ?。?td>    <td><div id="validationMessage"></div></td>  ?。?tr>  </table></form>     前面的HTML使用validationMessage div來顯示相應于這個輸入域Catalog Id的一個校驗消息。onkeyup事件調用一個JavaScript sendRequest()函數。這個sendRequest()函數創建一個XMLHttpRequest對象。創建一個XMLHttpRequest對象的過程因瀏覽器實現的不同而有所區別。如果瀏覽器支持XMLHttpRequest對象作為一個窗口屬性(所有普通的瀏覽器都是這樣的,除了IE 5和IE 6之外),那么,代碼可以調用XMLHttpRequest的構造器。如果瀏覽器把XMLHttpRequest對象實現為一個ActiveXObject對象(就象在IE 5和IE 6中一樣),那么,代碼可以使用ActiveXObject的構造器。下面的函數將調用一個init()函數,它負責檢查并決定要使用的適當的創建方法-在創建和返回對象之前。[javascript] view plain copy<script type="text/javascript">  function sendRequest(){   var xmlHttpReq=init();   function init(){    if (window.XMLHttpRequest) {     return new XMLHttpRequest();    }    else if (window.ActiveXObject) {    return new ActiveXObject("Microsoft.XMLHTTP");   }  }  </script>     接下來,你需要使用Open()方法初始化XMLHttpRequest對象-指定HTTP方法和要使用的服務器URL。var catalogId=encodeURIComponent(document.getElementById("catalogId").value);xmlHttpReq.open("GET", "validateForm?catalogId=" + catalogId, true);   默認情況下,使用XMLHttpRequest發送的HTTP請求是異步進行的,但是你可以顯式地把async參數設置為true,如上面所展示的。在這種情況下,對URL validateForm的調用將激活服務器端的一個servlet,但是你應該能夠注意到服務器端技術不是根本性的;實際上,該URL可能是一個asp,asp.netphp頁面或一個Web服務-這無關緊要,只要該頁面能夠返回一個響應-指示CatalogID值是否是有效的-即可。因為你在作一個異步調用,所以你需要注冊一個XMLHttpRequest對象將調用的回調事件處理器-當它的readyState值改變時調用。記住,readyState值的改變將會激發一個readystatechange事件。你可以使用onreadystatechange屬性來注冊該回調事件處理器。xmlHttpReq.onreadystatechange=processRequest;   然后,我們需要使用send()方法發送該請求。因為這個請求使用的是HTTP GET方法,所以,你可以在不指定參數或使用null參數的情況下調用send()方法。xmlHttpReq.send(null); 五、 處理請求  在這個示例中,因為HTTP方法是GET,所以在服務器端的接收servlet將調用一個doGet()方法,該方法將檢索在URL中指定的catalogId參數值,并且從一個數據庫中檢查它的有效性?! ”疚氖纠械倪@個servlet需要構造一個發送到客戶端的響應;而且,這個示例返回的是XML類型,因此,它把響應的HTTP內容類型設置為text/xml并且把Cache-Control頭部設置為no-cache。設置Cache-Control頭部可以阻止瀏覽器簡單地從緩存中重載頁面。[html] view plain copypublic void doGet(HttpServletRequest request,   HttpServletResponse response)  throws ServletException, IOException {   ...   ...   response.setContentType("text/xml");   response.setHeader("Cache-Control", "no-cache");  }     來自于服務器端的響應是一個XML DOM對象,此對象將創建一個XML字符串-其中包含要在客戶端進行處理的指令。另外,該XML字符串必須有一個根元素。out.println("<catalogId>valid</catalogId>");   【注意】XMLHttpRequest對象的設計目的是為了處理由普通文本或XML組成的響應;但是,一個響應也可能是另外一種類型,如果用戶代理(UA)支持這種內容類型的話?! ‘斦埱鬆顟B改變時,XMLHttpRequest對象調用使用onreadystatechange注冊的事件處理器。因此,在處理該響應之前,你的事件處理器應該首先檢查readyState的值和HTTP狀態。當請求完成加載(readyState值為4)并且響應已經完成(HTTP狀態為"OK")時,你就可以調用一個JavaScript函數來處理該響應內容。下列腳本負責在響應完成時檢查相應的值并調用一個processResponse()方法。function processRequest(){ if(xmlHttpReq.readyState==4){  if(xmlHttpReq.status==200){   processResponse();  } }}   該processResponse()方法使用XMLHttpRequest對象的responseXML和responseText屬性來檢索HTTP響應。如上面所解釋的,僅當在響應的媒體類型是text/xml,application/xml或以+xml結尾時,這個responseXML才可用。這個responseText屬性將以普通文本形式返回響應。對于一個XML響應,你將按如下方式檢索內容:var msg=xmlHttpReq.responseXML;   借助于存儲在msg變量中的XML,你可以使用DOM方法getElementsByTagName()來檢索該元素的值:var catalogId=msg.getElementsByTagName("catalogId")[0].firstChild.nodeValue;   最后,通過更新Web頁面的validationMessage div中的HTML內容并借助于innerHTML屬性,你可以測試該元素值以創建一個要顯示的消息:if(catalogId=="valid"){ var validationMessage = document.getElementById("validationMessage"); validationMessage.innerHTML = "Catalog Id is Valid";}else{ var validationMessage = document.getElementById("validationMessage"); validationMessage.innerHTML = "Catalog Id is not Valid";}   六、 小結  上面就是XMLHttpRequest對象使用的所有細節實現。通過不必把Web頁面寄送到服務器而實現數據傳送,XMLHttpRequest對象為客戶端與服務器之間提供了一種動態的交互能力。你可以使用JavaScript啟動一個請求并處理相應的返回值,然后使用瀏覽器的DOM方法更新頁面中的數據。  附:簡單的示例代碼[html] view plain copyhtml:  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml">  <head runat="server">      <meta http-equiv="Content-Type" content="text/html;charset=gb2312" />      <title>示例</title>      <script src="Ajax.js"></script>  </head>  <body>     <a href="#" onclick="ajaxReader('data5.xml'); return false"> 查看</a>  <div id="dataArea">  </div>              </body>  </html>  script:  // JScript File  function  ajaxReader(file)      {          //定義xmlobj對象          var xmlObj=null;          if(window.XMLHttpRequest)          {              xmlObj=new XMLHttpRequest();          }          else if(window.ActiveXObject)          {              xmlObj=new ActiveXObject("Microsoft.XMLHTTP");          }          else          {              return;          }                    xmlObj.onreadystatechange=function(){                                                  if(xmlObj.readyState==4)                                                  {                                                                                                            processXML(xmlObj.responseXML);                                                                                                                                                           }                                                   }                                                                                                                                                                                             xmlObj.open('GET',file,true);         xmlObj.send('');          }     function processXML(obj)  {   var dataArray=obj.getElementsByTagName('pets')[0].childNodes;      var dataArrayLength=dataArray.length;      var insertData='<table>';      insertData +='<tr><th>Pet5</th><th>Tasks</th></tr>';             for(var i=0;i<dataArrayLength;i++)       {          if(dataArray[i].tagName)          {              insertData+='<tr>';                  insertData +='<td>'+dataArray[i].tagName+'</td>';              insertData +="<td>"+dataArray[i].getAttribute('tasks')+'</td>';              insertData+='</tr>';             }            }          insertData +=+'</table>';     document.getElementById('dataArea4').innerHTML =insertData;  }  
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲图片欧洲图片av| 菠萝蜜影院一区二区免费| 久久久噜久噜久久综合| 久久国产精品亚洲| 精品久久香蕉国产线看观看gif| 日韩av免费网站| 97免费在线视频| 全球成人中文在线| 美女撒尿一区二区三区| 亚洲国产精品福利| 精品久久在线播放| 国模精品一区二区三区色天香| 精品国产91乱高清在线观看| 欧美另类99xxxxx| 亚洲精品国产美女| 国产中文欧美精品| 国产成人精品日本亚洲专区61| 91福利视频网| 中文字幕精品www乱入免费视频| 97精品国产91久久久久久| 国产小视频91| 97香蕉久久超级碰碰高清版| 成人免费网站在线看| 欧美精品videossex88| 亚洲天堂av高清| 欧美成人午夜激情视频| 国产精品老女人视频| 欧美日韩国产综合视频在线观看中文| 精品亚洲国产视频| 有码中文亚洲精品| 九九热视频这里只有精品| 在线看片第一页欧美| 国产精品无av码在线观看| 国产精品爽爽ⅴa在线观看| 久久香蕉频线观| 欧美性高潮床叫视频| 午夜精品久久久久久久99热| 91天堂在线视频| 91亚洲永久免费精品| 黄色精品一区二区| www.色综合| 亚洲国产成人久久综合一区| 国产剧情日韩欧美| 日韩在线视频观看正片免费网站| 午夜精品在线视频| 国产精品视频网址| 日韩中文字幕视频| 国产精品美女免费看| 操日韩av在线电影| 国产69精品久久久久9| 亚洲精品国精品久久99热| 欧美激情视频网| 一区二区三区www| 在线观看国产欧美| 国产精品视频1区| 国产精品成人播放| 国产成+人+综合+亚洲欧美丁香花| 欧美日韩一区二区免费视频| 亚洲品质视频自拍网| 日韩中文综合网| 国产精品亚洲激情| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美激情一级精品国产| 午夜伦理精品一区| 日本免费一区二区三区视频观看| 美女国内精品自产拍在线播放| 日韩欧美在线看| 国产精品免费在线免费| 久久国产视频网站| 中文字幕v亚洲ⅴv天堂| 国产精品久久久久不卡| 91精品国产色综合久久不卡98| 亚洲男人的天堂在线| 国产精品视频26uuu| 成人激情视频小说免费下载| 俺去啦;欧美日韩| 日韩av在线网| 国产亚洲精品激情久久| 91免费的视频在线播放| 亚洲人成在线观| y97精品国产97久久久久久| 成人高h视频在线| 97成人精品视频在线观看| 亚洲国产精品悠悠久久琪琪| 亚洲精品久久久久久久久久久久久| 亚洲区在线播放| 国产成人欧美在线观看| 亚洲综合第一页| 国产一区二区三区日韩欧美| 97av在线视频免费播放| 欧美中文在线视频| 亚洲人成自拍网站| 久久久久久久久亚洲| 成人免费在线视频网址| 国产成人av网址| 欧美精品免费看| 国语自产精品视频在线看抢先版图片| 亚洲电影免费观看高清| 国产精品扒开腿爽爽爽视频| 色香阁99久久精品久久久| 欧美国产亚洲精品久久久8v| 欧美精品福利视频| 国产在线观看精品一区二区三区| 精品国产31久久久久久| 深夜福利日韩在线看| 成人午夜两性视频| 国产精品中文久久久久久久| 91九色国产在线| 日韩激情av在线免费观看| 久久精视频免费在线久久完整在线看| 国产91成人video| 国产成人精品免费久久久久| 国产免费一区二区三区香蕉精| 国产精品久久久久久亚洲影视| 亚洲在线第一页| 国产精品久久久久久久一区探花| 国产精品久久久久久搜索| 亚州国产精品久久久| 一夜七次郎国产精品亚洲| 91在线视频九色| 欧美xxxx做受欧美.88| 日韩亚洲成人av在线| 欧美重口另类videos人妖| 欧美成人三级视频网站| 久久影视免费观看| 久久99精品久久久久久琪琪| 国产成人小视频在线观看| 美女av一区二区三区| 久久人人爽人人爽人人片亚洲| 国语自产在线不卡| 777777777亚洲妇女| 日韩在线欧美在线| 国产欧美一区二区白浆黑人| 久久久精品视频在线观看| 精品久久久久久亚洲国产300| 欧美黑人狂野猛交老妇| 欧美性视频网站| 亚洲美女性生活视频| 欧美性感美女h网站在线观看免费| 亚洲第一综合天堂另类专| 欧美另类在线观看| 成人综合网网址| 色婷婷综合久久久久中文字幕1| 国产美女扒开尿口久久久| 91久久精品国产91性色| 中文字幕av一区二区三区谷原希美| 中文字幕亚洲二区| 国产精品永久免费| 福利一区视频在线观看| 91影视免费在线观看| 性夜试看影院91社区| 日韩欧美一区二区三区久久| 18一19gay欧美视频网站| wwwwwwww亚洲| 欧美国产极速在线| 国产91免费观看| 日韩av不卡电影| 91色中文字幕| 亚洲一区二区三区乱码aⅴ蜜桃女| 91老司机精品视频| 国产精品视频最多的网站| 亚洲成人久久久久| 欧美国产中文字幕| 国产精品99久久久久久久久|