长文章分页一点思路

如何将长长的一篇文章分成几页显示?最简单也最完美的办法是人为的告诉程序哪边要分页,并做上相应的分页标识,但是这样无疑加大了录入员的工作量;另一种办法是程序自动进行分页,比如按字数每页显示多少个字,但这边要注意的问题是不能截断HTML、UBB等代码,大家可根据需要选择一种方式。还有一点要说明的是读取方式,很多人都是显示新一页时从数据库重新读取内容,而我的思路是一次读取将不同页内容保存于一个数组中再利用脚本动态更新,有人又要说了,这样不便于搜索引擎收录,大家还是根据需要选择,呵呵。

一、人为做分页标识

为了方便使用,我写成了一个函数mySplit,使用时拷贝一下调用就可以了

1.多次读取
'函数名称:mySplit
'编写:Dnawo(http://www.mzwu.com/)
'功能说明:按分页标识mark分几页显示内容content,有分页列表
'参数说明:
'content:内容
'mark:分页标识
'page:当前页数
'调用格式:Call mySplit("aaa{!page}bbb{!page}ccc","{!page}",request("page"))
Sub mySplit(content,mark,page)
    If Instr(content,mark)=0 then
        Response.write content
        Exit Sub
    End if
    Dim strContent,i
    If isempty(page)="" then page=0
    page = Cint(page)
    strContent = Split(content,mark)
    Response.write strContent(page) & vbcrlf
    Response.write "<div id=""mzwucom_list"" style=""text-align:center"">"
    If page>0 then Response.write "<input type=""button"" value=""上一页"" onclick=""javascript:document.location.href='?page=" & page-1 & "';""> "
    For i=0 to Ubound(strContent)
        Response.write "<a href=""?page=" & i & """>" & i+1 & "</a> "
    Next
    If page<Ubound(strContent) then Response.write "<input type=""button"" value=""下一页"" onclick=""javascript:document.location.href='?page=" & page+1 & "';"">"
    Response.write "</div>"
End Sub


2.一次读取
'函数名称:mySplit
'编写:Dnawo(http://www.mzwu.com/)
'功能说明:按分页标识mark分几页显示内容content,有分页列表
'参数说明:
'content:内容
'mark:分页标识
'调用格式:Response.write mySplit("aaa{!page}bbb{!page}ccc","{!page}")
Function mySplit(content,mark)
    mySplit = mySplit + "<div id=""mzwucom_content""></div>" & vbcrlf
    mySplit = mySplit + "<div id=""mzwucom_list"" style=""text-align:center""></div>" & vbcrlf
    mySplit = mySplit + "<script language=""javascript"">" & vbcrlf
    mySplit = mySplit + "function showpage(n){" & vbcrlf
    mySplit = mySplit + "    i = n;" & vbcrlf
    mySplit = mySplit + "    var list = """";//存放列表" & vbcrlf
    mySplit = mySplit + "    if(n>0){list = ""<input type='button' value='上一页' onclick='javascript:showpage("" + (i-1) + "");'> "";}" & vbcrlf
    mySplit = mySplit + "    document.getElementById(""mzwucom_content"").innerHTML = content[n];" & vbcrlf
    mySplit = mySplit + "    for(var j=0;j<content.length;j++){" & vbcrlf
    mySplit = mySplit + "        list += ""<a href='javascript:showpage("" + j + "");'>"" + (j+1) + ""</a> "";" & vbcrlf
    mySplit = mySplit + "    }" & vbcrlf
    mySplit = mySplit + "    if(i<count){list += ""<input type='button' value='下一页' onclick='javascript:showpage("" + (i+1) + "");'>"";}" & vbcrlf
    mySplit = mySplit + "    if(count != 0){document.getElementById(""mzwucom_list"").innerHTML = list;}" & vbcrlf
    mySplit = mySplit + "}" & vbcrlf
    mySplit = mySplit + "var i = 0;//存放当前页数" & vbcrlf
    mySplit = mySplit + "var count;//存放数组长度" & vbcrlf
    mySplit = mySplit + "var content = new Array(""" & Replace(content,mark,""",""") & """);//用数组存放各页内容" & vbcrlf
    mySplit = mySplit + "count = content.length-1;" & vbcrlf
    mySplit = mySplit + "showpage(0);//初始化" & vbcrlf
    mySplit = mySplit + "</script>" & vbcrlf
End Function


二、程序自动分页

程序自动进行分页,网上查了相关资料,用得最多的方法不外乎三种:第一种按每页显示多少字进行分页,不考虑是否会截断HTML、UBB标记,这种方法最不可取;第二种方法按每页显示多少行进行分页,但实际上我们并不会给每行都加上<br>,所以这种方法也不可取;第三种方法先设 pagesize 为基本页长,先找到这个基本页长,从这里出发,再去找 “<p>” 或 “<br>” 这样的分段符号,找到后,记下它的位置和从起始位置到它有多少个字符,下一页,从这个分段符出发,再找基本页,再寻分段符,记录位置和长度。。就这样循环,到文章结束,此法最为可取,下边函数基本参数了此法,但做了一些改进,是从基本页长位置向前向后找<br>和<p>,采取就近原则,用最近的位置做为分页点,函数代码如下:
'函数名称:MarkContent
'编写:Dnawo(http://www.mzwu.com/)
'功能说明:按每页显示iCount字进行分页,在分页处插入分页标识符,再配合mySplit函数进行分页。实际每页字数约等于iCount
'参数说明:
'strContent:要进行分页的内容
'iStart:开始位置
'iCount:每页总字符数
Function MarkContent(strContent,iStart,iCount)
    MarkContent = strContent
    If Len(Right(MarkContent,Len(MarkContent)-iStart+1))<=iCount then
        Exit Function
    Else
        '声明一些常量变量
        Const strMark = "{!page}"
        Dim strTemp,arr(4),iLen,iStartb,strLeft,strRight,i
        iLen = Len(strMark)
        '将原字符串拆分
        strTemp = Left(MarkContent,iStart-1)
        MarkContent = Right(MarkContent,Len(MarkContent)-iStart+1)
        '判断iCount位置是不是处于<p>或<br>上并进行相应处理
        If mid(MarkContent,iCount,1)=">" then iCount = iCount + 1
        If mid(MarkContent,iCount,2)="p>" then iCount = iCount + 2
        If mid(MarkContent,iCount,2)="r>" then iCount = iCount + 2
        If mid(MarkContent,iCount,3)="br>" then iCount = iCount + 3
        If mid(MarkContent,iCount,3)="<p>" then iCount = iCount + 3
        If mid(MarkContent,iCount,4)="<br>" then iCount = iCount + 4
        '从iCount位置往前往后找<p>和<br>,采取就近原则,在离iCount最近的位置进行分页
        arr(0) = InstrRev(MarkContent,"<br>",iCount,1)
        arr(1) = InstrRev(MarkContent,"<p>",iCount,1)
        arr(2) = Instr(iCount,MarkContent,"<br>",1)
        arr(3) = Instr(iCount,MarkContent,"<p>",1)
        arr(4) = 0
        If arr(0)<>0 and arr(4)=0 then
            arr(4) = abs(arr(0)-iStart)
            iStartb = arr(0) + 4
        Elseif arr(0)<>0 and abs(arr(0)-iStart) < arr(4) then
            arr(4) = abs(arr(0)-iStart)
            iStartb = arr(0) + 4
        End if
        If arr(1)<>0 and arr(4)=0 then
            arr(4) = abs(arr(1)-iStart)
            iStartb = arr(1) + 3
        Elseif arr(1)<>0 and abs(arr(1)-iStart) < arr(4) then
            arr(4) = abs(arr(1)-iStart)
            iStartb = arr(1) + 3
        End if
        If arr(2)<>0 and arr(4)=0 then
            arr(4) = abs(arr(2)-iStart)
            iStartb = arr(2) + 4
        Elseif arr(2)<>0 and abs(arr(2)-iStart) < arr(4) then
            arr(4) = abs(arr(2)-iStart)
            iStartb = arr(2) + 4
        End if
        If arr(3)<>0 and arr(4)=0 then
            arr(4) = abs(arr(3)-iStart)
            iStartb = arr(3) + 3
        Elseif arr(3)<>0 and abs(arr(3)-iStart) < arr(4) then
            arr(4) = abs(arr(3)-iStart)
            iStartb = arr(3) + 3
        End if
        If arr(4)=0 then
            MarkContent = strTemp & MarkContent
        Else
            strLeft = Left(MarkContent,iStartb-1)
            strRight = Right(MarkContent,Len(MarkContent)-iStartb+1)
            MarkContent = strTemp & strLeft & strMark & strRight
            iStartb = iStartb + iLen + iStart - 1
            '递归
            MarkContent = MarkContent(MarkContent,iStartb,iCount)
        End if
    End if
End Function


评论: 2 | 引用: 0 | 查看次数: 4350
管理员[2007-09-13 12:58 AM | | | 218.5.18.18 | del | 回复回复]
板凳
手工分页的话就是在录入的时候手工在需分页的地方插入分页标记如"{!page}",然后保存至数据库
如“aaaaaaaaaaaaa{!page}bbbbbbbbb{!page}ccccccccc"

显示的时候把内容全部读取出来,以{!page}为分隔符保存至一个数组中
并根据地址中传递的参数来决定当前显示第几页的内容,如view.asp?page=2
远方[2007-09-13 12:41 AM | | | 218.108.53.254 | del | 回复回复]
沙发
请问这个与数据库怎么接?就是从数据库里读取相关数据然后分页显示,我试了不行,指教
发表评论
登录后再发表评论!