小試牛刀——AJAX課程

一.AJAX原理和封裝

1.服務器環(huán)境的搭建

省略...

2.第一個ajax程序
  • 什么是Ajax
    Asynchronous Javascript and XML(異步的javascript和XML)
    -節(jié)省用戶操作,時間,提高用戶體驗,減少數(shù)據(jù)請求
    -傳輸獲取數(shù)據(jù)
  • 使用Ajax
    使用ajax獲取某一個文本文件的內(nèi)容
  • Ajax過程詳解
    創(chuàng)建對象XMLHttpRequest()
    • Date()對象
      -ActiveXObject('Microsoft.XMLHTTP')
3.ajax流程對象的創(chuàng)建和兼容
window.onload=function(){
    var oBtn=document.getElementById("btn");
    oBtn.onclick=function(){
        /*1.創(chuàng)建一個ajax對象 ie6一下用的是new AcitveXObject('Mircosoft.XMLHTTP')*/
        var xhr=null
        if(window.XMLHttpRequest){
            xhr=new XMLHttpRequest();
        }else{
            xhr=new ActiveXObject("Microsoft.XMLHTTP")
        }
        /*
            try{
                xhr=new XMLHttpRequest();
            }catch(e){
                xhr=new AcitveXObject("Mirosoft.XMLHTTP")
            }
        */
        /*寫入地址*/
        xhr.open("get","1.txt",true);
        /*發(fā)送*/
        xhr.send();
        /*監(jiān)聽*/
        xhr.onreadystatechange=function(){
            if(xhr.readyState===4){
                alert(xhr.responseText)
            }
        }

    }
}
4.ajax流程-open方法和表單

表單:數(shù)據(jù)的提交
action : 數(shù)據(jù)提交的地址,默認是當前頁面
method : 數(shù)據(jù)提交的方式,默認是get方式
1.get
把數(shù)據(jù)名稱和數(shù)據(jù)值用=連接,如果有多個的話,那么他會把多個數(shù)據(jù)組合&進行連接,然后把數(shù)據(jù)放到url?后面?zhèn)鞯街付撁?br> url長度限制的原因,我們不要通過get方式傳遞過多的數(shù)據(jù)
2.post
理論上無限制,
enctype : 提交的數(shù)據(jù)的格式,默認application/x-www-form-urlencoded

window.onload=function(){
    var oBtn=document.getElementById("btn");
    oBtn.onclick=function(){
        /*1.創(chuàng)建一個ajax對象 ie6以下用的是new AcitveXObject('Mircosoft.XMLHTTP')*/
        var xhr=null
        if(window.XMLHttpRequest){
            xhr=new XMLHttpRequest();
        }else{
            xhr=new ActiveXObject("Microsoft.XMLHTTP")
        }
     
        /*提交請求*/
        /*
        * open方法
        * 參數(shù):
        *       1.打開方式
        *       2.地址
        *       3.是否異步
        *           異步:非阻塞 前面的代碼不會影響后面的代碼執(zhí)行
        *           同步:阻塞 前面的代碼會影響后面的代碼執(zhí)行 false 一般情況下是不會用同步的直接寫在監(jiān)聽里就好了
        * */
        xhr.open("get","1.txt",true);
        /*發(fā)送請求*/
        xhr.send();
        /*監(jiān)聽等待服務器返回內(nèi)容*/
        xhr.onreadystatechange=function(){
            if(xhr.readyState===4){
                alert(xhr.responseText)
            }
        }

    }
}
5.ajax流程-數(shù)據(jù)的獲取
請求狀態(tài)監(jiān)控
  • onreadystatechange
    • readyState 屬性 : 請求狀態(tài)
      0 (初始化) 還沒有調(diào)用open() 方法
      1 (載入) 已調(diào)用send()方法, 已收到全部響應內(nèi)容
      2 (載入完成) send()方法完成,已收到全部響應內(nèi)容
      3 (解析) 正在解析響應內(nèi)容
      4 (完成) 響應內(nèi)容解析完成,可以再客戶端調(diào)用了
    • status屬性 : 服務器(請求資源)的狀態(tài)
    • 返回的內(nèi)容
      -responseText :返回以文本形式存放的內(nèi)容
      -responseXML : 返回XML形式的內(nèi)容
      /*監(jiān)聽等待服務器返回內(nèi)容
       * readyState : ajax工作狀態(tài)
       * responseText : ajax請求的內(nèi)容就被存放到這個屬性下面 類型是字符串類型
       * on readystate change : 當readyState改變的時候觸發(fā)
       * status : 服務器狀態(tài)---http狀態(tài)碼
       * */
       xhr.onreadystatechange=function(){
           if(xhr.readyState===4){
               if(xhr.status==200){
                   alert(xhr.responseText)
               }else{
                   alert(xhr.status)
               }
           }
       }
6.應用中g(shù)et和post的區(qū)別處理

get請求

oBtn.onclick=function(){
    var xhr=null
    if(window.XMLHttpRequest){
        xhr=new XMLHttpRequest();
    }else{
        xhr=new ActiveXObject("Microsoft.XMLHTTP")
    }
    /*
    * 1.解決緩存問題 在url?后邊連接一個隨機數(shù) 時間戳
    * 2.亂碼,編碼encodeURI
    * */
    xhr.open("get",'get.php?username='+encodeURI("名字")+'&age=30&'+new Date().getTime(),true);
    xhr.send();
    xhr.onreadystatechange=function(){
        if(xhr.readyState===4){
            if(xhr.status==200){
                alert(xhr.responseText)
            }else{
                alert(xhr.status)
            }

        }
    }

}

post請求

oBtn.onclick=function(){
    var xhr=null
    if(window.XMLHttpRequest){
        xhr=new XMLHttpRequest();
    }else{
        xhr=new ActiveXObject("Microsoft.XMLHTTP")
    }
    xhr.open("post",'post.php',true);
    //post方式,數(shù)據(jù)放在send()里作為參數(shù)發(fā)送
    //告訴后端發(fā)送數(shù)據(jù)的類型 post沒有緩存問題 無需編碼
    xhr.setRequestHeader("content-type",'application/x-www-form-urlencoded');
    xhr.send('username=leo&age=30');
    xhr.onreadystatechange=function(){
        if(xhr.readyState===4){
            if(xhr.status==200){
                alert(xhr.responseText)
            }else{
                alert(xhr.status)
            }

        }
    }

}
7.ajax獲取數(shù)據(jù)的處理和實例

注:嚴格的Json的key值一定要用雙引號括起來
JSON.stringify() 可以把一個對象轉(zhuǎn)化成對應字符串
JSON.parse() :可以把字符串轉(zhuǎn)成對應對象

實例:ajax的封裝及實例

//php:
    header("content-type:text/html;charset='utf-8'");
    error_reporting(0);
  $news=array(
    array('title'=>'法餐烹飪小知識 —— 法式煎蛋','date'=>'2017-1-4'),
    array('title'=>'自抱自泣部凑!早知道我一個人住的小公寓就應該這樣裝!','date'=>'2017-2-5'),
    array('title'=>'堅持寫手賬二十一天,我收獲了什么','date'=>'2017-3-6'),
    array('title'=>'過日子要有技術(shù)含量:這些東西讓你的衣食住行更有質(zhì)量','date'=>'2017-6-6'),
    array('title'=>'開胃易消化檀训、補鈣解便秘王带!寶寶吃慣了粥,換成這個更愛吃件炉!','date'=>'2017-8-25'),
    array('title'=>'大衣指南|跟隨時尚的小妖精來學穿大衣','date'=>'2017-9-12'),
    array('title'=>'情人節(jié)特輯勘究,淘寶上有哪些值得你收藏的禮物','date'=>'2017-10-22'),
    array('title'=>'治療失眠癥的這4個方法,希望對你有用','date'=>'2017-11-22')
    
  );
  echo JSON_encode($news);
//js:
function ajax(method,url,data,success){
     var xhr=null
        if(window.XMLHttpRequest){
            xhr=new XMLHttpRequest();
        }else{
            xhr=new ActiveXObject("Microsoft.XMLHTTP")
        }
        if(method=='get'&& data){
            url+='?'+data;
        }
         xhr.open(method,url,true);
        if(method=='get'){
            xhr.send();
        }else{
            xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
            xhr.send(data);
        }
        xhr.onreadystatechange=function(){
            if(xhr.readyState===4){
                if(xhr.status==200){
                 success&&success(xhr.responseText);
                }else{
                    alert(xhr.status)
                }
            }
        }
}
window.onload=function(){
    var oBtn=document.getElementById("btn");
    oBtn.onclick=function(){
       ajax('get','get.php','',function(data){
            var data=JSON.parse(data);
            var oUl=document.getElementById("ul");
            var html="";
            for(var i=0;i<data.length;i++){
                html+='<li><a href="">'+data[i].title+' '+data[i].date+'</a></li>';
            }
            oUl.innerHTML=html;
       });      
     }
}


二.AJAX實例:留言板&瀑布流

瀑布流案例 :

*{margin:0;padding:0;}
#ul{width:1080px;margin:100px auto 0;}
li{width:247px;list-style:none;float:left;margin-right:10px;}
li div{border:1px solid #000;padding:10px;margin-bottom:10px;}
li div img{width:225px;display:block;}

<ul id="ul">
    <li></li>
    <li></li>
    <li></li>
    <li></li>
</ul>

function ajax(method,url,data,success){
    var xhr=null
    if(window.XMLHttpRequest){
        xhr=new XMLHttpRequest();
    }else{
        xhr=new ActiveXObject("Microsoft.XMLHTTP")
    }
    if(method==='get'&& data){
        url+='?'+data;
    }
    xhr.open(method,url,true);
    if(method==='get'){
        xhr.send();
    }else{
        xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
        xhr.send(data);
    }
    xhr.onreadystatechange=function(){
        if(xhr.readyState===4){
            if(xhr.status===200){
                success&&success(xhr.responseText);
            }else{
                alert(xhr.status)
            }
        }
    }
}

window.onload=function(){
    var oUl=document.getElementById("ul");
    var aLi=oUl.getElementsByTagName("li");
    var iLen=aLi.length;
    var iPage=1;
    var onOff=true;
    getList();
    function getList(){
        ajax('get','getPics.php','cpage='+iPage,function(data){
            var data=JSON.parse(data);
            if(!data.length){//后續(xù)沒有數(shù)據(jù)了
                return;
            }
            for(var i=0;i<data.length;i++){
                var _index=getShort();
                var oDiv=document.createElement("div");
                var oImg=document.createElement("img");
                oImg.src=data[i].preview;

                oImg.style.height=data[i].height*(225/data[i].width)+"px";
                oDiv.appendChild(oImg);
                var oP=document.createElement("p");
                oDiv.appendChild(oP);
                aLi[_index].appendChild(oDiv);
            }
            onOff=true;
        })
    }
    window.onscroll=function(){
        var _index=getShort();
        var oLi=aLi[_index];
        var scrollTop=document.documentElement.scrollTop || document.body.scrollTop;
        if(getTop(oLi)+oLi.offsetHeight<(document.documentElement.clientHeight+scrollTop)){
            if(onOff){
                onOff=false;
                iPage++;
                getList();
            }
        }
    }
    function getShort(){
        var index=0;
        var ih=aLi[index].offsetHeight;
        for(var i=0;i<iLen;i++){
            if(aLi[i].offsetHeight<ih){
                index=i;
                ih=aLi[i].offsetHeight;
            }
        }
        return index;
    }
    function getTop(obj){
        var iTop=0;
        while(obj){
            iTop=obj.offsetTop;
            obj=obj.offsetParent;
        }
        return iTop;
    }

}

//php內(nèi)容
<?php
header('Content-type:text/html; charset="utf-8"');
/*
API:
    getPics.php

        參數(shù)
        cpage : 獲取數(shù)據(jù)的頁數(shù)
*/
$cpage = isset($_GET['cpage']) ? $_GET['cpage'] : 1;

$url = 'http://www.wookmark.com/api/json/popular?page=' . $cpage;

$content = file_get_contents($url);
$content = iconv('gbk', 'utf-8', $content);

echo $content;

?>

三.AJAX跨域解決方案:JSONP

1.問題的回復及跨域限制問題
  • 跨域的問題
    域:域名
    跨域請求(訪問):一個域名下的文件請求另一個域名下的資源,就產(chǎn)生了跨域
  • 跨域的解決
    jsonp: json padding
2.跨域的解決

JSONP: JSON with Padding
1.script標簽
2.用script標簽加載資源是沒有跨域問題的
在資源加載進來之前定義好一個函數(shù),這個函數(shù)接收一個參數(shù)(數(shù)據(jù)),函數(shù)里面利用這個參數(shù)做一些事情
然后需要的時候,通過script標簽加載對應遠程文件資源,當遠程的文件資源被加載進來的時候,就會去執(zhí)行我們前面定義好的函數(shù),并且把數(shù)據(jù)當做這個函數(shù)的參數(shù)傳入進去
比如:點擊按鈕時 創(chuàng)建script 寫入地址 append進去

實例:百度下拉實例

<style>
        #q{width:300px;height:30px;padding:5px;border:1px solid #f90;font-size:16px;}
        #ul{border:1px solid #f90;width:310px;margin:0;padding:0;display:none;}
        li a{line-height:30px;padding:5px;text-decoration:none;color:#666;display:block;}
        li:hover{background:#f40;}
</style>
<input type="text" id="q">
<ul id="ul"></ul>

<script>
    function miaov(data){
        var oUl=document.getElementById("ul");
        var html="";
        if(data.s.length){
           for(var i=0;i<data.s.length;i++){
               html+='<li><a target="_blank" 
           }
           oUl.innerHTML=html;
            oUl.style.display='block';
        }else{
            oUl.style.display="none";
        }
    }
    window.onload=function(){
        var oQ=document.getElementById("q");
        var oUl=document.getElementById("ul");
        oQ.onkeyup=function(){
            if(this.value!=""){
                var oScript=document.createElement('script');
                oScript.src="https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd="+this.value+"&cb=miaov";
                document.body.appendChild(oScript);
            }
        }
    }
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斟冕,一起剝皮案震驚了整個濱河市口糕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌磕蛇,老刑警劉巖景描,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件十办,死亡現(xiàn)場離奇詭異,居然都是意外死亡超棺,警方通過查閱死者的電腦和手機向族,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來说搅,“玉大人炸枣,你說我怎么就攤上這事∨螅” “怎么了适肠?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長候引。 經(jīng)常有香客問我侯养,道長,這世上最難降的妖魔是什么澄干? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任逛揩,我火速辦了婚禮,結(jié)果婚禮上麸俘,老公的妹妹穿的比我還像新娘辩稽。我一直安慰自己,他們只是感情好从媚,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布逞泄。 她就那樣靜靜地躺著,像睡著了一般拜效。 火紅的嫁衣襯著肌膚如雪喷众。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天紧憾,我揣著相機與錄音到千,去河邊找鬼。 笑死赴穗,一個胖子當著我的面吹牛憔四,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播般眉,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼加矛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了煤篙?” 一聲冷哼從身側(cè)響起斟览,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辑奈,沒想到半個月后苛茂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體已烤,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年妓羊,在試婚紗的時候發(fā)現(xiàn)自己被綠了胯究。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡躁绸,死狀恐怖裕循,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情净刮,我是刑警寧澤剥哑,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站淹父,受9級特大地震影響株婴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜暑认,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一困介、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蘸际,春花似錦座哩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驾诈,卻和暖如春缠诅,著一層夾襖步出監(jiān)牢的瞬間溶浴,已是汗流浹背乍迄。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留士败,地道東北人闯两。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像谅将,于是被迫代替她去往敵國和親漾狼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理饥臂,服務發(fā)現(xiàn)逊躁,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,201評論 0 7
  • Ajax 表單提交 在HTML中提供了表單提交的功能隅熙,我們可以通過表單把數(shù)據(jù)從前臺提交到后臺 在HTML的DOM中...
    羊烊羴閱讀 713評論 0 4
  • 創(chuàng)建文件 recorder.py 1.把recorder.py放到sdk的tools目錄2.cd到tools目錄c...
    Mixqum閱讀 268評論 0 0
  • 現(xiàn)在的我是個實習護士稽煤,每天做著關(guān)乎生命的工作核芽,極盡耐心、愛心和責任心去守護生命酵熙,關(guān)懷心靈 轧简。每天不斷擴充著自己...
    鄭漂亮yeol閱讀 169評論 0 0