<script> 
function getStringUTFLength(str) { 
    var value = str.replace(/[^\x00-\xff]/g,"  "); 
    return value.length; 
} 
function leftUTFString(str,len) { 
    if(getStringUTFLength(str)<=len) 
        return str; 
    var value = str.substring(0,len); 
    while(getStringUTFLength(value)>len) { 
        value = value.substring(0,value.length-1); 
    } 
    return value; 
} 
function count() { 
    var value = document.getElementById("licenseother").value; 
    value = value.replace(/[\u4e00-\u9fa5]/g,"  "); 
    //alert(value.length); 
    if(value.length>=255) { 
        with(window.event) { 
            cancelBubble = true; 
            keyCode=0; 
            returnValue = false; 
        } 
        document.getElementById("licenseother").value = leftUTFString(document.getElementById("licenseother").value,8); 
    } 
    document.getElementById("result").value = 255-getStringUTFLength(document.getElementById("licenseother").value); 
} 
</script> 
<table width="100%"> 
<tr><td> 
本输入框限制输入255个字符(汉字计算为2个字符:) 
</td></tr> 
<tr><td> 
<textarea cols=80 rows=3 wrap="virtual" id="licenseother" onkeypress="count()" onkeyup="count()" onblur="count();" onChange="count();"></textarea> 
</td></tr> 
<tr><td> 
剩余字符数:<input type="text" size="3" id="result" value="255"> 
</td></tr> 
</table> 
} 
示例如下: 
//
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns:mudoo>
<html xmlns:mudoo>
 <head>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>statInput 输入限制统计</title>
<title>statInput 输入限制统计</title>

 <style type="text/css">
<style type="text/css">
 <!--
<!--

 * {
* { }{padding: 0; margin: 0}
}{padding: 0; margin: 0}

 body {
body { }{margin: 3em; font: 12px Tahoma; background: #EAEAEA; color: #333333; line-height: 20px}
}{margin: 3em; font: 12px Tahoma; background: #EAEAEA; color: #333333; line-height: 20px}

 input, textarea {
input, textarea { }{font: 12px Tahoma; color: #666666; padding: 2px; border: solid 1px #DBDBDB}
}{font: 12px Tahoma; color: #666666; padding: 2px; border: solid 1px #DBDBDB}

 textarea {
textarea { }{padding: 5px; line-height: 20px}
}{padding: 5px; line-height: 20px}

 p {
p { }{margin: 1em 0}
}{margin: 1em 0}

 ul {
ul { }{}
}{}

 li {
li { }{height: 1%; overflow: hidden; list-style-type: none}
}{height: 1%; overflow: hidden; list-style-type: none}

 a {
a { }{color: #666666; text-decoration: none}
}{color: #666666; text-decoration: none}

 a:hover {
a:hover { }{color: #333333}
}{color: #333333}

 .r {
.r { }{float: right}
}{float: right}

 .l {
.l { }{float: left}
}{float: left}

 .b {
.b { }{font-weight: bold}
}{font-weight: bold}

 .gray {
.gray { }{color: #666666; margin-top: 8px}
}{color: #666666; margin-top: 8px}

 .light {
.light { }{color:#FF6600; margin: 0 5px}
}{color:#FF6600; margin: 0 5px}

 .case {
.case { }{display: block; padding: 0 2em 2em 2em; border: solid 1px #EAEAEA; background: #FFFFFF; margin-bottom: 2em; height: 1%; overflow: hidden}
}{display: block; padding: 0 2em 2em 2em; border: solid 1px #EAEAEA; background: #FFFFFF; margin-bottom: 2em; height: 1%; overflow: hidden}

 .title {
.title { }{display:block; padding: .5em 2em .5em 1em; margin: 0 -2em 2em -2em; font-weight: bold; color: #000000; background: #FAFAFA; border-bottom: solid 1px #EAEAEA}
}{display:block; padding: .5em 2em .5em 1em; margin: 0 -2em 2em -2em; font-weight: bold; color: #000000; background: #FAFAFA; border-bottom: solid 1px #EAEAEA}

 .call {
.call { }{display:block;}
}{display:block;}

 .key {
.key { }{display: block; width: 6em; float: left}
}{display: block; width: 6em; float: left}

 .type {
.type { }{display: block; width: 6em; float: left}
}{display: block; width: 6em; float: left}

 .info {
.info { }{padding-left: 2em}
}{padding-left: 2em}

 .demo {
.demo { }{margin-bottom: 2em}
}{margin-bottom: 2em}
 -->
-->
 </style>
</style>

 <script language="javascript" type="text/javascript">
<script language="javascript" type="text/javascript">
 <!--
<!--
 // 这里都是公用函数,挺多的
// 这里都是公用函数,挺多的
 var
var
 // 获取元素
// 获取元素

 $ = function(element)
$ = function(element)  {
{
 return (typeof(element) == 'object' ? element : document.getElementById(element));
 return (typeof(element) == 'object' ? element : document.getElementById(element));
 },
},
 // 判断浏览器
// 判断浏览器

 brower = function()
brower = function()  {
{
 var ua = navigator.userAgent.toLowerCase();
 var ua = navigator.userAgent.toLowerCase();
 var os = new Object();
 var os = new Object();
 os.isFirefox = ua.indexOf ('gecko') != -1;
 os.isFirefox = ua.indexOf ('gecko') != -1;
 os.isOpera = ua.indexOf ('opera') != -1;
 os.isOpera = ua.indexOf ('opera') != -1;
 os.isIE = !os.isOpera  &&  ua.indexOf ('msie') != -1;
 os.isIE = !os.isOpera  &&  ua.indexOf ('msie') != -1;
 os.isIE7 = os.isIE  &&  ua.indexOf ('7.0') != -1;
 os.isIE7 = os.isIE  &&  ua.indexOf ('7.0') != -1;
 return os;
 return os;
 },
},
 // 事件操作(可保留原有事件)
// 事件操作(可保留原有事件)
 eventListeners = [],
eventListeners = [],

 findEventListener = function(node, event, handler)
findEventListener = function(node, event, handler) {
{
 var i;
 var i;

 for (i in eventListeners)
 for (i in eventListeners) {
{

 if (eventListeners[i].node == node  &&  eventListeners[i].event == event  &&  eventListeners[i].handler == handler)
  if (eventListeners[i].node == node  &&  eventListeners[i].event == event  &&  eventListeners[i].handler == handler) {
{
 return i;
   return i;
 }
  }
 }
 }
 return null;
 return null;
 },
},

 myAddEventListener = function(node, event, handler)
myAddEventListener = function(node, event, handler) {
{

 if (findEventListener(node, event, handler) != null)
 if (findEventListener(node, event, handler) != null) {
{
 return;
  return;
 }
 }

 if (!node.addEventListener)
 if (!node.addEventListener) {
{
 node.attachEvent('on' + event, handler);
  node.attachEvent('on' + event, handler);

 }else
 }else {
{
 node.addEventListener(event, handler, false);
  node.addEventListener(event, handler, false);
 }
 }

 eventListeners.push(
 eventListeners.push( {node: node, event: event, handler: handler});
{node: node, event: event, handler: handler});
 },
},

 removeEventListenerIndex = function(index)
removeEventListenerIndex = function(index) {
{
 var eventListener = eventListeners[index];
 var eventListener = eventListeners[index];
 delete eventListeners[index];
 delete eventListeners[index];

 if (!eventListener.node.removeEventListener)
 if (!eventListener.node.removeEventListener) {
{
 eventListener.node.detachEvent('on' + eventListener.event,
  eventListener.node.detachEvent('on' + eventListener.event,
 eventListener.handler);
  eventListener.handler);

 }else
 }else {
{
 eventListener.node.removeEventListener(eventListener.event,
  eventListener.node.removeEventListener(eventListener.event,
 eventListener.handler, false);
  eventListener.handler, false);
 }
 }
 },
},

 myRemoveEventListener = function(node, event, handler)
myRemoveEventListener = function(node, event, handler) {
{
 var index = findEventListener(node, event, handler);
 var index = findEventListener(node, event, handler);
 if (index == null) return;
 if (index == null) return;
 removeEventListenerIndex(index);
 removeEventListenerIndex(index);
 },
},

 cleanupEventListeners = function()
cleanupEventListeners = function() {
{
 var i;
 var i;

 for (i = eventListeners.length; i > 0; i--)
 for (i = eventListeners.length; i > 0; i--) {
{

 if (eventListeners[i] != undefined)
  if (eventListeners[i] != undefined) {
{
 removeEventListenerIndex(i);
   removeEventListenerIndex(i);
 }
  }
 }
 }
 };
};
 -->
-->
 </script>
</script>

 <script language="javascript" type="text/javascript">
<script language="javascript" type="text/javascript">
 <!--
<!--

 /**//*======================================================
/**//*======================================================
 - statInput 输入限制统计
 - statInput 输入限制统计
 - By Mudoo 2008.5
 - By Mudoo 2008.5
 - 长度超出_max的话就截取
 - 长度超出_max的话就截取 貌似没有更好的办法了
貌似没有更好的办法了
 ======================================================*/
======================================================*/

 function statInput(e, _max, _exp)
function statInput(e, _max, _exp)  {
{
 e   = $(e);
 e   = $(e);
 _max  = parseInt(_max);
 _max  = parseInt(_max);
 _max  = isNaN(_max) ? 0 : _max;
 _max  = isNaN(_max) ? 0 : _max;

 _exp  = _exp==undefined ?
 _exp  = _exp==undefined ?  {} : _exp;
{} : _exp;
 
 

 if(e==null || _max==0)
 if(e==null || _max==0)  {
{
 alert('statInput初始化失败!');
  alert('statInput初始化失败!');
 return;
  return;
 }
 }
 
 
 var
 var
 // 浏览器
 // 浏览器
 _brower  = brower();
 _brower  = brower();
 // 输出对象
 // 输出对象
 _objMax  = _exp._max==undefined ? null : $(_exp._max),
 _objMax  = _exp._max==undefined ? null : $(_exp._max),
 _objTotal = _exp._total==undefined ? null : $(_exp._total),
 _objTotal = _exp._total==undefined ? null : $(_exp._total),
 _objLeft = _exp._left==undefined ? null : $(_exp._left),
 _objLeft = _exp._left==undefined ? null : $(_exp._left),
 // 弹出提示
 // 弹出提示
 _hint  = _exp._hint==undefined ? null : _exp._hint;
 _hint  = _exp._hint==undefined ? null : _exp._hint;
 
 
 // 初始统计
 // 初始统计
 if(_objMax!=null) _objMax.innerHTML = _max;
 if(_objMax!=null) _objMax.innerHTML = _max;
 if(_objTotal!=null) _objTotal.innerHTML = 0;
 if(_objTotal!=null) _objTotal.innerHTML = 0;
 if(_objLeft!=null) _objLeft.innerHTML = 0;
 if(_objLeft!=null) _objLeft.innerHTML = 0;
 
 
 // 设置监听事件
 // 设置监听事件
 // 输入这个方法比较好.
 // 输入这个方法比较好.
 // 但是Opera下中文输入跟粘贴不能正确统计
 // 但是Opera下中文输入跟粘贴不能正确统计 相当BT的东西
相当BT的东西
 // 如果不考虑Opera的话就用这个吧.否则就老老实实用计时器.
 // 如果不考虑Opera的话就用这个吧.否则就老老实实用计时器.

 if(_brower.isIE)
 if(_brower.isIE)  {
{
 myAddEventListener(e, "propertychange", stat);
  myAddEventListener(e, "propertychange", stat);

 }else
 }else {
{
 myAddEventListener(e, "input", stat);
  myAddEventListener(e, "input", stat);
 }
 }

 /**//*
 /**//*
 // 用计时器的话就什么浏览器都支持了.
 // 用计时器的话就什么浏览器都支持了.
 var _intDo = null;
 var _intDo = null;
 myAddEventListener(e, "focus", setListen);
 myAddEventListener(e, "focus", setListen);
 myAddEventListener(e, "blur", remListen);
 myAddEventListener(e, "blur", remListen);
 function setListen() {
 function setListen() {
 _intDo = setInterval(stat, 10);
  _intDo = setInterval(stat, 10);
 }
 }
 function remListen() {
 function remListen() {
 clearInterval(_intDo);
  clearInterval(_intDo);
 }
 }
 */
 */
 
 
 // 统计函数
 // 统计函数
 var _len, _olen, _lastRN, _sTop;
 var _len, _olen, _lastRN, _sTop;
 _olen = _len = 0;
 _olen = _len = 0;

 function stat()
 function stat()  {
{
 _len = e.value.length;
  _len = e.value.length;
 if(_len==_olen) return;  // 防止用计时器监听时做无谓的牺牲
  if(_len==_olen) return;  // 防止用计时器监听时做无谓的牺牲

 if(_len>_max)
  if(_len>_max)  {
{
 _sTop = e.scrollTop;
   _sTop = e.scrollTop;
 // 避免IE最后俩字符为'\r\n'.导致崩溃
   // 避免IE最后俩字符为'\r\n'.导致崩溃
 _lastRN = (e.value.substr(_max-1, 2) == "\r\n");
   _lastRN = (e.value.substr(_max-1, 2) == "\r\n");
 e.value = e.value.substr(0, (_lastRN ? _max-1 : _max));
   e.value = e.value.substr(0, (_lastRN ? _max-1 : _max));
 if(_hint==true) alert("悟空你也太调皮了,为师跟你说过,叫你不要输那么多字~~.");
   if(_hint==true) alert("悟空你也太调皮了,为师跟你说过,叫你不要输那么多字~~.");
 // 解决FF老是跑回顶部
   // 解决FF老是跑回顶部
 if(_brower.isFirefox) e.scrollTop = e.scrollHeight;
   if(_brower.isFirefox) e.scrollTop = e.scrollHeight;
 }
  }
 _olen = _len = e.value.length;
  _olen = _len = e.value.length;
 
  
 // 显示已输入字数
  // 显示已输入字数
 if(_objTotal!=null) _objTotal.innerHTML = _len;
  if(_objTotal!=null) _objTotal.innerHTML = _len;
 // 显示剩余可输入字数
  // 显示剩余可输入字数
 if(_objLeft!=null) _objLeft.innerHTML = (_max-_len)<0 ? 0 : (_max-_len);
  if(_objLeft!=null) _objLeft.innerHTML = (_max-_len)<0 ? 0 : (_max-_len);
 }
 }
 
 
 stat();
 stat();
 }
}
 -->
-->
 </script>
</script>

 <script language="javascript" type="text/javascript">
<script language="javascript" type="text/javascript">
 <!--
<!--

 /**//*********************************************
/**//*********************************************
 - statInput 演示函数
  - statInput 演示函数
 *********************************************/
*********************************************/
 myAddEventListener(window, "load", testStatInput);
myAddEventListener(window, "load", testStatInput);

 function testStatInput()
function testStatInput() {
{

 statInput('Test_1', 100,
 statInput('Test_1', 100,  {_max : 'stat_max', _total : 'stat_total', _left : 'stat_left', _hint : true});
{_max : 'stat_max', _total : 'stat_total', _left : 'stat_left', _hint : true});
 }
}
 -->
-->
 </script>
</script>
 </head>
</head>
 <body>
<body>
 <div class="case">
<div class="case">
 <div class="title"><a href="#" _fcksavedurl=""#"" _fcksavedurl=""#"" class="r">Top</a>statInput 调用方法</div>
 <div class="title"><a href="#" _fcksavedurl=""#"" _fcksavedurl=""#"" class="r">Top</a>statInput 调用方法</div>
 <div class="b">statInput(Element, MaxLen, {objMax, objTotal, objLeft, Hint});</div>
 <div class="b">statInput(Element, MaxLen, {objMax, objTotal, objLeft, Hint});</div>
 <ul class="info gray">
 <ul class="info gray">
 <li><span class="key">Element:</span><span class="type">Object</span>限制统计对象 (*必须)</li>
  <li><span class="key">Element:</span><span class="type">Object</span>限制统计对象 (*必须)</li>
 <li><span class="key">MaxLen:</span><span class="type">Number</span>最大可输入长度 (*必须)</li>
  <li><span class="key">MaxLen:</span><span class="type">Number</span>最大可输入长度 (*必须)</li>
 <li><span class="key">objMax:</span><span class="type">Object</span>显示最大输入长度对象 (*可选)</li>
  <li><span class="key">objMax:</span><span class="type">Object</span>显示最大输入长度对象 (*可选)</li>
 <li><span class="key">objTotal:</span><span class="type">Object</span>显示输入统计对象 (*可选)</li>
  <li><span class="key">objTotal:</span><span class="type">Object</span>显示输入统计对象 (*可选)</li>
 <li><span class="key">objLeft:</span><span class="type">Object</span>显示可输入长度对象 (*可选)</li>
  <li><span class="key">objLeft:</span><span class="type">Object</span>显示可输入长度对象 (*可选)</li>
 <li><span class="key">Hint:</span><span class="type">Boolean</span>当长度超出上限时,是否提示 (*可选)</li>
  <li><span class="key">Hint:</span><span class="type">Boolean</span>当长度超出上限时,是否提示 (*可选)</li>
 </ul>
 </ul>
 </div>
</div>
 <div class="case">
<div class="case">
 <div class="title"><a href="#" class="r">Top</a>statInput 演示</div>
 <div class="title"><a href="#" class="r">Top</a>statInput 演示</div>
 <textarea name="Test_1" id="Test_1" rows="10" style="width: 99%" >悟空你也太调皮了,我跟你说过,叫你不要乱扔东西, 乱扔东西这么做…… (咣当,悟空棍子掉在地上) 你看我还没有说完呢你把棍子又给扔掉了!月光宝盒是宝物,你把他扔掉会污染环境,唉,要是砸到小朋友那怎么办?就算没有砸到小朋友砸到那些花花草草也是不对的呀!</textarea>
 <textarea name="Test_1" id="Test_1" rows="10" style="width: 99%" >悟空你也太调皮了,我跟你说过,叫你不要乱扔东西, 乱扔东西这么做…… (咣当,悟空棍子掉在地上) 你看我还没有说完呢你把棍子又给扔掉了!月光宝盒是宝物,你把他扔掉会污染环境,唉,要是砸到小朋友那怎么办?就算没有砸到小朋友砸到那些花花草草也是不对的呀!</textarea>
 <div class="gray">最多可输入<span id="stat_max" class="b light"></span>,当前共<span id="stat_total" class="b light"></span>,还可输入<span id="stat_left" class="b light"></span></div>
 <div class="gray">最多可输入<span id="stat_max" class="b light"></span>,当前共<span id="stat_total" class="b light"></span>,还可输入<span id="stat_left" class="b light"></span></div>
 </div>
</div>
 </body>
</body>
 </html>
</html>