有点难度的文本分页显示问题!欢迎高手来指点!来者有分了!

ywiori27 2004-09-14 10:26:27

将文本分页显示,我的思路是:
用\n\r.?!;:这些定界符,将文本分成一个数组,这个数组的每一个元素都是以\n\r.?!;:结尾的字符串.
然后,一边计算字数,一边逐个拼合这个数组的元素并赋值给一个临时变量.
当达到一定字数的时候,将临时变量赋值给一个最终数组.并将临时变量和计数器清零.
代码如下:
//////////////////////////////////////////////////////////////////////////////////////////
var strDb = String(rs("content"));
var arrSort = strDb.split(/[\r\n.?!:;]/g); //以结束标点划分字符串,建立数组

var array = new Array(); //最终数组,每一维为一个页面
var i=0; //数组arrSort下标
var j=0; //最终数组下标

var strCount=0; //页面累加字符数
var strDb=""; //临时字符串,累加从数组中提取出的字符

while(i<=(arrSort.length-1)){
strCount += arrSort[i].length;
strDb+=arrSort[i].toString();
i++;
if((strCount>800)||(i==(arrSort.length-1))){
array[j]=strDb;
Response.Write("<span style='color:green;'>array["+j+"]</span><br>");
Response.Write(array[j]);
j++
strCount=0;
strDb="";
}
}
//////////////////////////////////////////////////////////////////////////////////////////

但是这样做,有几个问题.

在用split()方法分解字符串的时候,\n\r这些转义字符还好说,但以.?!:;这些标点为定界符分割字符串时,分割时这些标点被丢弃掉了.最后生成好的数组元素里,尾部都没有标点.在后面将这些数组元素拼合成一个新的字符串的时候,发现该字符串没有了.?!:;这些标点.
...全文
157 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ywiori27 2004-09-14
  • 打赏
  • 举报
回复

刚吃完饭,准备动手写.
居然发现BubbleInDiamond(以下想法纯属虚构)的这个主意!
呵呵,方便方便!省事多了!
谢谢你们的支持!

待会写好了放上来,大家再看看!
BubbleInDiamond 2004-09-14
  • 打赏
  • 举报
回复
有没有搞错啊,你不会一个一个split啊,你的分割字符串选的也太不好用了吧

或者按楼上某些人说的用个特殊字符,比如⊙

replace(stringname, ';', ";⊙") replace(stringname, ':', ":⊙")一个个替换完之后再split with "⊙"
ywiori27 2004-09-14
  • 打赏
  • 举报
回复

robinzsy(),不错不错!
偶试试看!呵呵,你的想法太棒了!
robinzsy 2004-09-14
  • 打赏
  • 举报
回复
那就不要用split()来分割字符串了,用substring不就行了吗?
用indexOf找到标点的位置,然后用substring把前一段的字符串保存到数组里。
然后把原字符串等于后半段字符串。然后循环就行了。
meihuake 2004-09-14
  • 打赏
  • 举报
回复
佩服
张佩 2004-09-14
  • 打赏
  • 举报
回复
要么用一个特殊字符做结束,你正常的用不到它。要么像楼上的,再加上去。
还有一个方法,就是你在需要断开的地方,如果以‘..'做断点,那么’.'就不会被做为断点而丢失了。
ywiori27 2004-09-14
  • 打赏
  • 举报
回复

robinzsy() ,我用的是正则表达式匹配的诶!
天知道当时匹配的是什么符号?
robinzsy 2004-09-14
  • 打赏
  • 举报
回复
那你用split()分割以后,在把标点加上不就行了。
如:
var t=s.split(".");
for(i=0;i<t.length-1;i++)
{
t[i]+=".";
}
ptma 2004-09-14
  • 打赏
  • 举报
回复
split()本来就是这样的
ouyld 2004-09-14
  • 打赏
  • 举报
回复
imly96 2004-09-14
  • 打赏
  • 举报
回复
如果不想消耗服务器的资源,那就消耗客户端的资源吧,
把字符串全部取出来,在客户端替换、分割后放入数组,点下一页也不用提交到服务器,
只是用下一段内容替换本段内容。效果差不多,但如果文章很长的话,打开页面就很慢了。

谁有更好的方法,我也想看看,呵呵。
jeuif 2004-09-14
  • 打赏
  • 举报
回复
没有看懂。。。。。。
ywiori27 2004-09-14
  • 打赏
  • 举报
回复

//////////////////////////////////////////////////////////////////////
<%
var strDb = String(rs("content"));
strDb = strDb.replace(/。/g,"。¤");
strDb = strDb.replace(/:/g,":¤");
strDb = strDb.replace(/!/g,"!¤");
strDb = strDb.replace(/?/g,"?¤");
var arrSort = strDb.split(/¤/g); //以结束标点划分字符串,建立数组

var array = new Array(); //最终数组,每一维为一个页面
var i=0; //数组arrSort下标
var j=0; //最终数组下标

var strCount=0; //页面累加字符数
var strDb=""; //临时字符串,累加从数组中提取出的字符

while(i<=(arrSort.length-1)){
strCount += arrSort[i].length;
strDb+=arrSort[i].toString();
i++;
if((strCount>800)||(i==(arrSort.length))){
array[j]=strDb;
j++;
strCount=0;
strDb="";
}
}

var arrayL = array.length-1; //数组array[]的实际下标数
var tPage = String(Request("page"));
Response.Write(tPage);
var curPage; //当前页面
if(tPage == "undefined")
curPage = 0;
else
curPage = parseInt(tPage);

Response.Write(array[curPage]);
Response.Write("<br>");
if(arrayL>1){
if(curPage>0)
Response.Write('<a href="self.asp?page='+(curPage-1)+'">上一页</a>');
if(curPage<arrayL)
Response.Write('<a href="self.asp?page='+(curPage+1)+'">下一页</a>');
%>
<form name="form" action="self.asp" method="post">
<select name="page">
<%
for(var k=0;k<=arrayL;k++){
Response.Write("<option value="+k+">"+k+"</option>");
}
%>
</select>
<a href=# onClick="javascript:self.form.submit()">GO</a>
</form>
<%
}
%>
//////////////////////////////////////////////////////////////////////
运行OK!
该算法比较消耗服务器资源,都要重新进行一次字符串转换和数组重组.
唉!现在赶时间,等以后空下来再改吧!
开工了开工了!
^_^

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧