首頁 web前端 js教程 詳細解答自訂ajax支援跨域元件封裝

詳細解答自訂ajax支援跨域元件封裝

May 22, 2018 am 09:27 AM
ajax 支援 自訂

本篇文章給大家詳細分析了自訂ajax支援跨域元件封裝相關的知識點,對此有興趣的朋友參考學習下。

Class.create()分析

仿prototype建立類別繼承

var Class = {
  create: function () {
    var c = function () {
      this.request.apply(this, arguments);
    }
    for (var i = 0, il = arguments.length, it; i < il; i++) {
      it = arguments[i];
      if (it == null) continue;
      Object.extend(c.prototype, it);
    }
    return c;
  }
};
Object.extend = function (tObj, sObj) { 
  for (var o in sObj) {
    tObj[o] = sObj[o];
  }
  return tObj;
};
登入後複製

ajax定義:ZIP_Ajax=Class.create ();

其中create方法回傳的是建構函數request,這裡相當於var ZIP_Ajax= function(){ this.request.apply(this, arguments); }; 用物件冒充的方式在函數內部執行了一次建構的過程,相當於把建構子任務交給了request方法,這裡的this.request是ZIP_Ajax的實例的方法,而this指向的就是ZIP_Ajax的實例,apply後面的this指向的是ZIP_Ajax,最後根據new關鍵字將this才真正指向ZIP_Ajax類別。有了類別ZIP_Ajax的定義,接下來就可以定義其方法:

XMLHttpRequest詳解:

XMLHttpRequest不是一項技術而是一個內建在主流瀏覽器內的一個可以完全存取http協定的物件。傳統的http請求大部分都是基於form提交請求http,然後回傳一個form。 XMLHttpRequest支援同步請求的同時最大的優點就是支援非同步傳輸接受數據,新建一個ajax請求實際上就是實例化一個XMLHttpRequest物件。簡單介紹一下主要事件及方法:

readystatechange事件:

當XMLHttpRequest發送http請求之後就會激發一個readystatechange事件,事件回傳有五個值, 0,1,2分別代表創建XMLHttpRequest、初始化完成XMLHttpRequest、發送了請求,3代表回應沒結束(即只接收到回應頭資料)4才是真正獲得完整回應。

傳回的status狀態表示伺服器傳回的狀態碼:

常用的有200表示成功回傳數據,301永久重定向,302為暫時重定向(不安全)304讀取的快取資料400表示請求出現語法錯誤,403表示伺服器拒絕請求,404表示請求網頁資源不存在,405找不到指定位置伺服器,408表示請求逾時,500伺服器內部錯誤,505表示伺服器不支援請求的http協議版本。

200-300表示成功,300-400表示重定向,400-500表示請求內容或格式或請求體過大導致錯誤,500 表示伺服器內部錯誤

open方法:

open接收三個參數分別是請求類型(get,post,head等)、url、同步或非同步

send方法:

當請求就緒後會觸發send方法,發送的內容就是請求的資料(如果是get請求則參數為null;

請求成功之後會執行success自訂方法,其參數為傳回資料;

ajax跨網域:

什麼是跨網域? .com請求資料就出現了因為網域不一致導致的跨域問題。 window.location.protocol window.location.host來判斷例如http://www.baidu.com.

js解決跨域問題幾種方案? .domain iframe

對於主域相同而子域不同的請求可以使用域名iframe作為解決辦法。 .html

以及hi.a.com/b.html,我們可以在兩個html檔案中加上document.domain="a.com",之後透過在a檔案中建立一個iframe去控制iframe的contentDocument,這樣兩個檔案就可以對話了。 html檔案中

document.domain="a.com";

問題:

1、安全性,當一個網站(hi.a.com)被攻擊之後,另一個網站(www.a.com)會造成安全漏洞。 #2、動態創建script(傳說中jsonp方式)

瀏覽器預設禁止跨網域訪問,但不禁止在頁面中引用其他網域的js文件,並且可以執行引入js檔案中的方法等,根據這點我們可以透過建立script節點方法來實現完全跨域的通訊。實作步驟為:

a.在請求發起方頁面動態載入一個script,script的url指向接收方的後台,該位址傳回的javascript方法會被發起方執行,url可以傳參並僅支持get提交參數。

b.載入script腳本時候呼叫跨域的js方法進行回呼處理(jsonp)。

舉例如下:

發起方

document.domain="a.com";
  var selfFrame=document.createElement("iframe");
  selfFrame.src="http://hi.a.com/b.html";
  selfFrame.style.display="none";
  document.body.appendChild(selfFrame);
  selfFrame.onload=function(){
    var doc=selfFrame.contentDocument||selfFrame.contentWindow.document;//得到操作b.html权限
    alert(doc.getElementById("ok_b").innerHTML());//具体操作b文件中元素
  }
登入後複製
接收方:

接收方只需要傳回執行函數,執行函數就是請求中的callback並賦參數。

3、使用html5的postMessage:

html5新功能有一个就是跨文档消息传输,如今大部分浏览器都已经支持并使用(包括ie8+),其支持基于web的实时消息传递并且不存在跨域问题。postMessage一般会跟iframe一起使用。

举例如下:

父页面:

<iframe id="myPost" src="http//www.a.com/main.html"></iframe>
window.onload=function(){
  document.getElementById("myPost").contentWindow.postMessage("显示我","http://www.a.com")
  //第二个参数表示确保数据发送给适合域名的文档
}
a.com/main.html页面:
window.addEventListener("message",function(event){
  if(event.origin.indexOf("a.com")>-1){
    document.getElementById("textArea").innerHTML=event.data;
  }
},false)
<body>
  <p>
    <span id="textArea"></span>
  </p>
</body>
登入後複製

这样在父页面加载完成后main.html页面的textArea部分就会显示"显示我"三个字

ajax方法封装code:

ZIP_Ajax.prototype={
  request:function(url options){
    this.options=options;
    if(options.method=="jsonp"){//跨域请求
      return this.jsonp();
    }
    var httpRequest=this.http();
    options=Object.extend({method: &#39;get&#39;,
      async: true},options||{});
    
    if(options.method=="get"){
      url+=(url.indexOf(&#39;?&#39;)==-1?&#39;?&#39;:&#39;&&#39;)+options.data;
      options.data=null;
    }
    httpRequest.open(options.method,url,options.async);
    if (options.method == &#39;post&#39;) {
      httpRequest.setRequestHeader(&#39;Content-type&#39;, &#39;application/x-www-form-urlencoded; charset=UTF-8&#39;);
    }
    httpRequest.onreadystatechange = this._onStateChange.bind(this, httpRequest, url, options);
    httpRequest.send(options.data || null);//get请求情况下data为null
    return httpRequest;
  },
  jsonp:function(){
    jsonp_str = &#39;jsonp_&#39; + new Date().getTime();
    eval(jsonp_str + &#39; = &#39; + this.options.callback + &#39;;&#39;);    
    this.options.url += &#39;?callback=&#39; + jsonp_str;
    for(var i in this.options.data) {
      this.options.url += &#39;&&#39; + i + &#39;=&#39; + this.options.data[i];
    } 
    var doc_head = document.getElementsByTagName("head")[0],
      doc_js = document.createElement("script"),
      doc_js.src = this.options.url;
    doc_js.onload = doc_js.onreadystatechange = function(){
       if (!this.readyState || this.readyState == "loaded" || this.readyState == "complete"){
         //清除JS
         doc_head.removeChild(doc_js);      
        }
      }   
      doc_head.appendChild(doc_js);
  },
  http:function(){//判断是否支持xmlHttp
    if(window.XMLHttpRequest){
      return new XMLHttpRequest();
    }
    else{
      try{
        return new ActiveXObject(&#39;Msxml2.XMLHTTP&#39;)
      }
      catch(e){
        try {
          return new ActiveXObject(&#39;Microsoft.XMLHTTP&#39;);
        } catch (e) {
          return false;
        }
      }
    }
  },
  _onStateChange:function(http,url,options){
    if(http.readyState==4){
      http.onreadystatechange=function(){};//重置事件为空
      var s=http.status;
      if(typeof(s)==&#39;number&#39;&&s>200&&s<300){
        if(typeof(options.success)!=&#39;function&#39;)return;
        var format=http;
        if(typeof(options.format)==&#39;string&#39;){//判断请求数据格式
          switch(options.format){
            case &#39;text&#39;:
              format=http.responseText;
              break;
            case &#39;json&#39;:
              try{
                format=eval(&#39;(&#39;+http.responseText+&#39;)&#39;);
              }
              catch (e) {
                if (window.console && console.error) console.error(e);
              }
              break;
            case &#39;xml&#39;:
              format=http.responseXML;
              break;
          }
        }
      options.success(format);//成功回调
      }
      else {//请求出问题后处理
        if (window.closed) return;
        if (typeof (options.failure) == &#39;function&#39;) {
          var error = {
            status: http.status,
            statusText: http.statusText
          }
          //  判断是否是网络断线或者根本就请求不到服务器
          if (http.readyState == 4 && (http.status == 0 || http.status == 12030)) {
            //  是
            error.status = -1;
          }
          options.failure(error);
        }
      }
    } 
  }
};
登入後複製

使用方法:

ajax调用举例:

var myAjax=new ZIP_Ajax("http://www.a.com/you.php",{
  method:"get",
  data:"key=123456&name=yuchao",
  format:"json",
  success:function(data){
    ......
  }
})
跨域请求调用举例:
var jsonp=new ZIP_Ajax("http://www.a.com/you.php",{
  method:"jsonp",
  data:{key:"123456",name:"yuchao"},
  callback:function(data){
    ......
  }
})
登入後複製

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

MUi框架ajax请求WebService接口实例_AJAX相关

Struts2和Ajax数据交互(图文教程)

原生ajax写的上拉加载实例(图文教程)

以上是詳細解答自訂ajax支援跨域元件封裝的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在Netflix中快速設定自訂頭像 如何在Netflix中快速設定自訂頭像 Feb 19, 2024 pm 06:33 PM

Netflix上的頭像是你串流媒體身分的視覺化代表。使用者可以超越預設的頭像來展現自己的個性。繼續閱讀這篇文章,了解如何在Netflix應用程式中設定自訂個人資料圖片。如何在Netflix中快速設定自訂頭像在Netflix中,沒有內建功能來設定個人資料圖片。不過,您可以透過在瀏覽器上安裝Netflix擴充功能來實現此目的。首先,在瀏覽器上安裝Netflix擴充功能的自訂個人資料圖片。你可以在Chrome商店買到它。安裝擴充功能後,在瀏覽器上開啟Netflix並登入您的帳戶。導航至右上角的個人資料,然後點擊

Eclipse中自訂快捷鍵設定的方法 Eclipse中自訂快捷鍵設定的方法 Jan 28, 2024 am 10:01 AM

如何在Eclipse中自訂快捷鍵設定?身為開發人員,在使用Eclipse進行編碼時,熟練快捷鍵是提高效率的關鍵之一。 Eclipse作為一個強大的整合開發環境,不僅提供了許多預設的快捷鍵,還允許使用者根據自己的偏好進行個人化的客製化。本文將介紹如何在Eclipse中自訂快捷鍵設置,並給出具體的程式碼範例。打開Eclipse首先,打開Eclipse,並進入

解決jQuery AJAX請求遇到403錯誤的方法 解決jQuery AJAX請求遇到403錯誤的方法 Feb 20, 2024 am 10:07 AM

標題:解決jQueryAJAX請求出現403錯誤的方法及程式碼範例403錯誤是指伺服器禁止存取資源的請求,通常會導致出現這個錯誤的原因是請求缺少權限或被伺服器拒絕。在進行jQueryAJAX請求時,有時會遇到這種情況,本文將介紹如何解決這個問題,並提供程式碼範例。解決方法:檢查權限:首先要確保請求的URL位址是正確的,同時驗證是否有足夠的權限來存取該資

edius自訂螢幕佈局的操作流程 edius自訂螢幕佈局的操作流程 Mar 27, 2024 pm 06:50 PM

1.下圖是edius預設的螢幕佈局,預設的EDIUS視窗佈局是橫向版式,因此在單一顯示器環境中,許多視窗是重疊在一起的,且預覽視窗為單一視窗模式。 2、您可以透過【檢視】選單列啟用【雙視窗模式】,使預覽視窗同時顯示播放視窗和錄製視窗。 3.您可以透過【檢視功能表列>視窗佈局>常規】來恢復預設螢幕佈局。另外您也可以自訂適合您的佈局方式,並儲存為常用螢幕佈局:將視窗拖曳成適合自己的佈局,然後點擊【檢視>視窗佈局>儲存目前佈局>新建】,在彈出的【儲存目前佈局】小視窗中輸入佈局名稱,按確定

PyCharm社群版支援的插件足夠嗎? PyCharm社群版支援的插件足夠嗎? Feb 20, 2024 pm 04:42 PM

PyCharm社群版支援的插件足夠嗎?需要具體程式碼範例隨著Python語言在軟體開發領域的應用越來越廣泛,PyCharm作為一款專業的Python整合開發環境(IDE),備受開發者青睞。 PyCharm分為專業版和社群版兩個版本,其中社群版是免費提供的,但其外掛程式支援相對專業版有所限制。那麼問題來了,PyCharm社群版支援的插件夠嗎?本文將透過具體的程式碼範例

解決jQuery AJAX請求403錯誤的方法 解決jQuery AJAX請求403錯誤的方法 Feb 19, 2024 pm 05:55 PM

jQuery是一個受歡迎的JavaScript函式庫,用來簡化客戶端端的開發。而AJAX則是在不重新載入整個網頁的情況下,透過發送非同步請求和與伺服器互動的技術。然而在使用jQuery進行AJAX請求時,有時會遇到403錯誤。 403錯誤通常是伺服器禁止存取的錯誤,可能是由於安全性原則或權限問題導致的。在本文中,我們將討論如何解決jQueryAJAX請求遭遇403錯誤

優缺點分析:深入了解開源軟體的優缺點 優缺點分析:深入了解開源軟體的優缺點 Feb 23, 2024 pm 11:00 PM

開源軟體的利與弊:了解開源專案的優劣勢,需要具體程式碼範例在當今數位化時代,開源軟體越來越受到關注和推崇。作為一種基於合作和分享精神的軟體開發模式,開源軟體在不同領域都有廣泛的應用。然而,儘管開源軟體具有諸多優勢,但也存在一些挑戰和限制。本文將深入探討開源軟體的利與弊,並透過具體的程式碼範例展示開源專案的優劣勢。一、開源軟體的優勢1.1開放性與透明性開源軟體

excel怎麼自訂x軸和y軸? (excel座標軸刻度如何自訂) excel怎麼自訂x軸和y軸? (excel座標軸刻度如何自訂) Mar 14, 2024 pm 02:10 PM

  在excel表格中,有時候可能需要插入座標軸,能夠更直觀地看到資料的變化趨勢。還有些小夥伴不清楚怎麼在表中插入座標軸,接下來小編就跟大家分享一下excel自訂座標軸刻度的方法吧。  座標軸插入方法:  1、在excel介面中,選取資料。  2、在插入介面中,點選插入長條圖或長條圖。  3、在展開的介面中,選擇形圖類型。  4、在表格右鍵介面中,點選選擇資料。  5、在展開的介面中,進行自訂即可。

See all articles