前兩天研究了一下textarea的直觀行的換行規(guī)律,挺復(fù)雜啊:
直觀行怎樣取不光要看cols大小,還要看網(wǎng)頁(yè)編碼方式。 cols="30"的textarea,實(shí)際上每行可以容納29個(gè)半角字符,多少個(gè)全角字符就不一定了,與網(wǎng)頁(yè)編碼方式有關(guān)。 在IE6.0實(shí)測(cè)的情況,直觀行的換行發(fā)生在紅字處(紅字折到下一行)。
dddddddddddd米ddddddddddddddddddddd //全角后面的連續(xù)半角內(nèi)容被當(dāng)成一個(gè)完整單詞處理,如果剩下的位置容不下單詞的長(zhǎng)度了,就要換行,此為特殊規(guī)律A
網(wǎng)頁(yè)按Unicode編碼(“運(yùn)行代碼”的彈出頁(yè)面即按此編碼,JS生成的頁(yè)面均按此編碼)時(shí)的一般規(guī)律是
(“占滿”是說(shuō)后面無(wú)論再跟全角、半角字符,都得換行)
123456789012345678901234567890 //29半角占滿 一二三四五六七八九十一二三四五六七八九十 //17全角占滿 一二三四五六七八九十一二三四五六七0八九十 一二三四五六七八九十一二三四五六0七八九十 0一二三四五六七八九十一二三四五六1七八九十 //16全角,1半角占滿 0一二三四五六七八九十一二三四五六七八九十 0一二三四五六七八九十一二三四五1六七八九十 //15全角,2半角后不可容全角 01一二三四五六七八九十一二三四五六七八九十 01一二三四五六七八九十一二三四五2六七八九十 //15全角,2半角后可再容1半角(多于1半角時(shí)按特殊規(guī)律A) 012一二三四五六七八九十一二三四五六七八九十 //15全角,3半角占滿 012一二三四五六七八九十一二三四五3六七八九十 0123一二三四五六七八九十一二三四五六七八九十 //14全角,4半角后不可容全角 0123一二三四五六七八九十一二三四4五六七八九十 //14全角,4半角后可再容1半角(多于1半角時(shí)按特殊規(guī)律A) 01234一二三四五六七八九十一二三四五六七八九十 //14全角,5半角占滿 01234一二三四五六七八九十一二三四5五六七八九十 012345一二三四五六七八九十一二三四五六七八九十 //13全角,6半角后不可容全角 012345一二三四五六七八九十一二三6四五六七八九十 //13全角,6半角后可容1半角(多于1半角時(shí)按特殊規(guī)律A) 0123456一二三四五六七八九十一二三四五六七八九十 //13全角,7半角占滿 0123456一二三四五六七八九十一二三7四五六七八九十 01234567一二三四五六七八九十一二三四五六七八九十 //12全角,8半角占滿 01234567一二三四五六七八九十一二8三四五六七八九十 012345678一二三四五六七八九十一二三四五六七八九十 //11全角,9半角后不可容全角 012345678一二三四五六七八九十一9二三四五六七八九十 //11全角,9半角后可再容1半角(多于1半角時(shí)按特殊規(guī)律A) 0123456789一二三四五六七八九十一二三四五六七八九十 //11全角,10半角占滿
……
0一二三四五六七八九十一二三四五12六七八九十 //15全角,1半角后可再容2半角連續(xù)字符(多于2半角時(shí)按特殊規(guī)律A),此條可由15全角,3半角占滿得出
……
0一二三四五六七八九十一二三四1234五六七八九十 //14全角,1半角后可再容4半角連續(xù)字符(多于4半角時(shí)按特殊規(guī)律A),此條可由14全角,5半角占滿得出
……
01一二三四五六七八九十一二三四234五六七八九十 //14全角,2半角后可再容3半角連續(xù)字符(多于3半角時(shí)按特殊規(guī)律A),此條可由14全角,5半角占滿得出
…… 換行位置不僅與換行位置之前的整行文字有關(guān),還與紅字有關(guān)(往往全角文字是因?yàn)闊o(wú)法在上行末尾擠下才被折到下一行的)。
總結(jié)一下就有:
x全角,y半角占滿 = x全角,y-1半角后不可容全角 = x全角,y-n半角后可再容n半角連續(xù)字符(多于n半角時(shí)按特殊規(guī)律A)。
所以做實(shí)驗(yàn)搞清楚所有“占滿”的情形就可以了。
現(xiàn)將cols=30,網(wǎng)頁(yè)按Unicode編碼時(shí)的“占滿”情況列出:
17全角 16全角,1半角 15全角,3半角 14全角,5半角 13全角,7半角 12全角,8半角 11全角,10半角 10全角,12半角 9全角,13半角 8全角,15半角 7全角,17半角 6全角,19半角 5全角,21半角 4全角,22半角 3全角,24半角 2全角,26半角 1全角,28半角 29半角
利用瀕于發(fā)生按特殊規(guī)律A換行的情形,很容易測(cè)出所有“占滿”的情形:
例如,一二三四五六七八九十012345678912一二三四五六七八九十 //10全角,12半角占滿。 一二三四五六七八九十0123456789123一二三四五六七八九十 //紅字處按特殊規(guī)律A換行,藍(lán)字處按9全角,13半角占滿換行
cols=30,網(wǎng)頁(yè)按GB2312編碼時(shí),“占滿”規(guī)律不同了:
14全角,1半角 13全角,3半角 12全角,5半角 11全角,7半角 10全角,9半角 9全角,11半角 8全角,13半角 7全角,15半角 6全角,17半角 5全角,19半角 4全角,21半角 3全角,23半角 2全角,25半角 1全角,27半角 29半角
這樣的話,要根據(jù)網(wǎng)頁(yè)的編碼方式和cols,通過(guò)實(shí)驗(yàn)具體才能測(cè)出“占滿”規(guī)律。
從textarea內(nèi)容的開頭起計(jì)算全角和半角字符的數(shù)目,根據(jù)“占滿”規(guī)律及特殊規(guī)律A決定第一個(gè)直觀換行的位置,再?gòu)牡诙校òㄎ锢硇泻椭庇^行)起計(jì)算全角和半角字符的數(shù)目,根據(jù)“占滿”規(guī)律及特殊規(guī)律A決定第二個(gè)直觀換行的位置……如是繼續(xù)下去,直到textarea內(nèi)容的末尾。這樣就可以得到所有的換行位置了。
當(dāng)然實(shí)際應(yīng)用時(shí)沒(méi)必要也沒(méi)可能這樣做實(shí)驗(yàn)啦,比如說(shuō)選中textarea的第X行到第Y行,還沒(méi)了解官方的辦法是怎樣的,我是這么辦的:
運(yùn)行代碼框
[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運(yùn)行]
經(jīng)典論壇討論帖: http://www.95time.cn/bbs/NewsDetail.asp?id=2559480
出處:藍(lán)色理想
責(zé)任編輯:moby
◎進(jìn)入論壇網(wǎng)頁(yè)制作、網(wǎng)站綜合版塊參加討論
|