ajax

1. ajax交互流程:

ajax數(shù)據(jù)交互流程

1娱挨、創(chuàng)建一個ajax對象
2、填寫請求地址
3洋侨、發(fā)送請求
4、等待服務(wù)器響應(yīng)
5倦蚪、接收數(shù)據(jù)

1希坚、創(chuàng)建一個ajax對象

var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
2、填寫請求地址 3陵且、發(fā)送請求
xmlhttp.open(method,url,async);
xmlhttp.send();
<pre>method:請求的類型裁僧;GET 或 POST
url:文件在服務(wù)器上的位置
async:true(異步)或 false(同步)</pre>

4、服務(wù)器響應(yīng)
如需獲得來自服務(wù)器的響應(yīng)慕购,請使用 XMLHttpRequest 對象的 responseText 或 responseXML 屬性聊疲。
responseText 獲得字符串形式的響應(yīng)數(shù)據(jù)。
responseXML 獲得 XML 形式的響應(yīng)數(shù)據(jù)沪悲。
如果來自服務(wù)器的響應(yīng)并非 XML获洲,請使用 responseText 屬性。
如果來自服務(wù)器的響應(yīng)是 XML殿如,而且需要作為 XML 對象進行解析贡珊,請使用 responseXML 屬性。

onreadystatechange 事件:
當請求被發(fā)送到服務(wù)器時涉馁,我們需要執(zhí)行一些基于響應(yīng)的任務(wù)飞崖。
每當 readyState 改變時,就會觸發(fā) onreadystatechange 事件谨胞。
readyState 屬性存有 XMLHttpRequest 的狀態(tài)信息固歪。
下面是 XMLHttpRequest 對象的三個重要的屬性:
1、onreadystatechange :存儲函數(shù)(或函數(shù)名)胯努,每當 readyState 屬性改變時牢裳,就會調(diào)用該函數(shù)。
2叶沛、readyState:存有 XMLHttpRequest 的狀態(tài)蒲讯。從 0 到 4 發(fā)生變化。
0: 請求未初始化
1: 服務(wù)器連接已建立
2: 請求已接收
3: 請求處理中
4: 請求已完成灰署,且響應(yīng)已就緒
3判帮、status :
200: "OK" ;404: 未找到頁面
當 readyState 等于 4 且狀態(tài)為 200 時溉箕,表示響應(yīng)已就緒:
<pre>xmlhttp.onreadystatechange=function()
{if (xmlhttp.readyState==4 && xmlhttp.status==200)
{document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}</pre>

<pre><script>
window.onload=function(){
var inputs=document.querySelectorAll("input");
inputs[2].onclick=function(){
var val=inputs[0].value;
//1晦墙、創(chuàng)建一個ajax對象
var ajax=new XMLHttpRequest;
//2、填寫請求地址
ajax.open('get','php/get_json.php?user='+val,true);

                //3肴茄、發(fā)送請求
                ajax.send();
                //4晌畅、等待服務(wù)器響應(yīng)
                ajax.onload=function(){
                    //5、接收數(shù)據(jù)
                    var span=document.querySelector("span");
                    //ajax請求過來的數(shù)據(jù)都是字符串寡痰,它不能用對象的操作方法 直接操作
                    //console.log(typeof ajax.responseText);            //string
                    
                    var result=JSON.parse(ajax.responseText);
                    //span.innerHTML=ajax.responseText;
                    
                    if(result.code==0){
                        alert('可以注冊');
                    }else{
                        alert('請換一個');
                    }
                };
            };
        };
    </script>
</head>
<body>
    用戶名:<input type="text" name="username" /><span></span>`<br /><br />`
    密碼:<input type="password" name="password" />
    <input type="button" value="提交" />
</body></pre>               

2. get和post的區(qū)別

get方式:
1抗楔、通過地址欄信息進行數(shù)據(jù)傳輸棋凳,傳輸?shù)拇笮∮邢拗?br> 2、不安全连躏,用戶的所有信息都會暴露出來
3剩岳、拼接數(shù)據(jù)的時候要用encodeURI轉(zhuǎn)一下碼,不然有中文就會亂碼
4入热、不用設(shè)置請求頭
5拍棕、數(shù)據(jù)拼接在open方法里
6、會有緩存問題
post方式:
1才顿、通過send向服務(wù)器傳輸數(shù)據(jù),理論上來說是沒有長度或體積限制
2尤蒿、相對來說安全郑气,因為不直接暴露用戶信息
3、不用轉(zhuǎn)碼腰池,已經(jīng)通過請求頭設(shè)置了數(shù)據(jù)格式尾组,不會有亂碼
4、在send()的前面需要設(shè)置一個請求頭(不設(shè)置要出錯)
ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
5示弓、數(shù)據(jù)要拼接在send方法里
6讳侨、沒有緩存問題

<pre><script>
window.onload=function(){
var inputs=document.getElementsByTagName("input");

            inputs[2].onclick=function(){
                //console.log(decodeURI('%E9%99%88%E5%AD%A6%E8%BE%89'))
                var val=inputs[0].value;
                
                //1、創(chuàng)建一個ajax對象
                var ajax=null;
                if(window.XMLHttpRequest){
                    ajax=new XMLHttpRequest;
                }else{
                    ajax=new ActiveXObject('Microsoft.XMLHTTP');
                }
                
                //2奏属、填寫請求地址
                ajax.open('get','php/get.php?user='+encodeURI(val),true);
                
                //ajax.open('post','php/post.php',true);
                //post發(fā)送請求的時候一定要在發(fā)送前設(shè)置一下請求頭
                //ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
                //ajax.send('user='+val);
                
                //3跨跨、發(fā)送請求
                ajax.send();
                
                //4、等待服務(wù)器響應(yīng)
                ajax.onreadystatechange=function(){
                    //5囱皿、接收數(shù)據(jù)
                    var span=document.getElementsByTagName("span")[0];
                    span.innerHTML=ajax.responseText;
                };
            };
        };
    </script></pre>

3. onreadystatechange與onload

ajax.readyState AJAX運行步驟:
它的值為4的話說明AJAX已經(jīng)運行完成
0 初始化 還沒有調(diào)用open()方法
1 載入 已調(diào)用send()方法勇婴,正在發(fā)送請求
2 載入完成 send()方法完成,已收到全部響應(yīng)內(nèi)容
3 解析 正在解析響應(yīng)內(nèi)容
4 完成 響應(yīng)內(nèi)容解析完成嘱腥,可以在客戶端調(diào)用了
ajax.status服務(wù)器對請求的反饋(狀態(tài)碼)耕渴,200就是成功的,404就是錯誤的齿兔。
onreadystatechange:
readyState的值發(fā)生改變時觸發(fā)的事件橱脸,只要這個值有變化就會觸發(fā)
onload:
所有請求成功完成后觸發(fā),此時readystate的值為4(IE678不支持)
(新的XMLHttpRequest不推薦用onreadystatechange分苇,使用onload)

4. 封裝ajax

<pre>
url 地址
method 請求方式get/post
dataType 返回什么數(shù)據(jù)類型srging/json/xml data 請求時候的傳的數(shù)據(jù)(它是一個對象) succ 成功后的回調(diào)函數(shù)
fail 失敗后的回調(diào)函數(shù)
function ajax(json){
var settings={
url:'',
method:'get',
data:{},
dataType:'json',
succ:function(){},
fail:function(){}
};

//用戶傳的參數(shù)覆蓋默認參數(shù)
for(var attr in json){
    settings[attr]=json[attr];
}

//把數(shù)據(jù)拼成正確的格式
var arr=[];
for(var attr in settings.data){
    arr.push(attr+'='+settings.data[attr]);
}
settings.data=arr.join('&');

//聲明一個ajax對象
var ajax=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject('Microsoft.XMLHTTP');

//設(shè)置請求方式
if(settings.method.toLocaleLowerCase()==='get'){
    ajax.open(settings.method,settings.url+'?'+settings.data+'&'+new Date().getTime(),true);
    ajax.send();
}else{
    ajax.open(settings.method,settings.url,true);
    ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    ajax.send(settings.data);
}

//設(shè)置完成事件的兼容性
if(typeof ajax.onload==='undefined'){
    ajax.onreadystatechange=ready;
}else{
    ajax.onload=ready;
}

function ready(){
    if(ajax.readyState==4){
        if(ajax.status==200){
            switch(settings.dataType.toLocaleLowerCase()){
                case 'string':
                    settings.succ(ajax.responseText);
                    break;
                
                case 'json':
                    settings.succ(JSON.parse(ajax.responseText));
                    break;
                
                case 'xml':
                    settings.succ(ajax.responseXML);
            }
        }else{
            settings.fail(ajax.status);
        }
    }
};

}</pre>

5. 跨域

跨域:兩個不同域名下的數(shù)據(jù)進行交互添诉。Ajax之所以不能跨域其實是因為XMLHttpRequest受到同源策略的限制,只能讓它訪問同源下的數(shù)據(jù)医寿,不能訪問不同源下的數(shù)據(jù)

同源策略
每個網(wǎng)站只能讀取同一來源的數(shù)據(jù)吻商,這里的同一來源指的是主機名(域名)、協(xié)議(http/https)和端口號的組合糟红。在沒明確授權(quán)的情況下艾帐,不能讀寫對方的資源乌叶,它是瀏覽器最核心也最基本的安全功能
源:協(xié)議、端口柒爸、域名
只要不同源就跨域

協(xié)議
http 超文本協(xié)議
https HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進行加密傳輸准浴、身份認證的網(wǎng)絡(luò)協(xié)議要比http協(xié)議安全
file 本地協(xié)議
ftp 文件共享協(xié)議

跨域解決辦法
1、在標準瀏覽器下XMLHttpRequest配合后端設(shè)置一個請求權(quán)限
在php里寫上 header('Access-Control-Allow-Origin:*');
這個是XMLHttpRequest 2級支持的捎稚,非標準瀏覽器不支持
2乐横、服務(wù)器代理
服務(wù)器文件可以訪問你想要的資源,而你又能訪問服務(wù)器文件今野,所以你就可以訪問想要的資源
缺點:如果想訪問的資源需求有變葡公,對于后端的開發(fā)成本就很大
3、iframe条霜、flash催什、postMessage、WebSocket
http://www.freebuf.com/articles/web/65468.html

Jsonp:

ajax的核心是通過XmlHttpRequest獲取非本頁內(nèi)容宰睡,
而jsonp的核心則是動態(tài)添加<script>標簽來調(diào)用服務(wù)器提供的js腳本
*帶src屬性的<script> < img > <iframe><link>等標簽是不需要遵守同源策略的蒲凶,但是通過src加載的資源,瀏覽器限制了javascript的權(quán)限拆内,只能讀不能寫

*jsonp(json+padding)
1旋圆、通過script標簽引入某些數(shù)據(jù),是同步模式的麸恍,只有上面的代碼加載完成才能繼續(xù)加載下面的代碼一般在用script標簽做跨域的時候灵巧,不建議將數(shù)據(jù)提前加載,應(yīng)該按需加載
2抹沪、當需要數(shù)據(jù)的時候創(chuàng)建一個script標簽孩等,將需要的數(shù)據(jù)放在src中,通過onload去監(jiān)聽是否請求過來采够,請求完畢就調(diào)用傳回來的數(shù)據(jù)(異步加載)
3肄方、jsonp不能用post請求只能用get方式請求

<pre><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<button>點擊1</button>
<button>點擊2</button>
< ul >< /ul >
< ul >< /ul >
<script>
var buttons=document.querySelectorAll("button");
var uls=document.querySelectorAll("ul");

        buttons[0].onclick=function(){
            var script=document.createElement("script");
            script.src='http://localhost/php/jsonp_callBack.php?callback=fn1&num=number';
            document.getElementsByTagName('head')[0].appendChild(script);
        };
        
        function fn1(data){
            var str='';
            for(var i=0;i<data.length;i++){
                str+='<li>'+data[i]+'</li>';
            }
            
            uls[0].innerHTML=str;
        }
        buttons[1].onclick=function(){
            var script=document.createElement("script");
            script.src='http://localhost/php/jsonp_callBack.php?callback=fn2';
            document.getElementsByTagName('head')[0].appendChild(script);
        };
        function fn2(data){
            var str='';
            for(var i=0;i<data.length;i++){
                str+='<li>'+data[i]+'</li>';
            }
            uls[1].innerHTML=str;
        };
    </script>
</body>

</html>
</pre>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蹬癌,隨后出現(xiàn)的幾起案子权她,更是在濱河造成了極大的恐慌,老刑警劉巖逝薪,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隅要,死亡現(xiàn)場離奇詭異,居然都是意外死亡董济,警方通過查閱死者的電腦和手機步清,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人廓啊,你說我怎么就攤上這事欢搜。” “怎么了谴轮?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵炒瘟,是天一觀的道長。 經(jīng)常有香客問我第步,道長疮装,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任粘都,我火速辦了婚禮廓推,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翩隧。我一直安慰自己樊展,他們只是感情好,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布鸽心。 她就那樣靜靜地躺著滚局,像睡著了一般居暖。 火紅的嫁衣襯著肌膚如雪顽频。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天太闺,我揣著相機與錄音糯景,去河邊找鬼。 笑死省骂,一個胖子當著我的面吹牛蟀淮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钞澳,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼怠惶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了轧粟?” 一聲冷哼從身側(cè)響起策治,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兰吟,沒想到半個月后通惫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡混蔼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年履腋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡遵湖,死狀恐怖悔政,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奄侠,我是刑警寧澤卓箫,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站垄潮,受9級特大地震影響烹卒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弯洗,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一旅急、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牡整,春花似錦藐吮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沐扳,卻和暖如春泥从,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沪摄。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工躯嫉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杨拐。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓祈餐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哄陶。 傳聞我的和親對象是個殘疾皇子帆阳,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

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

  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,182評論 0 7
  • 1. AJAX AJAX(Asynchronous JavaScript and XML),意思就是用JavaSc...
    公子七閱讀 4,996評論 0 5
  • 原文出處 http://blog.poetries.top/2016/11/26/Ajax-summary 關(guān)注公...
    程序員poetry閱讀 6,685評論 3 110
  • ajax作為前端開發(fā)必需的基礎(chǔ)能力之一屋吨,你可能會使用它蜒谤,但并不一定懂得其原理,以及更深入的服務(wù)器通信相關(guān)的知識离赫。在...
    蕭玄辭閱讀 816評論 0 0
  • Ajax的基本概念及使用 同步&異步 同步:必須等待前面的任務(wù)完成芭逝,才能繼續(xù)后面的任務(wù); 異步:不受當前主要任務(wù)的...
    magic_pill閱讀 1,942評論 0 5