2384381190

13590589238

ASP长文章分页完美显示解决方案——结合指定字数与

2012-7-10 浏览 2885

ASP长文章分页是一件麻烦的事情。按照字数来强行划分的话,可能会遇到很多麻烦的代码,不如HTML标记,简单的如&nbsp;、<br>等等,打破了还不怎么影响显示,最多也就是多出来几个破碎的代码,如同乱码一般;而复杂的,如<img>等等被打破则意味着显示会出大乱子,比如图像的显示消失,比如表格(Table)的破碎等等。

    那么,考虑到我们一般很少在文章当中内嵌表格(Table)和其他需要元素内部换行、而拆对之后显示不正常的元素,我们结合指定字数和分行的<br>、<p>来完成分页完美显示如何?答案是肯定的。首先我们必须明确的是:并非有了表格元素(Table)而且其内部有换行就无法解决了,看下面的代码,你也照样可以考虑如何检测<br>或者<p>两端是否有拆开的<table>标记对,进而控制显示。

    工作原理:根据指定的字符数,在需要显示的文章的相对的位置断开,检测该位置后面的<br>或者<p>来确定分页的位置以及每个页显示的字符数(也就是说每个页面显示的字数不是指定的字符数,而是有一个Offset[偏移]的数字,也许小于指定字符数,也许大于指定字符数)。

    特别点出:一般而言我们指定的字符数都是一个相对较大的数字,应该可以很好的包含多个<br>或者<p>。但是不表示所用人都会老老实实的分行,也不表示某次分行之前的一个段落远远超过指定字符数的二倍三倍,所以使用下面的代码还需要考虑的是这些超大段落造成的分页页数的问题,否则也是一件麻烦事情。具体判断方法可以在计算每一个页面需要显示的字数的时候用累积字符数和指定页面理论上需要显示到的位置做一下比较,继而确定分页页数。由于时间比较少,下面的代码当中并未包含该功能。读者需要自己设定一下。

    代码如下:

---------------------------------------分割线:以下为代码-----------------------------------------
<!--#include file=conn.asp-->
<style>.{font-size:12px;font-family:"Bookman Old Style";}</style>
<%
Set rs = server.CreateObject("ADODB.REcordset")
sql = "select * from info where id = 1 "
rs.open sql,conn,1,1
content = rs("content") '获取要读取的文章的内容
helen = Len(content) '文章长度
pchr = 1500 '预设定的分页规划字符数(参考值,一般分页的字数不会正好为预定值
'计算要显示的页面个数
If helen Mod pchr = 0 Then
pagenum = helen/pchr
Else
pagenum = Int(helen/pchr) + 1
End If
pagecharnumstr = "" '初始化每一页显示字数的数组
pagedcharnum = 0 '初始化已累积字数
'计算每一页需要显示的字符数
i = 1
Do While i <= pagenum-1
pp = InStr(Right(content,helen-pchr*i),"<p>") '读取出现<p>的位置。如0则为无
pb = InStr(Right(content,helen-pchr*i),"<br>") '读取出现<br>的位置。如0则为无
'response.write pp&"-"&pb '输出出现<p>和<br>的位置
'判断去<p>的位置还是取<br>的位置,哪个靠前取哪个。减一为了让<p>或者<br>保持完全——不减一则最后显示一个"<"
If pp <> 0 And pb <> 0 Then '都存在
If pp > pb Then
pagechar = pchr*i - pagedcharnum + pb - 1
Else
pagechar = pchr*i - pagedcharnum + pp - 1
End If
ElseIf pp = 0 And pb <> 0 Then '不存在<br>而存在<p>
pagechar = pchr*i - pagedcharnum + pb - 1
ElseIf pp = 0 And pb = 0 Then '都不存在
pagechar = helen
Else '存在<br>而不存在<p>
pagechar = pchr*i - pagedcharnum + pp - 1
End If
pagedcharnum = pagedcharnum + pagechar '计算累积字符数
pagecharnumstr = pagecharnumstr&pagechar&"." '生成每一页需要显示字符数的数组
'response.write "|"&pagechar&"/"&pagedcharnum&"<br>" '输出的是:当前分配页面字符数/累积的字符数
i = i + 1
Loop
pagelast = helen - pagedcharnum '计算出最后一页需要显示的字符数
If pagelast = 0 Then '因为偏移可能为0,因此声明当最后一页字符数为0时页面数要减少一
pagenum = pagenum - 1
Else
pagecharnumstr = pagecharnumstr&pagelast&"." '如否则生成最后完整的每一页面需要显示字符数数组
End If
'response.write "<br>"&pagecharnumstr&"\"&pagedcharnum&"|"&pagelast&"/"&pagenum&"<br>" 输出数组、累积字符数、最后一页字数、分页数(其中累计字符数+最后一页字数=全文长度)
'循环输出每一个页面需要显示的内容
pagedchrnum = 0 '初始化已使用字符数
g = 0
Do While g <= pagenum-1
response.write "<span style=color:#f20>page:"&g+1&"</span> - "
response.write Split(pagecharnumstr,".")(g)&"<br>"
pagechrnum = Split(pagecharnumstr,".")(g) '从数组当中获取当前页码需要显示的字数
pageanum = Split(pagecharnumstr,".")(0) '第一页字数
'pagelnum = Split(pagecharnumstr,".")(pagenum-1) '最后一页字数
pagedchrnum = pagedchrnum + Split(pagecharnumstr,".")(g) '已累积使用字数
If g = 0 Then '第一页
response.write Left(content,pagechrnum)&"<br>"
ElseIf g = 1 Then '第二页
response.write pagedchrnum&"<br>"
response.write helen-pageanum&"/"&pagedchrnum&"/"&pagechrnum&"<br>"
response.write Left(Right(content,helen-pageanum),pagechrnum)&"<br>"
'ElseIf g = pagenum-1 Then '最后一页
'response.write Right(content,pagelnum)&"<br>"

Else '其他各页
response.write pagedchrnum&"<br>"
response.write helen-pagedchrnum&"/"&pagedchrnum&"/"&pagechrnum&"<br>"
response.write Left(Right(content,helen-pagedchrnum+pagechrnum),pagechrnum)&"<br>"
End If
g = g + 1
Loop
%>
---------------------------------------分割线:以上为代码-----------------------------------------

    最后的几点提示:
    1.为什么要得到每个页面需要显示字符数的数组?
    为了后面循环输出。如果是使用参数来确定的话,不得到也无所谓。
    2.为什么要得到最后一页的字数?
    得到最后一页字数的用途不是为了用其去显示,其实最后的几行代码已经明确,要显示最后一页,根本用不到最后一页字数来做。而这个字数对于确定一共有多少页很有必要,因为每一个页面上显示的字数都是以指定字符数(本例当中预设的为1500)偏移的,也许最后的一次偏移会将文章的结尾包含进来,所以一定要设置。
    3.这个代码是教程用代码,不是用参数来得到页面的,自己用的时候需要整理一下。
    4.对于<p>写成<p style="">之类的形式怎么办?
    凉拌。别人会变,你也变化下代码不就好了?但是<p可未必全是HTML代码标记。用的时候还是需要细心。也就是说:本代码不具备完全通用性。
    5.对于超大段落的文章编写方式——虽然我很鄙视,但是我无权干涉别人怎么做。我给的建议是:养成良好的段落划分习惯。
    6.对于文章最后放一大堆的<br>、<p>来分行导致最后一页空白的问题?
    考虑到这个问题,我只有一个想法:谁这么写的?大嘴巴子伺候!但是偶尔会有一个两个的<br>或者<p>被误操作写到文章最后,一般不会造成分页中最后一页空白。能造成最后一页空白的,至少也要插入指定字符数减去最后一页字符数再除以3("<p>“的字符数)个段落标记——不抽他还等什么。

联系我们

CONTACT US

咨询热线: 地址:广东佛山龙江保涌工业区A101-A103 版权所有:花蝶谷工作室 备案号:粤ICP备2021090779号-2 QQ:2384381190 service@huadiegu.net
您是第 位访问者