我覺(jué)得還是有必要把我的ajax分頁(yè)呈現(xiàn)給大家.我先講一下這個(gè)ajax分頁(yè)的實(shí)現(xiàn)核心,然后我們?cè)倏磳?shí)例效果.所謂的ajax分頁(yè)與傳統(tǒng)的數(shù)據(jù)分頁(yè),在服務(wù)端的代碼基本上是一樣的.我們主要做的是使用ajax在不刷新的情況下,將請(qǐng)求的頁(yè)碼,和每頁(yè)要顯示的條數(shù)發(fā)送給服務(wù)端的處理網(wǎng)頁(yè).大家點(diǎn)擊這個(gè)網(wǎng)址就可以看到要請(qǐng)求的數(shù)據(jù):"ajax_page.asp?action=readpagecount=3 current_page=1"
在這段URL里,pagecount代表每頁(yè)要顯示幾條數(shù)據(jù),current_page代表要請(qǐng)求的頁(yè)碼.服務(wù)端就是根據(jù)這兩個(gè)參數(shù)來(lái)傳回你想要請(qǐng)求的數(shù)據(jù).下面我們看下實(shí)例效果:
這是前端的ajax代碼:
復(fù)制代碼 代碼如下:
html>
head>
title>ajax數(shù)據(jù)分頁(yè)/title>
style>
body{
font-size:12px;
}
table{
border-collapse:collapse;
}
li{
list-style:none;
border:1px solid;
width:20px;
height:20px;
text-align:center;
margin:5px;
padding:2px;
float:left;
cursor:pointer;
}
/style>
/head>
body>
默認(rèn)顯示每頁(yè)為5條數(shù)據(jù),你可以在下面文本框設(shè)置每頁(yè)的顯示條數(shù)hr/>
輸入每頁(yè)要顯示的條數(shù):input id="edit_count" type="text" /> input type="button" type="button" value="確定" onclick="Read()"/>
table border="1">!--該表格用來(lái)顯示數(shù)據(jù)內(nèi)容-->
thead>tr>td>編號(hào)/td>td>內(nèi)容/td>/tr>/thead>
tbody id="a">/tbody>
/table>
span id="msg" style="color:red">/span>
br/>
ul id="page">!--頁(yè)導(dǎo)航-->
/ul>
script type="text/javascript">
var All_page;//總頁(yè)數(shù)
var All_record;//總條數(shù)
var Current_page;//當(dāng)前頁(yè)
var PageCount;//每頁(yè)顯示的條數(shù)
function ajax_xmlhttp(){
//在IE中創(chuàng)建xmlhttpRequest,適用于IE5.0以上所有版本
var msXmlhttp = new Array("Msxml2.XMLHTTP.5.0","Msxml2.XMLHTTP.4.0","Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP","Microsoft.XMLHTTP");
for(var i=0; imsXmlhttp.length; i++){
try
{
_xmlhttp=new ActiveXObject(msXmlhttp[i]);
}
catch(e)
{
_xmlhttp=null;
}
} //循環(huán)創(chuàng)建基于IE瀏覽器的xmlhttp.結(jié)束
//如果非IE瀏覽器,則創(chuàng)建基于FireFox等瀏覽器的xmlhttpRequest
if(!_xmlhttp typeof XMLHttpRequest != "undefined")
{
_xmlhttp=new XMLHttpRequest();
}
return _xmlhttp;
}
//獲取元素函數(shù)
function $(elem){
return typeof elem == "string" ? document.getElementById(elem) : elem;
}
//讀取數(shù)據(jù)函數(shù)
function Read(){
if(arguments.length!=0){//如果有參數(shù)傳遞過(guò)來(lái),則證明你點(diǎn)擊了某個(gè)頁(yè)碼
var e = arguments[0] || window.event; //標(biāo)準(zhǔn)化事件對(duì)象
var obj = e.target || e.srcElement; //獲取事件對(duì)象,你點(diǎn)擊的那個(gè)頁(yè)碼元素
Current_page = parseInt(obj.innerHTML);//獲取元素中的數(shù)字值,證明你要請(qǐng)求的是第幾頁(yè)
$("msg").innerHTML = "當(dāng)前為第"+Current_page+"頁(yè)";//提示信息:當(dāng)前請(qǐng)求的頁(yè)
}
PageCount = $("edit_count").value;//獲取文本框的值
if(PageCount.length == 0){ //如果文本框?yàn)榭?
PageCount = 5; //默認(rèn)每頁(yè)顯示5條數(shù)據(jù)
}
var ajax = ajax_xmlhttp(); //將xmlhttprequest對(duì)象賦值給一個(gè)變量.
ajax.open("post","ajax_page.asp?action=readpagecount="+PageCount+" current_page="+Current_page,true);//設(shè)置請(qǐng)求方式,請(qǐng)求的網(wǎng)頁(yè),url的action參數(shù)為read,異步請(qǐng)求
ajax.onreadystatechange = function(){//你也可以這里指定一個(gè)已經(jīng)寫(xiě)好的函數(shù)名稱(chēng)
if(ajax.readyState == 4){//數(shù)據(jù)返回成功
if(ajax.status == 200){//http請(qǐng)求狀態(tài)碼返回ok
var xmlData = ajax.responseXML;//以xml格式接收返回的數(shù)據(jù),并保存在xmlData變量里
All_Record = xmlData.getElementsByTagName("allrecord")[0].firstChild.nodeValue;
All_page = All_Record / PageCount;
var page_list = $("page");
while(page_list.childNodes.length!=0){
page_list.removeChild(page_list.childNodes[0]);
}
for(var i=0;iMath.ceil(All_page);i++){ //動(dòng)態(tài)創(chuàng)建頁(yè)碼列表
var li = document.createElement("li");
li.innerHTML = i+1;//因?yàn)閕以0開(kāi)始,所以要+1顯示頁(yè)碼
li.onclick = function(e){Read(e)};//為每個(gè)li的頁(yè)碼綁定單擊事件
page_list.appendChild(li);//將生成好的頁(yè)碼元素放到div里
}
var list = xmlData.getElementsByTagName("list");//在返回的數(shù)據(jù)里,獲取所有l(wèi)ist標(biāo)簽
if(list.length!=0){
var t = document.getElementById("a");//獲取展示數(shù)據(jù)的表格
while(t.rows.length!=0){ //在讀取數(shù)據(jù)時(shí)如果表格已存在行.一律刪除
t.removeChild(t.rows[0]);
}
for(var i=0;ilist.length;i++){
var tr = t.insertRow(t.rows.length);//有幾個(gè)list就為表格增加幾行.
var td = tr.insertCell(0);//第一個(gè)單元格存放數(shù)據(jù)編號(hào)
td.innerHTML = list[i].childNodes[0].firstChild.nodeValue;
var td = tr.insertCell(1);//第二個(gè)單元格存放數(shù)據(jù)內(nèi)容
td.innerHTML = list[i].childNodes[1].firstChild.nodeValue;
}
}
}
}
}
ajax.send(null);//提交請(qǐng)求,參數(shù)為null
}
Read();//運(yùn)行Read函數(shù)
/script>
/body>
/html>
上面是本次ajax分頁(yè)教程的前端代碼,html部份我們就不講了.直接開(kāi)始script中的內(nèi)容.首先我們定義了4個(gè)全局變量,分別是:
All_page:總頁(yè)數(shù),創(chuàng)建頁(yè)碼的根據(jù)
All_Record:數(shù)據(jù)總條數(shù),All_Record/PageCount=All_page 得到總頁(yè)數(shù)
Current_page:當(dāng)前請(qǐng)求的頁(yè)碼.傳送給服務(wù)端
PageCount:每頁(yè)顯示的條數(shù),傳送給服務(wù)端
然后依次是我寫(xiě)的3個(gè)自定義函數(shù),分別為:
ajax_xmlhttp();該函數(shù)的作用是創(chuàng)建一個(gè)可用的XMLHTTPRequest對(duì)象,如果你還不知道什么是XMLHTTPRequest.請(qǐng)了解什么是XMLHTTPRequest
$(elem);獲取元素的函數(shù),根據(jù)頁(yè)面中元素的id來(lái)對(duì)某個(gè)元素的引用,其實(shí)就是document.getElementById的縮寫(xiě)與引用,寫(xiě)成函數(shù)以后直接可以使用$("元素id")即可獲取該元素.
Read():讀取數(shù)據(jù)的函數(shù).也是我們的老朋友了,在前幾篇的教程里都有使用.下面我們仔細(xì)來(lái)分析下,這一次我們?cè)赗ead()函數(shù)里做了些什么.
(1):if(arguments.length!=0)這是在判斷在調(diào)用Read()函數(shù)時(shí),是否有參數(shù)傳遞過(guò)來(lái).如果有參數(shù),則證明你點(diǎn)擊了某個(gè)頁(yè)碼而觸發(fā)了Read().這時(shí)我們應(yīng)該獲取該頁(yè)碼,將頁(yè)碼數(shù)字賦值給Crrent_page變量.點(diǎn)擊了解:arguments
(2):var e = arguments[0] || window.event;標(biāo)準(zhǔn)化事件對(duì)象,arguments[0]是為了FF瀏覽器,window.event是IE瀏覽器
(3):var obj = e.target || e.srcElement;標(biāo)準(zhǔn)了事件對(duì)象以后,我們要獲取事件的源.也就是說(shuō)是那個(gè)元素觸發(fā)了Read()函數(shù).此時(shí)的obj就是你點(diǎn)擊的那個(gè)頁(yè)碼元素.
(4):Current_page = parseInt(obj.innerHTML);獲取元素中的數(shù)字值,證明你要請(qǐng)求的是第幾頁(yè),在下面的請(qǐng)求中會(huì)把該值發(fā)送給服務(wù)端.
(5):PageCount = $("edit_count").value;獲取文本框里的值,如果你沒(méi)有向文本框里輸入值.那么每頁(yè)默認(rèn)顯示5條數(shù)據(jù).再聲明一次,以前講過(guò)的內(nèi)容我們不再重復(fù)講解.也就是說(shuō)關(guān)于上面的代碼我在該教程里沒(méi)有解釋到的.在以前的教程里會(huì)找到相關(guān)解釋?zhuān)?
(6):ajax.open("post","ajax_page.asp?action=readpagecount="+PageCount+" current_page="+Current_page,true);我們?cè)谡?qǐng)求的Url里將Pagecount與Current_page變量傳遞給了服務(wù)端,服務(wù)端接收到這兩個(gè)變量以后會(huì)經(jīng)過(guò)判斷.如果PageCount為空那么將默認(rèn)為5.如果Current_page為空則默認(rèn)為第1頁(yè),然后會(huì)將相應(yīng)的數(shù)據(jù)傳回給客戶(hù)端.
(7):All_Record = xmlData.getElementsByTagName("allrecord")[0].firstChild.nodeValue;從服務(wù)端接收一個(gè)allrecord標(biāo)簽元素.該元素包含了一個(gè)數(shù)字值,該數(shù)字值是數(shù)據(jù)的總條數(shù).
(8):All_page = All_Record / PageCount;用總條數(shù)All_Record除以PageCount等于總頁(yè),得出有幾頁(yè)數(shù)據(jù)以后.我們會(huì)根據(jù)All_page來(lái)創(chuàng)建當(dāng)前頁(yè)碼列表.
(9):var page_list = $("page");獲取存放頁(yè)碼列表的那個(gè)div元素.while(page_list.childNodes.length!=0)循環(huán)遍歷該div內(nèi)的子元素.將其子元素全部刪除.每次根據(jù)當(dāng)前頁(yè)顯示的條數(shù)不同,會(huì)生成不同的頁(yè)碼,所以必須刪除上次請(qǐng)求生成的頁(yè)碼列表,當(dāng)然你也可以改進(jìn)我這種做法!如果你還不了解什么是子元素或如何刪除子元素,請(qǐng)參閱:childNodes與removeChild
(10):for(var i=0;i Math.ceil(All_page);i++);使用一個(gè)for循環(huán)根據(jù)總頁(yè)數(shù)來(lái)動(dòng)態(tài)的生成頁(yè)碼列表,如果All_page為5,則生成5個(gè)頁(yè)碼.因?yàn)榭紤]到了會(huì)有余數(shù).我使用了Math.ceil.如果你還不知道Math與ceil的作用,請(qǐng)參閱:Math與ceil
(11):var li = document.createElement("li");創(chuàng)建一個(gè)li元素,并賦值給一個(gè)名字為li的變量.li.innerHTML= i+1;在li元素內(nèi)寫(xiě)入頁(yè)碼數(shù)值.因?yàn)閕是從0開(kāi)始的,所有要加1.
(12):li.onclick = function(e){Read(e)};為每個(gè)li元素綁定單擊事件,這個(gè)是重點(diǎn)必須要理解清楚.我們向li綁定了Read(e)函數(shù),并且利用e參數(shù)傳遞了事件對(duì)象.當(dāng)你點(diǎn)擊每個(gè)頁(yè)碼的時(shí)候會(huì)再次觸發(fā)Read函數(shù)來(lái)讀取數(shù)據(jù).這個(gè)時(shí)候運(yùn)行的Read(e)函數(shù),是帶有參數(shù)的.我們正是從參數(shù)內(nèi)獲得了你請(qǐng)求的頁(yè)碼,然后賦值給Current_page,利用url發(fā)送給了服務(wù)端.
你注意一下在script腳本部份里的最后一行:Read();此時(shí)Read()沒(méi)有參數(shù),并且只有當(dāng)打開(kāi)頁(yè)面或刷新頁(yè)面時(shí)才會(huì)執(zhí)行這個(gè)Read(),此時(shí)的Read()向服務(wù)端發(fā)送的Current_page是空的.PageCount默認(rèn)是5,這個(gè)時(shí)候服務(wù)端接收到空的頁(yè)碼,只會(huì)讀取5條數(shù)據(jù)給你.與此同時(shí)我也從服務(wù)端接收了數(shù)據(jù)的總條數(shù),利用總條數(shù)除以每頁(yè)顯示的條數(shù).創(chuàng)建了頁(yè)碼.并且為每個(gè)頁(yè)碼綁定了 Read(e)函數(shù).只有當(dāng)你點(diǎn)擊這些頁(yè)碼時(shí)帶有參數(shù)的Read(e)再次執(zhí)行數(shù)據(jù)讀?。藭r(shí)的讀取已經(jīng)向服務(wù)端發(fā)送了頁(yè)碼.你明白了嗎?
(13):page_list.appendChild(li);為li寫(xiě)好了頁(yè)碼,綁定了事件以后添加到上面被獲取的div元素里.請(qǐng)參閱:appendChild
哦了,上面講述的部份是本次ajax分頁(yè)教程中前端的核心部份,沒(méi)有講述的內(nèi)容在前幾篇的ajax教程里都有講解.下面我們來(lái)看下服務(wù)端的源碼并分析該源碼
復(fù)制代碼 代碼如下:
!--#include file="Conn.Asp"-->
%
'出自:http://Www.Web666.Net
'作者:康董
'如需轉(zhuǎn)載請(qǐng)務(wù)必保留以上信息
'定義一個(gè)變量,來(lái)保存xml數(shù)據(jù)
xml="?xml version='1.0' encoding='gb2312'?>body>"
action=Request.QueryString("action") '使用get方式接受一個(gè)action來(lái)判斷客戶(hù)端想要執(zhí)行什么操作
Select case action
case "read" '如果為read則執(zhí)行讀取數(shù)據(jù)的操作
Call Read
case else
xml = xml"msg>請(qǐng)求參數(shù)錯(cuò)誤,請(qǐng)不要試圖非法操作!/msg>"
End Select
xml=xml"/body>"
Response.Clear
Response.ContentType="text/xml"
Response.CharSet="gb2312"
Response.write xml
Response.End
Sub Read '自定義的讀取數(shù)據(jù)過(guò)程
Call OpenConn '打開(kāi)數(shù)據(jù)庫(kù)鏈接
Current_Page = Request("Current_Page") '當(dāng)前的頁(yè)碼
PageCount = request("PageCount") '當(dāng)前頁(yè)顯示的條數(shù)
xml = xml"page>"pagecount"/page>"
If Current_Page = "" Or Not IsNumEric(Current_Page) Then
Current_Page = 1
End If
If PageCount = "" Or Not IsNumEric(PageCount) Then '判斷條數(shù)輸入是否正確
PageCount = 5
End If
Sql = "Select count(*) From page_table" '讀取page_table表中共有多少條數(shù)據(jù)
Set Rs = Conn.Execute(Sql) '執(zhí)行sql語(yǔ)句
xml = xml"allrecord>"Rs(0)"/allrecord>"
If Current_Page = 1 Then '如果是第1頁(yè)
Sql = "Select Top "PageCount" * From page_table order by id desc"
Else
Sql = "Select Top "PageCount" * From page_table where id(Select Min(id) From (Select Top "((Current_Page-1)*PageCount)" id From page_table order by id desc)) order by id desc"
End If
Set Rs=Conn.Execute(Sql)
While Not Rs.Eof
xml = xml"list>"
xml = xml"id>"Rs("id")"/id>"
xml = xml"content>"Rs("content")"/content>"
xml = xml"/list>"
Rs.MoveNext '下一條
Wend
End Sub
%>
上面是本次ajax分頁(yè)教程實(shí)例中請(qǐng)求的服務(wù)端網(wǎng)頁(yè)源碼.我在服務(wù)端使用的是Asp技術(shù),當(dāng)然你也可以使用jsp,php,.net等輕松模擬.關(guān)于在服務(wù)端輸出xml數(shù)據(jù).在前幾篇的ajax教程里我都有講解.所以我們從該源碼中的Read讀取過(guò)程開(kāi)始講起:
1、Current_Page = Request("Current_Page") :接收客戶(hù)端ajax使用url參數(shù)傳遞過(guò)來(lái)的Current_page,請(qǐng)求的頁(yè)碼
2、PageCount = Request("PageCount") :接收客端ajax使用url參數(shù)傳遞過(guò)來(lái)的PageCount,每頁(yè)顯示的條數(shù)
3、然后分別判斷Current_Page是否為空.或者是否為數(shù)字.如果不符合條件.則將Current_page等于1.如果PageCount也為空,或者不是數(shù)字,則將PageCount等于5,也就是每頁(yè)讀取5條數(shù)據(jù)
4、Sql = "Select count(*) From page_table"這條sql的作用是讀取表內(nèi)一共有多少條數(shù)據(jù),也就是我們?cè)谇岸舜a所說(shuō)的總條數(shù).將這個(gè)總條數(shù)讀取以后并保存在一個(gè)allrecord的元素里.然后傳回給客戶(hù)端.客戶(hù)端每次讀取數(shù)據(jù)都會(huì)獲取這個(gè)數(shù)字.以該數(shù)字為依據(jù),進(jìn)行頁(yè)碼的創(chuàng)建.
5、If Current_Page = 1 Then 判斷Cruuent_Page是否為1,如果為1則執(zhí)行:Sql = "Select Top "PageCount" * From page_table order by id desc" 該sql語(yǔ)句的意思很簡(jiǎn)單,只讀取表內(nèi)的"PageCount"條數(shù)據(jù).如果你在前端沒(méi)有設(shè)置要讀取的條數(shù).那么 PageCount等于5,也就是只讀取5條數(shù)據(jù).讀取順序?yàn)閐esc,倒序讀??!
6、Else如果Crrent_Page不等于1,只有在你點(diǎn)擊了頁(yè)碼列表中非第1頁(yè)時(shí),Current_Page才不會(huì)是1,那么就執(zhí)行:Sql = "Select Top "PageCount" * From page_table where id(Select Min(id) From (Select Top "((Current_Page-1)*PageCount)" id From page_table order by id desc)) order by id desc",這條sql語(yǔ)句是分頁(yè)的核心.他的大致意思是說(shuō):在表中讀取PageCount條數(shù)據(jù).這些數(shù)據(jù)的id必須小于已經(jīng)顯示出來(lái)的數(shù)據(jù)中id最小的那條數(shù)據(jù).比如你點(diǎn)擊的是第3頁(yè),每頁(yè)顯示的條數(shù)為5條.那么這第三頁(yè)中要顯示的數(shù)據(jù)的id,必須要小于第二頁(yè)id最小的那條數(shù)據(jù),因?yàn)槭堑剐蜃x?。忝靼琢藛??如果你根本無(wú)法理解該Sql的意思.請(qǐng)惡補(bǔ)Sql的相關(guān)知識(shí).下面的代碼是從數(shù)據(jù)庫(kù)里讀取數(shù)據(jù),我在前幾篇都有過(guò)詳細(xì)的講解.a(chǎn)jax分頁(yè)至此完畢!
提示:<!--#include file="Conn.Asp"-->Conn.asp是我的數(shù)據(jù)庫(kù)鏈接文件.沒(méi)什么特別.你應(yīng)該可以自己寫(xiě)一個(gè)出來(lái).網(wǎng)上也有很多現(xiàn)成的代碼.本次讀取的數(shù)據(jù)庫(kù)表名為:page_table 字段分別為ID(自動(dòng)編號(hào)),content(數(shù)據(jù)內(nèi)容)
今天就講到這里,有什么不明白地方.請(qǐng)加 ajax技術(shù)交流群:110167482
您可能感興趣的文章:- 用jQuery中的ajax分頁(yè)實(shí)現(xiàn)代碼
- JQuery+Ajax無(wú)刷新分頁(yè)的實(shí)例代碼
- jQuery Pagination Ajax分頁(yè)插件(分頁(yè)切換時(shí)無(wú)刷新與延遲)中文翻譯版
- php,ajax實(shí)現(xiàn)分頁(yè)
- JS+Ajax+Jquery實(shí)現(xiàn)頁(yè)面無(wú)刷新分頁(yè)以及分組 超強(qiáng)的實(shí)現(xiàn)
- jQuery DataTables插件自定義Ajax分頁(yè)實(shí)例解析
- 使用PHP+JQuery+Ajax分頁(yè)的實(shí)現(xiàn)
- php+ajax實(shí)現(xiàn)無(wú)刷新分頁(yè)的方法
- 基于Jquery+Ajax+Json的高效分頁(yè)實(shí)現(xiàn)代碼
- AJAX分頁(yè)效果簡(jiǎn)單實(shí)現(xiàn)