AJAX

一.前言

本文將從下面幾個方面來了解AJAX的使用方法

  • GET和POST請求
  • JSON
  • AJAX流程
  • jQuery中的AJAX
  • 處理跨域問題

二.GET和POST請求

想學(xué)習(xí)AJAX,就必須先了解GET請求和POST請求牢硅。

GET與POST的區(qū)別
  1. GET請求的數(shù)據(jù)會附在URL之后蜓氨。
  2. GET請求數(shù)據(jù)有大小限制,POST不限制大小肛度。
  3. GET的安全性要比POST的安全性低。
GET請求

這里使用form表單來進(jìn)行提交

  • html代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>
<body>
    <!-- 要向服務(wù)器發(fā)送數(shù)據(jù)必須使用form表單,使用get方法-->
    <form action="get.php" method="get">
        <!-- 使用name來傳遞數(shù)據(jù) -->
        <input type="text" name="user" />
        <!-- 數(shù)據(jù)提交 -->
        <input type="submit" value="發(fā)送請求" />
    </form>

</body>
</html>
  • php代碼
<?php 
    //使用utf8編碼格式(如不設(shè)置怖侦,輸入中文時教藻,瀏覽器將無法正確解析中文)
    header('Content-type:text/html;charset=utf8');
    // 使用$_GET獲取數(shù)據(jù)
    echo "hello $_GET[user]";
 ?>
POST請求

POST請求與GET請求的用法基本相同

  • html代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>
<body>
    <!-- 要向服務(wù)器發(fā)送數(shù)據(jù)必須使用form表單矩距,使用post方法 -->
    <form action="post.php" method="post">
        <!-- 使用name來傳遞數(shù)據(jù) -->
        <input type="text" name="user" />
        <!-- 數(shù)據(jù)提交 -->
        <input type="submit" value="發(fā)送請求" />
    </form>

</body>
</html>
  • php代碼
<?php 
    //使用utf8編碼格式(如不設(shè)置,輸入中文時怖竭,瀏覽器將無法正確解析中文)
    header('Content-type:text/html;charset=utf8');
    // 使用$_POST獲取數(shù)據(jù)
    echo "hello $_POST[user]";
 ?>

三.JSON

JSON語法規(guī)則
  1. 書寫格式
    名稱 : 值
    "user":"yimi"
  2. JSON值與對于的符號
  • 數(shù)字(整數(shù)或浮點(diǎn)數(shù))
  • 字符串(在雙引號中)
  • 邏輯值(true 或 false)
  • 數(shù)組(在方括號中)
  • 對象(在花括號中)
  • null
  1. JSON對象
    對象中可以包含多個名稱和值 ---- {在花括號中寫}
    { "user":"yimi" , "password":"123" }
  2. JSON數(shù)組
    JSON 數(shù)組可包含多個對象 ---- [在方括號中書寫]
{
"students": [
{ "id":"001" , "name":"yimi" },
{ "id":"002" , "name":"shan" }
]
}
  1. 通過JS賦值
var students = [
{ "id":"001" , "name":"yimi" },
{ "id":"002" , "name":"shan" }
];
JSON使用

前面做了那么多的鋪墊锥债,就是下面的兩個方法,這是JSON中很重要的方法痊臭,特別是在數(shù)據(jù)傳遞的時候哮肚,這兩個方法經(jīng)常被使用。

  1. 將字符串轉(zhuǎn)換成JSON對象
    var obj = JSON.parse(jsonstr);
  2. 將JSON對象轉(zhuǎn)換成字符串
    var str = JSON.stringify(jsonobj);

四.AJAX流程

AJAX用于實現(xiàn)異步加載

AJAX使用流程及記憶方法

此記憶方法可能不算好广匙,如果覺得不適合你允趟,可以另外重新想一個。

  1. new XMLHttpRequest(); --- 收到一個新的快遞
  2. open('Methor',url,true) --- 你迫不及待地打開
  3. send(); --- 發(fā)現(xiàn)你的東西有問題鸦致,就給送回去了
  4. function onload(){} --- 賣家處理你的快遞
  5. responseText --- 處理后潮剪,再把快遞給你返回來
GET請求
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>
<body>
    <script type="text/javascript">
        //創(chuàng)建一個ajax對象
        var xhr = new XMLHttpRequest();
        //第一個參數(shù):采用post/get形式請求
        //第二個參數(shù):選擇要連接的網(wǎng)址
        //第三個參數(shù):是否發(fā)起異步請求,一般為true分唾,也可以不寫抗碰,默認(rèn)為true。
        xhr = open('GET','ajax.php',true);
        //將數(shù)據(jù)發(fā)送給服務(wù)器(GET請求一般為null)
        xhr = send(null);
        //ajax請求成功后的回調(diào)
        xhr.onload = function(){
            //服務(wù)器返回的數(shù)據(jù),請求之前為空
            console.log(xhr.responseText);
        }
    </script>
</body>
</html>
POST請求
  <script type="text/javascript">
        //創(chuàng)建一個ajax對象
        var xhr = new XMLHttpRequest();
        //第一個參數(shù):采用post/get形式請求
        //第二個參數(shù):選擇要連接的網(wǎng)址
        //第三個參數(shù):是否發(fā)起異步請求绽乔,一般為true弧蝇,也可以不寫,默認(rèn)為true。
        xhr = open('POST','ajax.php',true);
        //設(shè)置Content-Type,以告知服務(wù)器實體中有參數(shù) 
        xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        //將數(shù)據(jù)發(fā)送給服務(wù)器(括號里面為你要傳遞到服務(wù)器的數(shù)據(jù))
        xhr = send("user="+username);
        //ajax請求成功后的回調(diào)
        xhr.onload = function(){
            //服務(wù)器返回的數(shù)據(jù),請求之前為空
            console.log(xhr.responseText);
        }
    </script>
文件上傳
<body>
    <!-- 設(shè)置 enctype="multipart/form-data" -->
    <form id="regForm" enctype="multipart/form-data">
        <input type="text" name="user"/><br />
        <input type="password" name="pwd"/><br />
        <a class="upload">
            <input type="file" name="icon"/>
        </a>
        <input type="button" onclick="reg()" value="立即注冊" />
    </form>

    <script type="text/javascript">
        function reg(){
            var regForm = document.getElementById('regForm');
            var formData = new FormData(regForm);

           var reg_api = 'reg.php' ;
           var xhr = new XMLHttpRequest();
           xhr.open('POST',reg_api,true);
           // xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');不需要設(shè)置Content-Type
           xhr.send(formData);
           xhr.onload = function(){
                //json字符串
                var jsonStr = xhr.responseText;
                //將json字符串轉(zhuǎn)換為json對象
                var obj = JSON.parse(jsonStr);
                alert(obj.message);
           }
        }
    </script>
</body>

五.jQuery中的AJAX

jQuery中的GET方法
  • HTML代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.7.2/jquery.min.js"></script>
</head>
<body>
    <button id="btn">發(fā)送一個ajax請求</button>
    <div id="box"></div>

    <script type="text/javascript">
        $('#btn').click(function(event) {
            //第一個參數(shù):要鏈接的網(wǎng)址
            //第二個參數(shù):要發(fā)送的數(shù)據(jù)
            //第三個參數(shù):回調(diào)函數(shù)
            $.get('jq_get.php',{'user':'yimi'}, function(data) {
                $('#box').html(data);
            });
        });
    </script>
</body>
</html>
  • php代碼
<?php 
    var_dump($_GET);
 ?>
  • 輸出結(jié)果

array (size=1)
'user'=>string'yimi'(length=4)

jQuery中的POST方法
  • HTML主要代碼
<body>
    <button id="btn">發(fā)送一個ajax請求</button>
    <div id="box"></div>
 <script type="text/javascript">
        $('#btn').click(function(event) {
            //第一個參數(shù):要鏈接的網(wǎng)址
            //第二個參數(shù):要發(fā)送的數(shù)據(jù)
            //第三個參數(shù):回調(diào)函數(shù)
            $.post('jq_post.php', {'user':'yimi','pwd':'123456'}, function(data) {
               $('#box').html(data)
            });
        });
 </script>
</body>
  • php代碼
<?php 
    var_dump($_POST);
 ?>
  • 輸出結(jié)果

array (size=2)
'user'=>string'yimi'(length=4)
'pwd'=>string'123456'(length=6)

jQuery中的JAJAX方法
  • HTML主要代碼
<body>
    <button id="btn">發(fā)送一個ajax請求</button>
    <div id="box"></div>

    <script type="text/javascript">
        $('#btn').click(function(event) {
            $.ajax({
                url: 'jq_ajax.php',//要鏈接的地址
                type: 'POST',//請求可以是post看疗,也可以是get
                dataType: 'html',//返回html數(shù)據(jù)
                data: {'user': 'yimi','pwd':'123456'},//要發(fā)送的數(shù)據(jù)
            })
            //成功的回調(diào)函數(shù)
            .done(function(data) {
                console.log("success");
                $('#box').html(data);
            })
            //失敗的回調(diào)函數(shù)
            .fail(function() {
                console.log("error");
            })
            //成功或失敗都會執(zhí)行的函數(shù)
            .always(function() {
                console.log("complete");
            });
        });
    </script>
</body>
  • php代碼
<?php 
    var_dump($_POST);
 ?>
  • 輸出結(jié)果

array (size=2)
'user'=>string'yimi'(length=4)
'pwd'=>string'123456'(length=6)

六.處理跨域問題

利用XHR2的方法來實現(xiàn)跨域處理(ie10以下不支持)
只需在php代碼中加入以下代碼即可

header("Access-Control-Allow-Origin:*");//*號表示允許所有域訪問
header("Access-Control-Allow-Methods:POST,GET");//請求

By : Yimi-shan

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沙峻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子两芳,更是在濱河造成了極大的恐慌摔寨,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怖辆,死亡現(xiàn)場離奇詭異祷肯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疗隶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門佑笋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斑鼻,你說我怎么就攤上這事蒋纬。” “怎么了坚弱?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵蜀备,是天一觀的道長。 經(jīng)常有香客問我荒叶,道長碾阁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任些楣,我火速辦了婚禮脂凶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘愁茁。我一直安慰自己蚕钦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布鹅很。 她就那樣靜靜地躺著嘶居,像睡著了一般。 火紅的嫁衣襯著肌膚如雪促煮。 梳的紋絲不亂的頭發(fā)上邮屁,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音菠齿,去河邊找鬼佑吝。 笑死,一個胖子當(dāng)著我的面吹牛泞当,可吹牛的內(nèi)容都是我干的迹蛤。 我是一名探鬼主播民珍,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼襟士,長吁一口氣:“原來是場噩夢啊……” “哼盗飒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起陋桂,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤逆趣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嗜历,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宣渗,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年梨州,在試婚紗的時候發(fā)現(xiàn)自己被綠了痕囱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡暴匠,死狀恐怖鞍恢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情每窖,我是刑警寧澤帮掉,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站窒典,受9級特大地震影響蟆炊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瀑志,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一涩搓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧劈猪,春花似錦缩膝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贡避,卻和暖如春痛黎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刮吧。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工湖饱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杀捻。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓井厌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仅仆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容