常看到有些讨论区会限制发言的最大字数,有可能是资料库的栏位本身就有限制或是怕有人贴上大量文字的内容来捣乱。在网路上传输文字、图片等等的资料都是要消耗Server端及网路流量的资源,试想一下,有篇文章是10万字,若资料是存在资料库上的话,光是查询后要回传给Client端,酱子要开启一篇网页不知道要等上多久的时间了,所以才会做出最大字数的限制。
要做字数的检验又可以分为前端及后端两种,前端就是用JavaScript、VBScript等在文章未被送出前来做检验;后端的话就是靠JSP、PHP、ASP等程式来做检验。不过用后端检验的话,因为文章是已被传送出去了,若检验失败的话,酱资料往返其实也是在浪费资源,但并不表后端检验不好。若可以的话,比较建议是在文章送出前就先检验一次,到后端的话,若还是不放心还可以再做一次的检验。
那要如何来算出字数呢?常见的做法是当按下送出时会计算字数长度,或者是每当输入一个字时,就显示目前输入了多少字。我采取两种方法一起来使用。
要做成每输入一个字就计算字数的话,比较常用的Event是onKeyDown、onKeyUp、onKeyPress等三种。检验部份的Code都一样,只是差在所触发的Event是不同的罢了,但也因为Event不同,所以会有点差异,这等等会说明。
好~一样先来看Body部份的Code吧:
Div是用来放置讯息用的,总是要有地方显示输入多少字吧。TextArea是一个输入框,目前我使用的Event是onKeyUp,当keyUp时会触发count()函式并把TextArea的值当做参数传进去。按钮被Click时也会触发一个check()函式来检验是否在限制的字数内。
再来看JavaScript的部份:
这个JavaScript蛮简单的,用变数maxChr来设定最多可输入多少字,变数nowChr来储存目前已输入多少字,而count()函式则是计算目前输入多少字并把讯息显示在Div中,check()函式则是当按下送出钮时,用来检验是否目前输入的字数是否小于等于maxChr,若大于maxChr则警告说多输入了几个字,最后的部份是用来初始化当刚载入页面时Div用的。
应该不难懂上面的Code吧,没用到什么比较特殊的东西,试着执行看看后会发现,每输入一个字的话,会马上计算目前已输入多少字,但是~假设按下a按键却不放开的话,TextArea内会一直被出现aaaaa.......可是Div的讯息却都没变,也就是没计算字数,不过当放开A按键的话,就会计算字数了。
为什么会酱呢?这是因为在TextArea中用的Event是onKeyUp,也就是只有当按键被放开时才会触发它。
OK~若是把Event改成onKeyDown或是onKeyPress呢?onKeyDown跟onKeyPress是当按键被按下时就会触发了,嘿嘿~这下就算按着不放也能计算字数了吧!没错~改成酱虽能解决按住不放的问题,但~不知道眼尖的你有没有发现所计算出来的字数少了一个字?
那要怎么办呢?把计算出来的字数再加1吗?还是在TextArea中用onKeyUp及onKeyDown或是onKeyPress呢?这两个方法其实都可以用来解决问题,但还有一个更好的Event可以用-onPropertyChange。什么是onPropertyChange呢?这Event是用当某物件的属性值被改变时会触发的。
现在把TextArea中的Event改成用onPropertyChange后再来试试刚刚以上两种情况吧,嘿~都是能正确的计算出字数吧。onPropertyChange才是今天这主题的重点。
最后的送出钮只是最很简单的判断,各位应该看的懂也知道怎么改吧!
还有个问题是...用酱的判断字数的话,不管是1个字元还是2个字元都会被当成一个字,像a(半形)就是1个字元,而a(全形)却是2个字元,若资料库中栏位是设成30个字元的话,用来存放1个字元的字可以放30个,但是2个字元只能存放15个,那混合的话要怎么计算呢?
首先要知道在ASCII中,0~255都是1个字元的字,255以后的都是2个字元,现在只要在count()函式中判断输入的字是共字元,而maxChr及nowChr则变成是最大几字元及目前已输入几字元。
酱子改过后,就能算出所输入的字共几个字元了。有两种方法来计算字数,要使用那种就看各位的需求了。
范例浏览:
http://abgne.myweb.hinet....009_1.htmlhttp://abgne.myweb.hinet....009_2.htmlhttp://abgne.myweb.hinet....009_3.html以上内容于2005/10/01发表在小弟的Blog里
http://blog.xuite.net/abgne/diary1/4070061