如果您的頁面中有很多產品,對於每個產品您會希望有產品說明,但每個產品都會有大量的文字說明,使用者也許只對一兩項產品有興趣,卻得下載其它產品的大量文字說明。
您可以使用非同步請求,在使用者將滑鼠指向產品時,從伺服端下載產品說明並顯示,這樣就可以節省大量的說明文字下載。
例如我的Gossip首頁就是一個例子,以下是簡化後的HTML內容:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=BIG5"> <title>提示文字</title> <script type="text/javascript" src="TipsEx-1.js"></script> </head> <body> <a href= "http://www.gotop.com.tw/waweb2004/home/home.aspx?pg=HM010X&bn=AXP011800"><small> <img id="ajax" onmouseover="getBookData(this);" onmouseout="clearData();" style="border: 0px solid ; width: 80px; height: 110px;" alt="Ajax in action 中文版" title="Ajax in action 中文版" src="images/ajax_in_action_c.jpg" hspace="10" vspace="2"></small></a><p></p>
<div id="popup" style="position: absolute;"> <table bgcolor="#ffffbb" border="0" cellpadding="2" cellspacing="2"> <tbody id="bookDataBody"></tbody> </table> </div>
</body> </html>
滑鼠指到書的圖片上時,會取得書籍說明,滑鼠移開圖片,說明會消失,您可以使用以下的JavaScript來達到這個功能:
var xmlHttp; var book;
function createXMLHttpRequest() { if (window.ActiveXObject) { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); } }
function getBookData(element) { createXMLHttpRequest(); book = element; // 懶得寫Servlet了,直接取得.txt的文字 XD var url = element.id + ".txt"; xmlHttp.open("GET", url); xmlHttp.onreadystatechange = callback; xmlHttp.send(null); }
function callback() { if (xmlHttp.readyState == 4) { if (xmlHttp.status == 200) { // 計算提示文字位置 setTipsPosition(); // 建立表格列(Row),並設定取得的文字 var row = createRow(xmlHttp.responseText); document.getElementById("bookDataBody").appendChild(row); } } }
// 清除說明 function clearData() { var bookDataBody = document.getElementById("bookDataBody"); bookDataBody.removeChild(bookDataBody.childNodes[0]); document.getElementById("popup").style.border = "none"; }
function createRow(data) { var txtNode = document.createTextNode(data); var cell = document.createElement("td"); cell.setAttribute("bgcolor", "#FFFFBB"); cell.setAttribute("border", "0"); cell.appendChild(txtNode); var row = document.createElement("tr"); row.appendChild(cell);
return row; }
function setTipsPosition() { // 計算說明的X座標 var end = book.offsetWidth + 50; var top = calculateOffset(book) + 25; var popup = document.getElementById("popup"); popup.style.border = "gray 3px double"; popup.style.left = end + "px"; popup.style.top = top + "px"; }
// 計算說明的Y座標 function calculateOffset(field) { var offset = 0; while(field) { offset += field.offsetTop; field = field.offsetParent; } return offset; }
可以看一下 執行結果。
|