1. 程式人生 > >Ajax原理介紹(結合php示例)

Ajax原理介紹(結合php示例)

    Ajax = Asynchronous JavaScript and XML (非同步的JavaScript和XML),Ajax是一種用於建立快速動態網頁的技術。Ajax最大的優點就是在不重新載入整個頁面的情況下,可以與伺服器交換資料並更新部分網頁內容。
    傳統的網頁(不使用Ajax)如果需要更新內容,必須重新載入整個網頁。
現在大部分網頁都是使用ajax ,比如,我在百度輸入Ajax的時候,下面會出現很多有關ajax的內容,這其中用到的就是ajax知識。還有新浪微博(在訪問新浪微博時,當你看到一大半了,會自動幫我們載入更多的微博,同時頁面並沒有重新整理)、Google地圖等等。
                                     百度中的ajax運用示例
這裡寫圖片描述


         ajax是與伺服器進行互動的,這裡我們使用後臺語言php進行演示,再演示之前需要配置php的環境,這裡選用wamp 作為學習環境,wamp的安裝包:
這裡寫圖片描述
       這個安裝方法,可以上網百度,這裡暫不做介紹,但是需要注意的是:
        1.當你執行網頁的時候,一定要保證伺服器是開啟的,即啟動完成能夠在工作列的右下角看到這個圖示即表示成功。
這裡寫圖片描述
       2.php檔案一定要放在配置的網站目錄下,即www檔案下(具體視你安裝的情況而定)。
開啟瀏覽器輸入127.0.0.1檢視顯示的內容,如果是第一次安裝,預設顯示的應該是如下圖片:
這裡寫圖片描述
127.0.0.1含義: 127.0.0.1是回送地址,指本地機,一般用來測試使用。
在進入正題之前,我們還需要了解瀏覽器是如何與伺服器進行通訊的。

瀏覽器與伺服器通訊遵循HTTP協議

         瀏覽器向伺服器提交資料的兩種方式是post 和get方式。
在這裡我們用form表單元素演示get 與post方式。
Get方式,get.html頁面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>get方式向伺服器提交資料</title>

</head>
<body>
<h1>get請求</h1>
<form action="get.php" method="get"> <input type="text" name="userName" placeholder="請輸入姓名..."> <br> <input type="password" name="pass" placeholder="請輸入密碼"> <br> <input type="submit" value="提交"> </form> </body> </html>

get.php

<?php
    // 規範編碼格式 utf-8 
    header('content-type:text/html;charset=utf-8');
    //echo '';輸出語句 
    //$_GET 是php中定義的全域性變數,userName是input中的name屬性值 name="userName"
    //.是php中的拼接符合 相當於js中的+
    echo $_GET['userName'].'歡迎你!';

?>

介面展示:
這裡寫圖片描述
需要注意:url位址列:
這裡寫圖片描述
當我提交資料之後:
這裡寫圖片描述
url位址列:
這裡寫圖片描述
會發現在請求的頁面後面多了我提交的內容即userName=Sugar以及pass=123 (多麼隱私的資訊都暴漏了)
利用除錯工具,找到Netwrok ,會發現,其代表的含義:
這裡寫圖片描述
我們再來看post方法:
post.html (只是把請求的頁面action改為post.php 請求方法method改為post)

<form action="post.php" method="post">
        <input type="text" name="userName" placeholder="請輸入姓名...">
        <br>
        <input type="password" name="pass" placeholder="請輸入密碼">
        <br>
        <input type="submit" value="提交">
   </form>

post.php頁面

<?php
    header('content-type:text/html;charset=utf-8');
    echo $_POST['userName'].'你好!你的密碼是'.$_POST['pass'];
?>

注意:請求方法是post 方法,所以php頁面的全域性變數用的是$_POST
頁面展示:
這裡寫圖片描述
url位址列:
這裡寫圖片描述
提交資料之後,返回的頁面是:
這裡寫圖片描述

url位址列:
這裡寫圖片描述
會發現:用post提交資料,位址列url中不會拼接提交的資料
這裡寫圖片描述
通過對比:瞭解到get與post提交資料的方式:
    get提交資料,會把提交的資料拼接在url之後,其他人可以看到
    post提交資料,在url中看不到,但僅僅也比get提交安全一點點,因為利用抓包工具還是可以檢視提交的資料的(這個自行百度瞭解)
    在每次提交資料的時候,用除錯工具檢視時,會發現,不管是get還是post方式,在NETWORK ->Header中都會有請求頭、響應頭、提交的資料與請求的地址url 、請求方法、以及狀態碼。
    這是因為瀏覽器向伺服器請求資料,伺服器給瀏覽器返回資料,這之間是遵循HTTP協議的。一個完整的HTTP請求有兩部分組成:請求報文(瀏覽器發出) 響應報文(伺服器接收到請求以後,返回給瀏覽器的)

  前面鋪墊了辣麼多,正式進入正題:
Ajax通過與後臺伺服器通訊,實現非同步重新整理,遵循的也是HTTP協議。回想一下一個完整的http請求包括:
(1) 請求的網址url,方法:get/post
(2) 提交請求內容 資料,請求主體等
(3) 接收響應的內容
    那麼Ajax實現非同步更新資料的方式也應該是首先發出http請求(請求報文),這包括
請求的url,請求的方法,把請求發出去
接收http請求(響應報文):通過註冊事件的方式接收返回的值
完整的描述一下,ajax的工作過程
1. 建立XMLHTTPRequest物件
2. 設定請求的url等引數
3. 傳送請求
4. 註冊事件
5. 在註冊事件中獲取返回的內容,並修改頁面顯示,實現區域性重新整理
原理知道了,實踐一下吧:(還是通過get和post方式)
get_ajax.html

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

</head>
<body>
    <h1>使用get方式傳送資料</h1>
    <input type="text"  name="content" class="con"></input>
    <input type="button" value="提交" id="btn"></input>

</body>
</html>
<script type="text/javascript">
    // 繫結點選事件
    document.querySelector('#btn').onclick= function(){
        // 傳送ajax請求的5個步驟
        //1.建立非同步物件
        var ajax = new XMLHttpRequest();

        //2.設定請求的url等引數
        /*引數1:請求的方法
        引數2:請求的url ,get提交的資料是直接追加在url後面的
        格式為xxx.php?xxx=xxx
        這裡動態傳遞引數
        getAjax.php?content='+document.querySelector('.con').value
        */

        ajax.open('get','getAjax.php?content='+document.querySelector('.con').value);
        //3.傳送請求
        ajax.send();
        //4.註冊事件
        ajax.onreadystatechange = function(){
            // 為了保證資料完整的回來,我們一般會判斷兩個值
            if (ajax.readyState ==4 && ajax.status==200) {
                // 如果能夠進入這個判斷,說明請求的頁面存在,且返回資料
                //5.在註冊事件中 獲取返回的內容,並修改頁面的顯示
                // 資料是儲存在非同步物件的屬性中
                console.log(ajax.responseText);
                document.querySelector('h1').innerHTML = ajax.responseText;
            };

        }

    }
</script>

get_ajax.php

<?php
        header('content-type:text/html;charset=utf-8');
        echo $_GET['content'].'我是通過ajax請求回來的資料';

?>

提交資料之前
這裡寫圖片描述
獲取資料之後,實驗過程觀察頁面並未重新整理
這裡寫圖片描述
post_ajax.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>post方式傳送資料</title>

</head>
<body>
    <h1>註冊名字</h1>
    <input type="text" name="userName" id="btnName"><label id="tishi" style="display:none"></label>

</body>
</html>
<script>

    //繫結失去焦點事件
    document.querySelector('#btnName').onblur=function(){
      // 傳送ajax請求到伺服器
      //1.建立非同步物件
      var ajax = new XMLHttpRequest();
      //2.設定請求的url等引數
      ajax.open('post','post_ajax.php');
      /*如果需要像 HTML 表單那樣 POST 資料,請使用 setRequestHeader() 來新增 HTTP 頭。然後在 send() 方法中規定您希望傳送的資料:*/
      ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");
      // 3.傳送請求
      ajax.send('Name='+document.querySelector('#btnName').value);

      // 4.註冊事件
      ajax.onreadystatechange = function(){
        if (ajax.readyState ==4&&ajax.status==200) {
            // 5.在註冊事件中接收返回的內容並修改資料
            console.log(ajax.responseText);
            var show = document.querySelector('#tishi');
                show.style.display='block';
            if (ajax.responseText =="exist") {

                show.innerHTML='該使用者已經註冊了!'

            } else{
                show.innerHTML='你可以使用該名字!'
            }
        }
      };

    }
</script>

post_ajax.php

<?php
    header('content-type:text/html;charset=utf-8');
    $name=$_POST['Name'];


    // 準備一個數據 模擬已經存在的使用者
    $nameArray = array('jack','kong','rose','ice');

    // 檢驗是否存在,並且接受返回值
    $result=in_array($name, $nameArray);
    // 通過if else返回不同的值給瀏覽器
    if($result){
        echo "exist";
    } else{
        echo "not exist";
    }

?>

提交資料之前:
這裡寫圖片描述
提交資料之後:
這裡寫圖片描述
這裡寫圖片描述