麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > XML > 正文

一日精通Ajax技術(shù)

2024-09-05 20:53:57
字體:
供稿:網(wǎng)友

 


  ajax這個(gè)名稱怎么來的,本人也不得而之了,大概是(active javascript action xml)吧,說白一點(diǎn)就是運(yùn)用了 javascript、xmlhttp和xmldom技術(shù)及網(wǎng)站后臺(tái)來處理用戶的一些操作的方法吧。

  那么本人就分三步來說明如何使用 ajax 技術(shù)來做開發(fā)。

  一、用 javascript 操作 xmlhttp 對(duì)象

  二、服務(wù)器部對(duì)xmlhttp請(qǐng)求的響應(yīng)(php范例)

  三、xmldom 的使用方法

  先說第一部份:

  一、用 javascript 操作 xmlhttp 對(duì)象

  ie7, mozilla ,firefox等瀏覽器中,javascript是內(nèi)置有 xmlhttprequest 這個(gè)對(duì)象的,但ie5+則沒有,需要用如下方法來啟動(dòng):
//ie 6
try{ xhttp = new activexobject("msxml2.xmlhttp";} catch(e){ ; }
//ie5+
if(xhttp == null) try { xhttp = new activexobject("microsoft.xmlhttp";} catch(e){ ; }

  那考慮不同瀏覽器的兼容,啟動(dòng)一個(gè)xmlhttp一般都要按如下方式:

code:[copy to clipboard]var xhttp = null;

if(window.xmlhttprequest){ //ie7, mozilla ,firefox 等瀏覽器內(nèi)置該對(duì)象

  xhttp = new xmlhttprequest();
 
}else if(window.activexobject){ //ie6、ie5

  try{ xhttp = new activexobject("msxml2.xmlhttp");} catch (e){ ; }
 
  if( xhttp == null) try { xhttp = new activexobject("microsoft.xmlhttp");} catch (e){; }
 
}

  對(duì)于 xmlhttp 的使用,一般遵守如下的順序:

  1、初始化 xmlhttp 對(duì)象(上文);

  2、打開鏈接

  方法

xhttp.open("get", purl, true);

  參數(shù)一:用 get 或 post 方式發(fā)送數(shù)據(jù)

  參數(shù)二、請(qǐng)求網(wǎng)址(只能請(qǐng)求你服務(wù)器上的資源,一般瀏覽器安全限制不能讀取跨域的數(shù)據(jù))

  參數(shù)三、true 表示異步傳輸(服務(wù)器返回信息完成前,你可以進(jìn)行其它操作),false 表示阻斷方式的傳輸。

  3、設(shè)定要發(fā)送的 http 請(qǐng)求頭

  方法:

xhttp.setrequestheader(key,value);

  一般來說,默認(rèn)要發(fā)送的頭是:xhttp.setrequestheader("content-type","application/x-www-form-urlencoded";

  這種表示發(fā)送的內(nèi)容類型的請(qǐng)求頭用于發(fā)送文本數(shù)據(jù),而且javascript默認(rèn)是以u(píng)nicode發(fā)送的,還有另外一種形式是:xhttp.setrequestheader("content-type","multipart/form-data";這表示發(fā)送二制形式的數(shù)據(jù),由于安全性原因,javascript一般不能用這種方式來發(fā)送數(shù)據(jù),所以這個(gè)頭一般沒什么用。

  如果你的網(wǎng)站開啟了使用 refer 參數(shù)來防盜鏈,那么你必須用這個(gè)方法指定 refer 參數(shù),或者如果用戶需要登錄才能進(jìn)行某操作,那么要指定 cookie 的請(qǐng)求頭。

  4、send 數(shù)據(jù)

  方法:xhttp.send(postdata);

  對(duì)于用 get攻手請(qǐng)求,不需要指定postdata,直接用 test.php?a=a&b=b 這樣形式的網(wǎng)址來請(qǐng)求即可。

  如果是post方式,需要用 key1=value2&key2=value2 這樣的形式來對(duì)數(shù)據(jù)進(jìn)行處理,把它合并在 postdata 字串中,然后發(fā)送。

  注意事項(xiàng):

  javascript默認(rèn)發(fā)送數(shù)據(jù)的方式是unicode,處理返回的數(shù)據(jù)必須是utf-8格式,因此,在發(fā)送的時(shí)候,需要用escape()函數(shù)來處理postdata和網(wǎng)址的value,在服務(wù)器上必須還原這些value,并把unicode轉(zhuǎn)為頁面編碼值,因此如果用 jsp 或 asp.net 都會(huì)比較簡(jiǎn)單,但如果用php處理起來是什么費(fèi)勁的,等下會(huì)教你如何做。

  5、確認(rèn)服務(wù)器返回資料完成下載

  [1] 如果用阻斷的方式來發(fā)送請(qǐng)求,那么直接用 if(xhttp.readystate == 4)就能判斷是否完成。

readystate 的具體屬性值為:
0 沒open
1 沒send
2 狀態(tài)未知
3 正在傳送
4 傳送完成

  當(dāng)然為了保障起見,還需要加多一重判斷,就是 if(xhttp.status == 200) ,status 就是 http 協(xié)議里的返回頭代碼

1xx 表示(唉呀,忘記了)
2xx 表示成功的信息
3xx 表示頁面轉(zhuǎn)移
4xx 頁面不存在
5xx 表示服務(wù)器的各種錯(cuò)誤

  如果你的頁面沒特殊處理,一般用 if(xhttp.status == 200)  來確信內(nèi)容返回是正確的

  [2] 如果用異步傳輸,需要用 onreadystatechange 的事件來監(jiān)聽

xhttp.onreadystatechange = function()
{
   //這里來進(jìn)行上面阻斷方式的判斷
   if(myajax.xhttp.readystate == 4){
                if(myajax.xhttp.status == 200){
                  //要進(jìn)行的后續(xù)操作
                }
        }
}

  6、獲取返回結(jié)果

屬性:
[1]xhttp.responsebody;
[2]xhttp.responsestream;
[3]xhttp.responsexml;
[4]xhttp.responsetext;

  其中1、2都是二進(jìn)制的方式,一般很少會(huì)用到,4不用看都知道了

  如果服務(wù)端無意外的話[3]返回的是一個(gè)xmldom的對(duì)象

  二、服務(wù)器部對(duì)xmlhttp請(qǐng)求的響應(yīng)(php范例)

  為了簡(jiǎn)化操作,在這里把 xmlhttp的各作操作封裝為一個(gè)類

  code:[copy to clipboard]function dedeajax(witeokfunc){ //witeokfunc 為異步狀態(tài)事件處理函數(shù)

//xmlhttp和xmldom對(duì)象
this.xhttp = null;
this.xdom = null;

//post或get發(fā)送數(shù)據(jù)的鍵值對(duì)
this.keys = array();
this.values = array();
this.keycount = -1;

//http請(qǐng)求頭
this.rkeys = array();
this.rvalues = array();
this.rkeycount = -1;
//請(qǐng)求頭類型
this.rtype = 'text';

//初始化xmlhttp
if(window.xmlhttprequest){//ie7, mozilla ,firefox 等瀏覽器內(nèi)置該對(duì)象
     this.xhttp = new xmlhttprequest();
}else if(window.activexobject){//ie6、ie5
     try { this.xhttp = new activexobject("msxml2.xmlhttp");} catch (e) { }
     if (this.xhttp == null) try { this.xhttp = new activexobject("microsoft.xmlhttp");} catch (e) { }
}
this.xhttp.onreadystatechange = witeokfunc;
//rs: responsebody、responsestream、responsexml、responsetext

//以下為成員函數(shù)
//--------------------------------

//初始化xmldom
this.initxdom = function(){
  var obj = null;
  if (typeof(domparser) != "undefined") { // gecko、mozilla、firefox
    var parser = new domparser();
    obj = parser.parsefromstring(xmltext, "text/xml");
  } else { // ie
    try { obj = new activexobject("msxml2.domdocument");} catch (e) { }
    if (obj == null) try { obj = new activexobject("microsoft.xmldom"); } catch (e) { }
  }
  this.xdom = obj;
};

//增加一個(gè)post或get鍵值對(duì)
this.addkey = function(skey,svalue){
        this.keycount++;
        this.keys[this.keycount] = skey;
        this.values[this.keycount] = escape(svalue);
};

//增加一個(gè)http請(qǐng)求頭鍵值對(duì)
this.addhead = function(skey,svalue){
        this.rkeycount++;
        this.rkeys[this.rkeycount] = skey;
        this.rvalues[this.rkeycount] = svalue;
};

//清除當(dāng)前對(duì)象的哈希表參數(shù)
this.clearset = function(){
        this.keycount = -1;
        this.keys = array();
        this.values = array();
        this.rkeycount = -1;
        this.rkeys = array();
        this.rvalues = array();
};

//發(fā)送http請(qǐng)求頭
this.sendhead = function(){
        if(this.rkeycount!=-1){ //發(fā)送用戶自行設(shè)定的請(qǐng)求頭
          for(;i<=this.rkeycount;i++){
                  this.xhttp.setrequestheader(this.rkeys[i],this.rvalues[i]);
          }
  }
 if(this.rtype=='binary'){
          this.xhttp.setrequestheader("content-type","multipart/form-data");
  }else{
          this.xhttp.setrequestheader("content-type","application/x-www-form-urlencoded");
  }
};

//用post方式發(fā)送數(shù)據(jù)
this.sendpost = function(purl){
        var pdata = "";
        var i=0;
        this.state = 0;
        this.xhttp.open("post", purl, true);
        this.sendhead();
  if(this.keycount!=-1){ //post數(shù)據(jù)
          for(;i<=this.keycount;i++){
                  if(pdata=="") pdata = this.keys[i]+'='+this.values[i];
                  else pdata += "&"+this.keys[i]+'='+this.values[i];
          }
  }
  this.xhttp.send(pdata);
};

//用get方式發(fā)送數(shù)據(jù)
this.sendget = function(purl){
        var gkey = "";
        var i=0;
        this.state = 0;
        if(this.keycount!=-1){ //get參數(shù)
          for(;i<=this.keycount;i++){
                  if(gkey=="") gkey = this.keys[i]+'='+this.values[i];
                  else gkey += "&"+this.keys[i]+'='+this.values[i];
          }
          if(purl.indexof('?')==-1) purl = purl + '?' + gkey;
          else  purl = purl + '&' + gkey;
  }
        this.xhttp.open("get", purl, true);
        this.sendhead();
  this.xhttp.send();
};

} // end class dedeajax
上面代碼保存為: dedeajax.js

ok 那現(xiàn)在做個(gè)最簡(jiǎn)單的測(cè)試吧
test.htm

code:[copy to clipboard]<script language='javascript'  src='dedeajax.js'></script>
<script language='javascript'>
function witeok()
{
   var myinfo = document.getelementbyid("myinfo");
    if(myajax.xhttp.readystate == 4){
        if(myajax.xhttp.status == 200){
            myinfo.innerhtml = myajax.xhttp.responsetext;
        }
    }
}
var myajax = new dedeajax(witeok);
myajax.addkey("key1","----------------------------");
myajax.sendpost("test.php");

</script>

<div id='myinfo'><div>
test.php


code:[copy to clipboard]<?
header("content-type: text/html; charset=gb2312");
echo $_post['key1'];
?>
看到了什么了呢?不用激動(dòng),真正讓你頭痛的東西還沒有出來。

把類里面的

code:[copy to clipboard]this.addkey = function(skey,svalue){
   this.keycount++;
   this.keys[this.keycount] = skey;
   this.values[this.keycount] = svalue;//escape(svalue);
};
escape 屏蔽掉

發(fā)送
myajax.addkey("key1","-----中---國----人-----";

看到什么了,亂碼是吧?呵呵,這回開始頭大了

先把 escape放回去
this.values[this.keycount] = escape(svalue);

那么看到的就是
-----%u4e2d---%u56fd----%u4eba-----

如何把  %u4e2d  這些東西弄回來呢?對(duì)于php而言這是一個(gè)很復(fù)雜的問題,如果用asp就簡(jiǎn)單多了

下面是我寫的一個(gè)函數(shù):


code:[copy to clipboard]//unicode url編碼轉(zhuǎn)gbk編碼函數(shù)
function unicode2gbk($str)
{
        //載入對(duì)照詞典
        if(!isset($globals['gbkunidic']))
        {
          $ds = file("./data/gbk_unicode.dic");
          foreach($ds as $l){
                  $globals['gbkunidic'][hexdec('0x'.substr($l,0,4))] = substr($l,5,4);
          }
  }
  //處理字符串
  $glen = strlen($str);
  $okstr = "";
  for($i=0; $i < $glen; $i++)
  {
           if( $glen-$i > 4){
                    if($str[$i]=='%' && $str[$i+1]=='u'){
                              $uni = hexdec('0x'.substr($str,$i+2,4));
                              if(isset($globals['gbkunidic'][$uni])){
                                      $uni = $globals['gbkunidic'][$uni];
                                      $okstr .= chr(hexdec(substr($uni,0,2))).chr(hexdec(substr($uni,2,2)));
                              }
                              else $okstr .= "&#{".hexdec("0x".$uni).";";
                              $i = $i+5;
                    }
                    else $okstr .= $str[$i];
           }
           else $okstr .= $str[$i];
  }
  return $okstr;
}
詞典文件: http://www.ce86.com/myimg/data.rar


把test.php 輸出改為

echo unicode2gbk($_post['key1']);

正常了吧

以下說下面和xml有關(guān)的東西的了

  三、xmldom 的使用方法
  
  由于本文僅是牽針引線的作用,這一章就簡(jiǎn)單些,因?yàn)獒槍?duì)的是 php ,如果針對(duì)的是 asp.net 或 jsp 寫涉及 web server 類的通信,已經(jīng)不單純是 ajax  的問題了,本章的任務(wù)是把test2.php

code:[copy to clipboard]<?
header("content-type: text/xml; charset=gb2312");
echo '<'.'?'."xml version=/"1.0/" encoding=/"gb2312/" ".'?'.">
<myhome>
  <item sex=/"男/">我是小一</item>
  <item sex=/"女/">我是小二</item>
</myhome>
";
?>這個(gè)xml文檔在客戶端用自己的方式展現(xiàn)出來。因?yàn)閤ml這種東西比較麻煩,所以語法也必須嚴(yán)格,test2.htm的頁面的源碼為

code:[copy to clipboard]<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<title>ajax測(cè)試</title>
</head>
<body >
<script language='javascript'  src='dedeajax.js'></script>
<script language='javascript'>
var myajax = new dedeajax(witeok);
function witeok()
{
   var myinfo = document.getelementbyid("myinfo");
   var mydom = null;
   myinfo.innerhtml = "以下是處理結(jié)果:<br/>";
   if(myajax.xhttp.readystate == 4){
     mydom = myajax.xhttp.responsexml;
     alert(mydom);
   }
}
function witeloaddocument()
{
   myajax.sendget("test2.php");       
}
</script>
<div id='myinfo'><div>
</body>
</html>
在ie中測(cè)試一下,如果彈出的對(duì)話框是 [object] 就表示成功獲得返回的xml的xmldoc了。

那下面是處理:

code:[copy to clipboard]function witeok()
{
   var myinfo = document.getelementbyid("myinfo");
   var mydom = null;
   myinfo.innerhtml = "以下是處理結(jié)果:<br/>";
   if(myajax.xhttp.readystate == 4){
     mydom = myajax.xhttp.responsexml;
     var nodelist = mydom.selectnodes("/myhome/item");
     var mynode = null;
     var myatt = null;
     var mysex = "";
     for(i=1;i<=nodelist.length;i++)
     {
              mynode = nodelist[i-1];
              for(j=0;j < myinfo.attributes.length;j++)
              {
                       if(!mynode.attributes[j]) break;
                       myatt = mynode.attributes[j];
                       if(myatt.name=='sex') mysex = myatt.value;
              }
              myinfo.innerhtml += "我是:"+mynode.text+",我的性別是:"+ mysex +"<br/>";
     }
   }
}

結(jié)果:

code:[copy to clipboard]以下是處理結(jié)果:
我是:我是小一,我的性別是:男
我是:我是小二,我的性別是:女
ok,目的已經(jīng)達(dá)到

  關(guān)于dom的部份只在ie6中測(cè)試過,可能在firefox中會(huì)有問題,大家可能參考與兼容性有關(guān)的文檔。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 综合网日日天干夜夜久久 | 久久久av亚洲男天堂 | 久久久国产电影 | 最新福利在线 | 羞羞视频一区 | 毛片免费看的 | 国产一区视频在线免费观看 | 欧美国产成人在线 | 亚洲91网 | 一级做受大片免费视频 | 欧美一级一区二区三区 | 久草欧美 | 国产一区成人 | 日韩一级免费毛片 | 亚洲第五色综合网 | 国产一级免费在线视频 | 国产一级淫片免费看 | 哪里可以看免费的av | 蜜桃精品视频 | 色蜜桃av | 激情久久一区二区 | 成人wxx视频免费 | 久久激情国产 | 久久久久久久黄色片 | 日韩欧美精品电影 | 北原夏美av | 久久精品视频免费观看 | 91,视频免费看 | 久久精品视频一区二区三区 | 2017亚洲男人天堂 | 伊人成人免费视频 | 欧美成人免费 | 日韩三级伦理在线观看 | 亚州精品在线视频 | 成人免费毛片在线观看 | 国产一级在线看 | 黄色男女视频 | 日本成人在线免费 | 红桃一区| 亚洲精中文字幕二区三区 | 久久国产成人精品国产成人亚洲 |