詳解AJAX核心 —— XMLHttpRequest 對象 (下)

作者: 依依老貓  來源: 博客園  發布時間: 2009-04-27 10:25  閱讀: 2216 次  推薦: 0   原文鏈接   [收藏]  

繼續上一篇的內容
上一篇關于XMLHttpRequest 對象發送對服務器的請求只說到了用Get方式,沒有說Post方式的。那是因為要說Post方式就需要先說另外一個東西,那就是DOM(Document Object Model)文檔對象模型。JavaScript通過DOM讀取、改變或者刪除 HTML、XHTML 以及 XML中的元素,可以重構整個 HTML 文檔。可以添加、移除、改變或重排頁面上的項目,而且這樣的操作會馬上顯示在頁面上。另外,所有瀏覽器執行W3C 發布的 DOM 標準規范,DOM的跨瀏覽器的兼容問題也就不是問題了。

先來看看下面的這個HTML文檔

<html>
  <head>
    <title>文檔標題title>
  head>
  <body>
    <h1>我的標題h1>
    <href="">我的鏈接a>
  body>
html>

這個HTML文檔轉換成對象表示就是下圖這個DOM樹。

從這個樹就能看出來,HTML中的每一項對應到DOM中都是一個節點,包括屬性和文本。
而每個節點都包含某些信息的屬性。節點屬性包括下面三種:

  • nodeName(節點名稱)
  • nodeValue(節點值)
  • nodeType(節點類型)

nodeName
nodeName 屬性含有某個節點的名稱。

  • 元素節點的 nodeName 是標簽名稱
  • 屬性節點的 nodeName 是屬性名稱
  • 文本節點的 nodeName 永遠是 #text
  • 文檔節點的 nodeName 永遠是 #document

注釋:nodeName 所包含的 XML 元素的標簽名稱永遠是大寫的

nodeValue

  • 對于文本節點,nodeValue 屬性包含文本。
  • 對于屬性節點,nodeValue 屬性包含屬性值。

nodeValue 屬性對于文檔節點和元素節點是不可用的。

nodeType
nodeType 屬性可返回節點的類型。
主要常用節點類型有下面幾種:

  • 元素節點類型是1
  • 屬性節點類型是2
  • 文本節點類型是3
  • 文檔節點類型是9

使用DOM從取得DOM對象開始,看看怎么訪問DOM對象本身吧:

var domTree = document;

實際中我們更多的是直接使用 document 而來表示DOM對象。
從這里開始,我們可以通過DOM對象訪問文檔中的所有內容了。

再看看取的節點所使用的方法吧。
我們重點來看看getElementById() 和 getElementsByTagName()

  • document.getElementById("ID");  返回通過 ID 指定的節點;
  • document.getElementsByTagName("標簽名稱"); 返回指定的標簽名所有的節點(作為一個節點列表);

在本文我們用到的主要用到的就是上面這些方法,具體詳細的內容可以上網搜索,或者可以到這里查看:具體的詳細信息可以看http://www.w3school.com.cn/htmldom/index.asp

下面做一個簡單的例子,看看怎么使用DOM以Post方法發送內容給服務器,并把結果顯示出來。
看看這個HTML頁面

<html>
 <head>
  <title>AJAX and the DOMtitle>
 head>
 <body>
  <div id="Content">
   <input type="text" id = "name" value="myname" />
   <br/>
   <input type="text" id = "age" value="99" />
  div>
  <input type="button" value="Tell me!" />
  <div id = "result">div>
 body>
html>

我們的目標就是簡單的把名字和年齡發送給服務器進行處理,并把結果顯示在result這個DIV中。
XMLHttpRequest 對象 就使用上一篇的方法創建,這里就不再多說了。
首先就是要取得名字和年齡的值

var name = document.getElementById("name").value; //取名字
var age = document.getElementById("age").value;  //取年齡

然后再將名字和年齡按照通信格式拼接

var info = name+"|"+age; //簡單的將姓名和年齡用豎線分割交給服務器處理

好了,整理好要發送的內容,確定發送的地址,以及方式;看,這里就是用Post方式了,地址自然就是要進行處理服務器的地址了。

xmlhttp.open("Post","http://localhost/WebForm1.aspx",true);

這個時候我們就可以使用send方法將info對象發送給服務器了。

xmlhttp.send(info);

處理返回的結果也很簡單了,直接把結果顯示在result中

var result = document.getElementById("result").firstChild;
xmlhttp.onreadystatechange 
= function (){
 
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
  result.nodeValue 
= xmlhttp.responseText;
 }
}

順帶說一下,把結果顯示在result這個DIV中,為什么是 getElementById("result").firstChild 而不是直接getElementById("result")。這就跟開始時說的DOM對象有關系了,前面也說過,在DOM中文本也是一個節點,這里DIV中的文本就是result這個DIV的子節點,而又是唯一一個節點,所以用firstChild就可以取到了。

完整的頁面代碼

服務器端就做最近簡單的處理,代碼如下:

<%@ Page language="c#" AutoEventWireup="true" %>
<script language="C#" runat="server">
public string result;
private 
void Page_Load(object sender, System.EventArgs e)
{
 
// 在此處放置用戶代碼以初始化頁面
 System.IO.StreamReader sr = new System.IO.StreamReader(Page.Request.Input
Stream,System.Text.Encoding.UTF8);
 string[] gets 
= sr.ReadToEnd().Split('|');
 result 
= string.Format(@"Your name is {0},{1} years old!",gets[0],gets[1]);
}

script>
<%=result%>

一個簡單的以Post方式發送的例子就完成了。

最后,在不同的情況需要使用setRequestHeader來修改請求頭來不是直接發送就可以了。

0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()