好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > AJAX機制詳解以及跨域通信

AJAX機制詳解以及跨域通信

熱門標簽:外呼系統獲取客戶手機號 徐州電銷卡外呼系統供應商 科智聯智能電銷機器人 百靈鳥 襄陽外呼系統接口 老虎郵局地圖標注點 青海醫療智能外呼系統怎么樣 上海浦東百度地圖標注中心注冊 目標三維地圖標注

1.Ajax

1.1.Ajax簡介
  Ajax簡介這一部分我們主要是談一下ajax的起源,ajax是什么?因為這些是跟技術無關的。所以,大多細節都是一筆帶過。

  Ajax的起源?

  Ajax一詞源于2005年 Jesse James Garrett發表的一篇題為"Ajax:A new Approach to Web Applications".他在這篇文       章中介紹了一種新技術,用他的話說,就是Ajax :Asynchronous JavaScript +XML的縮寫。

  Ajax是什么?

  這種新技術的主要目的就是為了使前端網頁能夠向服務器請求額外的數據而不需要卸載頁面。自從這種技術出現以后,微軟率先引入XHRt對象(ajax能夠實現的核心對象),然后其他瀏覽器相繼實現這種技術。總而言之,ajax就是一種能異步通信的技術。

1.2.Ajax的核心對象---XMLHttpRequest
  因為IE5是最先引入這個XHR對象的,當時并沒有事實上的標準。在IE中有三種不同的XHR對象版本:MSXML2.XMLHttp,MSXML2.XMLHttp.3.0和MSXML2.XMLHttp.6.0;

根據這三種版本號,在IE中創建一個XHR對象如下:

function createXHR() { //IE7之前的版本通過這種方式
  var versions = [
    'MSXML2.XMLHttp',
    'MSXML2.XMLHttp.3.0',
    'MSXML2.XMLHttp.6.0'
  ];
  var xhr = null;
  for (var item in versions) {
    try {
      xhr = new ActiveXObject(item); //若不存在該版本,可能會出錯
      if (xhr) break;
    } catch (e) {
      //一般對這種錯誤不做處理
    }
  }
  return xhr;
}
在IE引入這個對象之后,其他瀏覽器廠商也相繼跟隨,這時候XHR對象成為事實上的標準!

跨瀏覽器創建XHR對象;

function createXHttpRequest() {
  if (typeof XMLHttpRequest !== 'undefined') { //不要用 if(XMLHttpRequest){}這種形式,
    return new XMLHttpRequest();              //如果是這種形式在找不到XMLHttpRequest函數的情況下,會報錯。
} else if (typeof ActiveXObject !== 'undefined') {
         return createXHR(); //用到剛才我們創建的函數
  } else { throw new Error('不能創建XMLHttpRequest對象'); } }

1.2.XMLHttpRequest的用法
XMLHttpRequest對象的函數有6個:

open("method",url,boolean);
              //該方法的三個參數,分別為----提交方式"get"或者"post"等 
                // url是相對于執行代碼的當前頁面的路徑(使用絕對路徑是允許的)是否異步 
send();    
           //這個方法接收一個參數,這個參數是作為請求主體發送的數據, 
           //說明: 如果有參數,請使用post方式提交 使用方式如下,send("user="+username+"pwd="+password);
           //如果沒有參數,為了兼容性考慮,必須在參數中傳入null,即send(null);該方式使用get方式提交

abort();       //取消當前響應,關閉連接并且結束任何未決的網絡活動。

          //這個方法把 XMLHttpRequest 對象重置為 readyState 為 0 的狀態,并且取消所有未決             //的網絡活動。例如,如果請求用了太長時間,而且響應不再必要的時候,可以調用這個方法。

getResponseHeader()   

          //返回指定的 HTTP 響應頭部的值。其參數是要返回的 HTTP 響應頭部的名稱??梢允褂萌?            //何大小寫來制定這個頭部名字,和響應頭部的比較是不區分大小寫的。

          //該方法的返回值是指定的 HTTP 響應頭部的值,如果沒有接收到這個頭部或者 readyStat             //e 小于 3 則為空字符串。如果接收到多個有指定名稱的頭部,這個頭部的值被連接起來并             //返回,使用逗號和空格分隔開各個頭部的值。

getAllResponseHeaders()       

          //把 HTTP 響應頭部作為未解析的字符串返回。

          //如果 readyState 小于 3,這個方法返回 null。否則,它返回服務器發送的所有 HTTP 響應的

          //頭部。頭部作為單個的字符串返回,一行一個頭部。每行用換行符 "\r\n" 隔開。

setRequestHeader()

         //向一個打開但未發送的請求設置或添加一個 HTTP 請求。

  XMLHttpRequest對象的屬性有5個:

屬性 描述
responseText 作為響應主題被返回的文本
responseXML 如果相響應的是text/html或者application/xml類型的話,這個屬性將保存著響應的XML文檔
status http的響應狀態碼
statusText http狀態的說明
readyState XMLHttpRequest對象的狀態位 0 1 2 3 4 分別表示5種狀態
timeout 設置超時時間,單位是ms.目前只有IE8+支持---尚未標準化(不推薦使用)

  XMLHttpRequest對象的事件屬性onReadyStateChange:-----所有瀏覽器兼容

  該屬性監聽的是  XMLHttpRequest對象的readyState屬性的變化:

  readyState的變化分別對應如下狀態:

  0:尚未初始化。未調用open()之前

  1:啟動。調用open()之后,但是未調用send();

  2:發送。調用send()但是尚未得到響應。

  3:正在接收數據。剛接收到響應數據開始到接收完成之前。

  4: 完成。數據接收完成。

xhr.onreadystatechange = function () {
 if (xhr.readyState == 4) {
  if (xhr.status >= 200  xhr.status == 300 || xhr.status == 304) {
   alert(xhr.responseText);
   //處理接收的數據
  } else {
   //請求失敗,未得到響應數據
  }
 }
}; //補充說明:注冊事件必須發生在send()以前

XMLHttpRequest對象的事件屬性ontimeout -----僅限IE8+,不過最新的主流高版本瀏覽器也已經實現(不推薦使用)

xhr.timeout=1000;//一秒鐘

xhr.ontimeout=functon(){
  //處理代碼
  ......
}
  這種使用方式有個問題需要注意,就是在超時之后,在接收到數據后仍然會觸發onreadystatechange事件,如果在處理onreadychange事件時訪問xhr.status屬性,會出錯。所以我們在訪問該屬性時需要做一下try{}catch處理。但是,因為這個屬性暫不兼容,所有我們就不重點講了。

XMLHttpRequest對象的事件屬性onload onerror onloadstar onbort onprogress:

                                                                                                   -----非IE瀏覽器和IE 10+已實現

       onload在IE8以上可以實現,大部分事件根據readySate變化均可以實現,以上事件只不過是方便使用而已。

  onload和onprogress 這兩種事件分別對應著readyState=4和readyState=3的情況,使用方式分別如下:

   xhr.onload= function (event) {
      //event只包含一個屬性 event.target=xhr;使用方式只是在readyState=4時差不多..
    }
   xhr.onprogress=function(event){
     //event除了包含event.target=xhr之外,還包含三種屬性
     //lengthComputale(進度信息是否可用),position(已接受字節數)和totalSize(總字節數).
     
   }


補充:有些事件均可以根據readyState的狀態進行模擬。只有有的瀏覽器進行了方便化處理而已。  

3.單向跨域技術 ---CORS
 今天我們這里講的是客戶端網頁向不在同一個域的服務器請求數據..客戶端在收到返回的數據時時,用回調函數處理數據。

即:

 1. 客戶端向域外服務器請求數據

 2.服務器得到響應后向客戶端發送數據。

 3.客戶端根據返回的數據執行回調函數.

 我知道不同域下的iframe也可以進行通信,而且這也是一種跨域通信技術。但是,這種iframe頁面之間的雙向通信,我們在下一個專題里面講解,今天主要講的是單向通信。

3.1.CORS跨域請求的原理
在用xhr(XMLHttpRequest)對象或者xdr(XDomainRequest)對象,發送域外請求時,大概的實現原理如下圖:

 3.2.IE中CORS技術的實現
 IE8引入了一個XDR類型,這個類型與XHR基本類似,但是其能實現安全可靠地跨域通信。

 XHD的特點:

 1.cookie不會隨請求發送,也不會隨響應返回。

 2.只能設置請求頭部中的Content-Type片段。

 3.不能訪問響應頭部信息。

 4.只是支持get和post請求。

 XDR支持onload和onerror事件屬性,且其使用方式和XHR基本一致,不過其open()只接收兩個參數,默認是異步的。


var xdr = new XDomainRequest();
xdr.onload = function () {
 //處理xdr.responseText
}
xdr.onerror = function () {
};
xdr.open('get', '絕對url');
xhr.send(null);


3.3.跨瀏覽器的CORS技術實現

在標準瀏覽器中XHR對象就已經可以自動實現跨域請求,但是XHR和XDR的不同之處:

1.XHR可以在設置 withCredentials =true時,瀏覽器會把cookie發送給服務器,服務器此時通過設置頭部Access-Control-Allow-Credentials:true時來響應。如果,服務器不設置這個屬性,則瀏覽器會觸發onerror事件。

2.在回調函數中可以訪問status和statusText屬性,而且支持同步請求。

 以下是實現跨域請求的代碼:

function createCrosRequest(method, url) {
 var xhr = new XMLHttpRequest(); //IE7+
 if ('withCredentials' in xhr) { //IE8-IE9瀏覽器沒有這個屬性
  xhr.open(method, url, true);
 } else if (typeof XDomainRequest != 'undefined') {
  xhr = new XDomainRequest();  //IE
  xhr.open(method, url)
 }
 return xhr;
}
var request=CreateCrosRequest("get","url");
if(request){
 request.onload=function(){
 //處理request.responseText;
 }
 request.send(null);
}

4.單向跨域技術 ---JSONP技術

 JSONP技術比較簡單,其主要原理主要是利用script標簽的特性。

 script標簽和image標簽一樣,它們都具有src屬性,而且這個屬性是可跨域的。

因為script標簽返回的都是js代碼,且該js代碼會自動執行。所以,如果我們請求返回的數據也是類似一段js代碼的形式,豈不是就可以實現在腳本加載完畢后自動執行。

如果我們的請求,返回的數據是 callback + '(' + json + ')'; 這種形式的數據, 那么在腳本加載完畢之后也就能自動執行callback()函數了.

4.1.客戶端寫法

!DOCTYPE html>
html>
head>
  meta http-equiv="content-type" content="text/html; charset=utf-8">
/head>
body>
    button id="button">請求數據/button>
/body>
script>
  window.onload=function(){
    var button=document.getElementById("ibutton");
    function callback(data){
      //處理data
    }
    button.onclick=function(){
      var script=document.createElement("script");
      script="http://www.sasd.com/json/?callbak=callback"; 
      document.body.insertBefore(script,document.body.firstChild);//加載腳本
      
    }
    
  }
/script>
/html>

   1.客戶端將回調函數名寫入Script>腳本的url參數中。

   2.script加載的時候會發送跨域請求。

4.2.服務器端

 1.通過url得到函數名,命名為callback

 2.將請求的數據作為函數的參數格式轉化json格式,命名為。

 3.將返回結果拼接為 callback+"("+json+")"; --------返回的就是填充式的數據,這段數據在腳本中會自動執行。

 4.返回數據.

 4.3.JSONP技術的缺點

 1.因為是通過url傳參數,所以請求只能是get類型的。

 2.script>目前只有onload屬性事件,onerror還沒有統一化,如果加載腳本出錯,客戶端很難得到反饋。

 3.所請求數據的站點必須是可信任的,如果返回的數據段中注入的有惡意的代碼,危害較大,且難以發現。

以上所述就是本文的全部內容了,希望大家能夠喜歡。

您可能感興趣的文章:
  • AJAX簡單異步通信實例分析
  • ajax實現遠程通信
  • 快速獲取Ajax通信對象的方法

標簽:辛集 紅河 咸寧 荊州 佛山 揭陽 商洛 股票

巨人網絡通訊聲明:本文標題《AJAX機制詳解以及跨域通信》,本文關鍵詞  AJAX,機制,詳解,以及,跨域,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《AJAX機制詳解以及跨域通信》相關的同類信息!
  • 本頁收集關于AJAX機制詳解以及跨域通信的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 天天操天天干天天射| 女教师电影波多野结衣| 91年国产在线| 渔夫风流艳史荡女报恩| 好男人社区www在线播放| 粗大的猛烈的进出校花| 国产三级全黄做爰龚玥菲| 将身体献给涟苍士~那么就来彻 | 扒开芙宁娜?狂揉?难受| 日本三级带黄在线观看| 好大?用力?深一点高潮A片| 出差人妻客串妓女| 国产精品视频人人做人人爱| 国产色| 林静公交车被做到高潮短文| 《漂亮的女邻居5》HD| 我和岳交换夫妇爽4P晓娟小说| 3久女bbbwww| 迪拜高清免费毛片| 永久免费观看40分钟完整大片| 一个色亚洲| 一级一毛片| 欧美gay1069大粗吊| 男人桶女人爽30分钟免费| 被下人伦流澡到高潮H漫画| 耽美肉文调教| 啊轻点灬大ji巴太长太粗| 串珠一颗一颗排出来视频| 一级黄色免费观看| 樱花草WWW视频在线播放| 91麻豆天美国产欧美日韩aV| 少妇婬乱全黄A片免费看| 少妇人妻偷人精品无码| 欧美69视频| 新聞動態螺桿啟閉機電動啟閉機區別 | 91精品免费久久久久久久久| 亚洲日韩欧美AV| 国产嫩草视频| 甘婷婷张开双腿实干十三分钟| 性姿势真人图片| 91国内精品久久久久精品一本|