史上最全ajax全套

来源:http://www.cnblogs.com/aylin/archive/2016/08/05/5732242.html
-Advertisement-
Play Games

ajax簡介 AJAX即“Asynchronous Javascript And XML”(非同步JavaScript和XML),是指一種創建互動式網頁應用的網頁開發技術。Ajax不是一種新的編程語言,而是使用現有標準的新方法。AJAX可以在不重新載入整個頁面的情況下,與伺服器交換數據。這種非同步交互的 ...


ajax簡介

AJAX即“Asynchronous Javascript And XML”(非同步JavaScript和XML),是指一種創建互動式網頁應用的網頁開發技術。Ajax不是一種新的編程語言,而是使用現有標準的新方法。AJAX可以在不重新載入整個頁面的情況下,與伺服器交換數據。這種非同步交互的方式,使用戶單擊後,不必刷新頁面也能獲取新數據。使用Ajax,用戶可以創建接近本地桌面應用的直接、高可用、更豐富、更動態的Web用戶界面。

Ajax包括:

  • XHTML和CSS
  • 使用文檔對象模型(Document Object Model)作動態顯示和交互
  • 使用XML和XSLT做數據交互和操作
  • 使用XMLHttpRequest進行非同步數據接收

利用AJAX可以做:

  • 註冊時,輸入用戶名自動檢測用戶是否已經存在。
  • 登陸時,提示用戶名密碼錯誤
  • 刪除數據行時,將行ID發送到後臺,後臺在資料庫中刪除,資料庫刪除成功後,在頁面DOM中將數據行也刪除。(博客園)

ajax偽造

 iframe就是我們常用的iframe標簽:<iframe>。iframe標簽是框架的一種形式,也比較常用到,iframe一般用來包含別的頁面,例如我們可以在我們自己的網站頁面載入別人網站或者本站其他頁面的內容。iframe標簽的最大作用就是讓頁面變得美觀。iframe標簽的用法有很多,主要區別在於對iframe標簽定義的形式不同,例如定義iframe的長寬高。

因此,iframe標簽具有局部載入內容的特性,所以可以使用其來偽造Ajax請求。

<!DOCTYPE html>
<html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>偽造AJAX</title>
    </head>
    <body>
        <div>
            <p>請輸入要載入的地址:<span id="currentTime"></span></p>
            <p>
                <input id="url" type="text" />
                <input type="button" value="提交" onclick="LoadPage();">
            </p>
        </div>
        <div>
            <h3>載入頁面位置:</h3>
            <iframe id="iframePosition" style="width: 100%;height: 500px;"></iframe>
        </div>
        <script type="text/javascript">
            window.onload= function(){
                var myDate = new Date();
                document.getElementById('currentTime').innerText = myDate.getTime();
 
            };
            function LoadPage(){
                var targetUrl =  document.getElementById('url').value;
                document.getElementById("iframePosition").src = targetUrl;
            }
        </script>
    </body>
</html>

原理是這樣的,設置一個提交按鈕,再設置一個輸入框,當我們輸入一個網址的時候,在當前的頁面載入輸入網址的頁面信息,呈現在iframe框里,這樣就能做到不刷新URL來提交不同的信息。

原生ajax

 Ajax的核心是XMLHttpRequest對象(XHR)。XHR為向伺服器發送請求和解析伺服器響應提供了介面。能夠以非同步方式從伺服器獲取新數據。

一、XMLHttpRequest對象

Ajax的核心是XMLHttpRequest對象(XHR)。XHR為向伺服器發送請求和解析伺服器響應提供了介面。能夠以非同步方式從伺服器獲取新數據。

XHR的主要方法有:

1. void open(String method,String url,Boolen async)   
   用於創建請求    
   參數:
       method: 請求方式(字元串類型),如:POST、GET、DELETE...
       url:    要請求的地址(字元串類型)
       async:  是否非同步(布爾類型)
2. void send(String body) 用於發送請求 參數: body: 要發送的數據(字元串類型)
3. void setRequestHeader(String header,String value) 用於設置請求頭 參數: header: 請求頭的key(字元串類型) vlaue: 請求頭的value(字元串類型) 4. String getAllResponseHeaders() 獲取所有響應頭 返回值: 響應頭數據(字元串類型) 5. String getResponseHeader(String header) 獲取響應頭中指定header的值 參數: header: 響應頭的key(字元串類型) 返回值: 響應頭中指定的header對應的值 6. void abort() 終止請求

XHR的主要屬性有:

1. Number readyState
   狀態值(整數),可以確定請求/響應過程的當前活動階段
  • 0:未初始化。未調用open()方法
  • 1:啟動。已經調用open()方法,未調用send()方法
  • 2:發送。已經調用send()方法,未接收到響應
  • 3:接收。已經接收到部分數據
  • 4:完成。已經接收到全部數據,可以在客戶端使用

2. Function onreadystatechange
當readyState的值改變時自動觸發執行其對應的函數(回調函數)

3. String responseText                        作為響應主體被返回的文本(字元串類型)

4. XmlDocument responseXML 伺服器返回的數據(Xml對象)

5. Number states 狀態碼(整數),如:200、404...

6. String statesText 狀態文本(字元串),如:OK、NotFound...

 二、get請求

GET用於向伺服器查詢某些信息:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

    <h1>XMLHttpRequest - Ajax請求</h1>
    <input type="button" onclick="XmlGetRequest();" value="Get發送請求" />

    <script src="/statics/jquery-1.12.4.js"></script>
    <script type="text/javascript">

        function GetXHR(){
            var xhr = null;
            if(XMLHttpRequest){
                xhr = new XMLHttpRequest();
            }else{
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
            return xhr;
        }
        function XmlGetRequest(){
            var xhr = GetXHR();
            // 定義回調函數
            xhr.onreadystatechange = function(){
                if(xhr.readyState == 4){
                    // 已經接收到全部響應數據,執行以下操作
                    var data = xhr.responseText;
                    console.log(data);
                }
            };
            // 指定連接方式和地址----文件方式
            xhr.open('get', "/test/", true);
            // 發送請求
            xhr.send();
        }
    </script>
</body>
</html>
get

三、post請求

POST請求用於向伺服器發送應該被保存的數據。POST請求的主體可以包含非常多的數據,而且格式不限。

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>POST</title>
</head>
<body>

    <h1>XMLHttpRequest - Ajax請求</h1>
    <input type="button" onclick="XmlPostRequest();" value="Post發送請求" />

    <script src="/statics/jquery-1.12.4.js"></script>
    <script type="text/javascript">

        function GetXHR(){
            var xhr = null;
            if(XMLHttpRequest){
                xhr = new XMLHttpRequest();
            }else{
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
            return xhr;
        }
        function XmlPostRequest(){
            var xhr = GetXHR();
            // 定義回調函數
            xhr.onreadystatechange = function(){
                if(xhr.readyState == 4){
                    // 已經接收到全部響應數據,執行以下操作
                    var data = xhr.responseText;
                    console.log(data);
                }
            };
            // 指定連接方式和地址----文件方式
            xhr.open('POST', "/test/", true);
            // 設置請求頭
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8');
            // 發送請求
            xhr.send('n1=1;n2=2;');
        }
    </script>
</body>
</html>
post

jquery ajax

jQuery 提供多個與 AJAX 有關的方法。

通過 jQuery AJAX 方法,您能夠使用 HTTP Get 和 HTTP Post 從遠程伺服器上請求文本、HTML、XML 或 JSON - 同時您能夠把這些外部數據直接載入網頁的被選元素中。

  • jQuery 不是生產者,而是大自然搬運工。
  • jQuery Ajax本質 XMLHttpRequest 或 ActiveXObject 

註:2.+版本不再支持IE9以下的瀏覽器

1. jQuery.get(...)
       所有參數:
              url: 待載入頁面的URL地址
             data: 待發送 Key/value 參數。
          success: 載入成功時回調函數。
         dataType: 返回內容格式,xml, json,  script, text, html

2.jQuery.post(...)
       所有參數:
              url: 待載入頁面的URL地址
             data: 待發送 Key/value 參數
          success: 載入成功時回調函數
         dataType: 返回內容格式,xml, json,  script, text, html

3.jQuery.getJSON(...)
       所有參數:
              url: 待載入頁面的URL地址
             data: 待發送 Key/value 參數。
          success: 載入成功時回調函數。

4.jQuery.getScript(...)
       所有參數:
              url: 待載入頁面的URL地址
             data: 待發送 Key/value 參數。
          success: 載入成功時回調函數。

5.jQuery.ajax(...)
       部分參數:
              url:請求地址
             type:請求方式,GET、POST(1.9.0之後用method)
          headers:請求頭
             data:要發送的數據
      contentType:即將發送信息至伺服器的內容編碼類型(預設: "application/x-www-form-urlencoded; charset=UTF-8")
            async:是否非同步
          timeout:設置請求超時時間(毫秒)
       beforeSend:發送請求前執行的函數(全局)
         complete:完成之後執行的回調函數(全局)
          success:成功之後執行的回調函數(全局)
            error:失敗之後執行的回調函數(全局)
          accepts:通過請求頭髮送給伺服器,告訴伺服器當前客戶端課接受的數據類型
         dataType:將伺服器端返回的數據轉換成指定類型
            "xml": 將伺服器端返回的內容轉換成xml格式
           "text": 將伺服器端返回的內容轉換成普通文本格式
           "html": 將伺服器端返回的內容轉換成普通文本格式,在插入DOM中時,如果包含JavaScript標簽,則會嘗試去執行。
         "script": 嘗試將返回值當作JavaScript去執行,然後再將伺服器端返回的內容轉換成普通文本格式
           "json": 將伺服器端返回的內容轉換成相應的JavaScript對象
          "jsonp": JSONP 格式使用 JSONP 形式調用函數時,如 "myurl?callback=?" jQuery 將自動替換 ? 為正確的函數名,以執行回調函數
方法列表

寫一個最簡單的例子:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <p>
        <input type="button" onclick="XmlSendRequest();" value='Ajax請求' />
    </p>
    <script type="text/javascript" src="jquery-1.12.4.js"></script>
    <script>
        function JXmlSendRequest(){
            $.ajax({
                url: "http://c2.com:8000/test/",    // 訪問url地址
                type: 'GET',                        // get方式提交
                dataType: 'text',            // 數據類型
                success: function(data, statusText, xmlHttpRequest){  // 成功後返回的結果
                    console.log(data);
                }
            })
        }
    </script>
</body>
</html>

跨域ajax

由於瀏覽器存在同源策略機制,同源策略阻止從一個源載入的文檔或腳本獲取或設置另一個源載入的文檔的屬性。所以ajax本身是不可以跨域的,通過產生一個script標簽來實現跨域。因為script標簽的src屬性是沒有跨域的限制的。

瀏覽器同源策略並不是對所有的請求均制約:

  • 制約: XmlHttpRequest
  • 不制約: img、iframe、script等具有src屬性的標簽

註:自己模擬跨域,需要現在自己電腦的host文件裡面添加兩條功能變數名稱,我這裡添加的是zhangyanlin.com和aylin.com這兩個功能變數名稱

一、JSONP實現跨域請求

JSONP是一個非官方的協議,它允許在伺服器端集成Script tags返回至客戶端,通過javascript callback的形式實現跨域訪問。jsonp只能通過get方式進行跨域請求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <input  type="button" value="Ajax" onclick="DoAjax();"/>
    <input  type="button" value="JsonpAjax" onclick="JsonpAjax();"/>

    <script src="/statics/jquery-1.12.4.js"></script>
    <script src="http://aylin.com:8002/statics/jquery.cookie.js"></script>
    <script>
        function func(arg) {
            console.log(arg);  // 輸出結果就是python代碼給傳過來的列表[11,22,33,]
        }
        function DoAjax() {
            $.ajax({
                url: 'http://alex.com:8002/index',
                type: 'POST',
                data: {'k1': 'v1'},
                success: function (arg) {
                    console.log(arg);
                }               
            });
        }
        function JsonpAjax() {
//            var tag = document.createElement('script');
//            tag.src = "http://alex.com:8002/index";
//            document.head.appendChild(tag);
//            document.head.removeChild(tag);
            $.ajax({
                url: "http://aylin.com:8002/index",
                dataType: 'jsonp',
                jsonpCallBack: 'func'   // 對端給返回函數名,函數接收的參數是內容
            })
        }
    </script>
</body>
</html>

aylin.com功能變數名稱這邊可以給定義函數

# 採用pythontornado框架來進行的
class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('func([11,22,33]);')
    def post(self, *args, **kwargs):
        self.write('t2.post')

在這裡jsonp就採用script標簽的src來進行跨域請求的

 二、CORS

上面那種方法說到瀏覽器的同源策略導致ajax無法進行跨域傳輸,那麼這種方法就可以突破瀏覽器限制來進行傳輸。當數據發送給對方功能變數名稱的時候,對方已經收到,但是在返回的時候被瀏覽器給阻擋,我們可以寫一串類似於身份證的字元串,通過瀏覽器的預檢,從而達到數據的傳輸。

這方面分為簡單請求和非簡單請求

條件:
    1、請求方式:HEAD、GET、POST
    2、請求頭信息:
        Accept
        Accept-Language
        Content-Language
        Last-Event-ID
        Content-Type 對應的值是以下三個中的任意一個
                                application/x-www-form-urlencoded
                                multipart/form-data
                                text/plain
 
註意:同時滿足以上兩個條件時,則是簡單請求,否則為複雜請求

簡單請求只一次請求,而複雜請求是兩次請求,在發送數據之前會先發一次請求用於做“預檢”,只有“預檢”通過後才再發送一次請求用於數據傳輸。

基於cors實現AJAX請求:

1、支持跨域,簡單請求

伺服器設置響應頭:Access-Control-Allow-Origin = '功能變數名稱' 或 '*'

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

    <p>
        <input type="submit" onclick="XmlSendRequest();" />
    </p>

    <p>
        <input type="submit" onclick="JqSendRequest();" />
    </p>

    <script type="text/javascript" src="jquery-1.12.4.js"></script>
    <script>
        function XmlSendRequest(){
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function(){
                if(xhr.readyState == 4) {
                    var result = xhr.responseText;
                    console.log(result);
                }
            };
            xhr.open('GET', "http://c2.com:8000/test/", true);
            xhr.send();
        }

        function JqSendRequest(){
            $.ajax({
                url: "http://c2.com:8000/test/",
                type: 'GET',
                dataType: 'text',
                success: function(data, statusText, xmlHttpRequest){
                    console.log(data);
                }
            })
        }


    </script>
</body>
</html>
HTML
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.set_header('Access-Control-Allow-Origin', "http://www.xxx.com")
        self.write('{"status": true, "data": "seven"}')
tornado

2、支持跨域,複雜請求

由於複雜請求時,首先會發送“預檢”請求,如果“預檢”成功,則發送真實數據。

  • “預檢”請求時,允許請求方式則需伺服器設置響應頭:Access-Control-Request-Method
  • “預檢”請求時,允許請求頭則需伺服器設置響應頭:Access-Control-Request-Headers
  • “預檢”緩存時間,伺服器設置響應頭:Access-Control-Max-Age
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

    <p>
        <input type="submit" onclick="XmlSendRequest();" />
    </p>

    <p>
        <input type="submit" onclick="JqSendRequest();" />
    </p>

    <script type="text/javascript" src="jquery-1.12.4.js"></script>
    <script>
        function XmlSendRequest(){
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function(){
                if(xhr.readyState == 4) {
                    var result = xhr.responseText;
                    console.log(result);
                }
            };
            xhr.open('PUT', 	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、NumPy 是什麼 NumPy 是 Python 科學計算的基礎包,它專為進行嚴格的數字處理而產生。在之前的隨筆里已有更加詳細的介紹,這裡不再贅述。 利用 Python 進行數據分析(一)簡單介紹 二、ndarray 是什麼 ndarray 是一個多維的數組對象,具有矢量算術運算能力和複雜的廣播 ...
  • 原題鏈接http://acm.hust.edu.cn/vjudge/contest/121397#problem/A 題意:t組數據,每組一個n 求 1+1/2+1/3+1/4 ......+1/n的和 方法:打表 沒100個存一個,不夠100的跑一趟 #include <iostream>#inc ...
  • 解析優化 參見之前介紹的DNS過程,如下圖: 基於可控和容災的需要,移動端代碼一般不會hardcode 推流、播放的伺服器IP地址,而選用功能變數名稱代替。在IP出現宕機或網路中斷的情況下,還可以通過變更DNS來實現問題IP的剔除。而功能變數名稱的解析時間需要幾十毫秒至幾秒不等,對於新生成熱度不高的功能變數名稱,一般的平均 ...
  • QStatusBa,狀態欄是位於主視窗的最下方,提供一個顯示工具提示等信息的地方。QMainWindow類裡面就有一個statusBar()函數,用於實現狀態欄的調用。以下例子都在QMainWindow的視窗前提下運行。 1.狀態欄添加 QLabel QLabel *msgLabel = new Q ...
  • QWhatsThis,為任何widget提供簡單的描述,回答"What's This?"這個問題。 示例:(在MainWindow下運行) 定義全局變數 QAction *newAct; QMenu *fileMenu; void MainWindow::creatActions() { newAc ...
  • 開發和測試向來就是一對冤家,再加上產品再添一把火,不吵才是奇跡呢。所以一般我們開發的時候儘可能的減少一些小的失誤,比如說獲取的數值為空,判定條件不充分、當然還有面對測試人員測試時將軟體暴力測試,出現一些網路解析數據的延遲有時也是無法避免的。可是這些確實是一些困擾。但是為了提高開發的效率,犯這些小錯誤 ...
  • 本文為原創文章,轉載請註明出處,謝謝 數據的發佈與訂閱 1、應用 服務端監聽數據改變,客戶端創建/更新節點數據,客戶端提供數據,服務端處理 2、原理 客戶端監控節點數據改變事件(例如配置信息,下圖的config節點),啟動時在伺服器節點下創建臨時節點(圖中servers下節點) 服務端監聽工作伺服器 ...
  • 1.定義 定義對象間一種一對多的依賴關係,使得當每一個對象改變狀態,則所有依賴於它的對象都會得到通知並自動更新。 2.類圖 3.代碼示例 我們定義一個場景:熱水壺在燒開水,小孩和媽媽都關註燒開水的過程,各自有其處理方法。用while死迴圈一直輪詢雖然可以實現這樣的場景,但性能上讓人無法接受。 為方便 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...