【所见即所得】textarea 精确限制字数、行数,中、英、全半角混检 。源码带注释
主要解决难点:
1 中文 全角2字符深深的恶意
2 多行输入textarea 手动,自动换行问题
3 获得每行内容
原创,转载请注明出处!
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>textarea</title>
</head> <body style="margin:0px; background:#000">
<textarea id="ipt" placeholder="输入试试" rows="" style="word-break:break-all;overflow:hidden; position:absolute;top:200px; left: 220px; font-family:Arial, Helvetica, sans-serif; width:400px; height:120px; line-height:40px; color:#FFF; font-size:20px; text-align:center;background-color:transparent;" ></textarea>
<input id="sub" type="button" value="获得结果" style=" position:absolute; width:200px; height:100px; left:220px; top:500px"/>
</body>
<script> //-------------textarea 多行输入,限制字数与行数
//中 英 全半角 混检
//luoee2008@126.com 2016.10.06 //-------------重要说明--很重要
//textarea 的css需设置word-break:break-all 主要因为英文单词的原因。
//textarea 的宽度必须大于 每行的最大字符数占用的宽度 ,建议输入同等字符的0占位测试 //-------------参数说明
//bind;// 需要绑定的 textarea id
//maxCol;//每行最大字符数,汉字、中文标点算2字符
//maxRow;//最多行数 //-------------使用方式
var info=new AUTO_WRAP("ipt",,)
//获得输入结果 数组形式,返回每行类容
document.getElementById("sub").addEventListener("click",function(e)
{
alert(info.message)
}) //----------------------------------核心代码----------------------------------
function AUTO_WRAP(bind,maxCol,maxRow)
{
var _s=this;this.message
var inter=setInterval(format,16.6667);//有兴趣的可以使用requestAnimationFrame var onInput=false;//是否正在输入中文
document.getElementById(bind).addEventListener("compositionstart",function(e){ onInput=true; })
document.getElementById(bind).addEventListener("compositionend",function(e){onInput=false; }) function format()
{
if(onInput){console.log("正在输入中文,暂停检测!");return;}
var dInfo="",formatInfo,len,_se dInfo = document.getElementById(bind).value;
dInfo = dInfo.split("\n"); len=dInfo.length;
if(len>maxRow)
{
console.log("行数超限,自动删除超行部分");
dInfo.splice(maxRow);
len=maxRow;
} formatInfo=""
for(var i=;i<len;i++)
{
//判断每行是否 > maxCol
var arr=getBreak(dInfo[i])
if(arr.length>)
{
var _temp=dInfo[i],add=""; for(var j=;j<arr.length;j++)
{
var sNum=j==?:arr[j-]
var eNum=j==?arr[j]:arr[j]-arr[j-]
add+=_temp.substr(sNum,eNum)+"\n";
}
add+=_temp.substr(arr[j-]);
dInfo[i]=add;
}
//组装
formatInfo+=dInfo[i]+(i<len-?"\n":"")
}
document.getElementById(bind).value=formatInfo;
_s.message=formatInfo.split("\n");//这里有个逻辑问题,理论不会产生。暂未处理
} function getBreak(v)
{
if(v==""){return [];} var arr=[]; var len=; //中英字符长度计数
var count=; //实际字符个数计数
var temp=-; //判断换行。(例如 每行限制20字符,上一次检测为19字符,下一次+2字符 则跳过了)
var lastCount=;// 和上一个参数配合使用 如果是跳过,则使用此参数 //计算
for(i=;i<v.length;i++)
{
var c = v.charCodeAt(i);
if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) { len++;} else {len += ;}
count++;
//不是首行第0个 空字符
var cut=Math.floor(len/maxCol)
if(temp!=-&&cut!=temp)
{
//跳过
if(len%maxCol!=)
{
arr.push(lastCount)
}
else //正好
{
arr.push(count)
}
}
temp=cut;
lastCount=count;
}
//矫正, 如果刚好是临界值 则抹去最后一次换行
if(len%maxCol==&&arr.length>)
{
arr.splice(arr.length-,)
} return arr
}
return this;
} </script>
</html>
测试 通过:
pc:
chrome,firefox,safira,
ios
微信(safira),
android
微信(x5)
其他未测 ,如使用中发现问题请回帖反馈
PS:如果实时监测会导致输入问题,可以去掉实时监测,仅监听textarea失去输入焦点时,执行一次代码即可 。
中文标点 。 ? ! , 、 ; : “ ” ‘ ' ( ) 《 》 〈 〉 【 】 『 』 「 」 ﹃ ﹄ 〔 〕 … — ~ ﹏ ¥
【所见即所得】textarea 精确限制字数、行数,中、英、全半角混检 。源码带注释的更多相关文章
- 使用C#重写网上的60行 Javascript 俄罗斯方块源码 (带注释)
在很久很久以前,就已经看过 60行Js的俄罗斯方块源码.无奈当时能力不够看明白,当时觉得就是个神作. 现在总算有空再看了,顺便用c#实现一遍(超过60行),顺道熟悉下Js API. 网上其他博客也有分 ...
- Tyrion中文文档(含示例源码)
Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Tyrion主要有两大重要动能: 表单 ...
- Tyrion 中文文档(含示例源码)
原文出处: Mr.Seven Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Ty ...
- Spring中AOP相关的API及源码解析
Spring中AOP相关的API及源码解析 本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring ...
- sqlserver和oracle中对全半角的转换
oracle中对全半角的转换 to_single_byte(c)转换成半角 to_multi_byte(c)转换成全角 SELECT To_single_byte('881898?71') FROM ...
- (转)Eclipse中需要查看某个类的源码,直接按住Ctrl 然后点击想要查看的类或则方法
文章转自:http://blog.sina.com.cn/s/blog_52f623240102vpcr.html 在Eclipse中需要查看某个类的源码,直接按住Ctrl 然后点击想要查看的 ...
- java中的==、equals()、hashCode()源码分析(转载)
在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. == java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: ...
- maven项目在eclipse中debug时看不到源码?
就像图中一样,看不到源码,但是能step over,也可查看变量值,点击edit source lookup path,选定项目的一瞬间源码会出来,但马上又变回原样了,求大神指教~ 我也遇到这个问题了 ...
- Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析
Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...
随机推荐
- Oracle中较长number型数值的科学计数显示问题
表中有id列,类型为number(38).在sqlplus中查询的时候,查询结果的显示方式为科学计数法: ID ---------- 4.5572E+18 4.5574E+18 4.5585E+18 ...
- python fabric install
1,install setuptools 2,install pip 3,install pycrpto 4,install paramiko 5,install fabric
- Leetcode: Design Phone Directory
Design a Phone Directory which supports the following operations: get: Provide a number which is not ...
- java 反射机制
1.反射机制是什么: (1)反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能 ...
- 1-MySQL命令行
0.显示数据库 show databases; 1.选择数据库 use 数据库名; 2.显示数据库中的表 show tables; 3.显示数据表的结构 describe 表名; 4.显示表中记录 S ...
- Uploadify/uploadifive上传(中文文档)
Uploadify是一款基于JQuery的优秀的文件/图片上传的插件,有基于Flash和HTML5两种版本. Uploadify/uploadifive主要特点有: 1. 多文件上传 2. 个性化设 ...
- jq 弹半透明遮罩层
jquery制作点击按钮弹出遮罩半透明登陆窗口 // )[^>]*$|^#([\w-]+)$/,M=/^.[^:#\[\.,]*$/,ka=/\S/,$= /^(\s|\u00A0)+|(\s| ...
- nodejs与模块soap的用法
最近做了点东西要求用到soap模块,我是怎么知道的呢,收到了 <soap:Body><soap:Fault><faultcode>soap:Client</f ...
- The constructor BASE64Encoder() is not accessible due to restriction on required library
在Eclipse中编写Java代码时,用到了BASE64Decoder,import sun.misc.BASE64Decoder;可是Eclipse提示:Access restriction : T ...
- link和@import的区别、及各自的应用
面试的过程中遇到的问题,当时自己回答的感觉自己心里还是很满意的,但是回来百度查看后才知道自己回答的有多么的糟糕: 下面我这这个知识点做一些总结的书面说明,为了少走点弯路,多涨点见识吧. 首先我们要了解 ...