这个问题是由于以下2行引起的field.value = field.value.substring(0, maxlimit);
onPropertyChange = "textCounter(txtLimit.words, 10);原因1: JS中对字符串长度的判断是按"字"来的,所以对于"ABC"和"中国人"来说长度都是3,LZ想把中文字符当做2个字符来操作,可又直接使用了substring(0, maxlimit)
原因2: onPropertyChange事件, 这个事件每当你个Property赋值的时候就会被触发
所以当有6个字符时,比如"我是个中国人",第一段长度判定为12(j=12), 可在JS里长度被判定为6(field.value.length=6), 当取值substring(0, maxlimit)的时候, LZ希望取到"我是个中国", 而实际上仍然会取到"我是个中国人", 然后又将"我是个中国人" 赋值给field.value, 这时又触发onPropertyChange事件, 导致无限循环

解决方案 »

  1.   

    解决方法, 本人稍微改了下那个JS方法, function textCounter(field, maxlimit)
    {
      var j = 0;
      var i = 0;
      var len = field.value.length ;
      for(i = 0 ; i < len; i ++)
      {
        if(field.value.charCodeAt(i)> 255)
        {
          j += 2;
        }
        else
        {
          j++;
        }    if (j > maxlimit)
        {
          break;
        }
      }  field.value = field.value.substring(0, i);
    }建议1: 不要用document.ElementName.SubElementName.Property这样的形式来定位对象, 这样一旦页面排版发生变化,JS可能就需要改动,推荐用ID来标识每个控件.
    建议2: 不要用onPropertyChange, 这个事件太敏感, 而且不能跨浏览器支持
      

  2.   

    >>to richardclydeman,谢谢你的回答.
    不过我试了.
    你的一样会报Stack overflow栈溢出...
      

  3.   


    function  textCounter(field,maxlimit)     
    {
    var  j  =  0;
    var  len  =  field.value.length  ;
    for(var  i  =  0  ;  i  <  len  ;  i  ++)
    {
    if(field.value.substr(i,1).charCodeAt(0)> 255) 
    {
    j  +=  2;
    }
    else
    {
    j++;
    }
    }
       
    if(j  >  maxlimit)
    {
    field.value  =  field.value.substring(0,  i);
    }你是要做文字截断吧?那个具体截断位置的时候你不应该用哪个maxlimit        
      

  4.   


    function textCounter(field,maxlimit){
    var counts = 0;
    var newStr;
    for(var i = 0;i < field.length;i ++){
    if(txt.substr(i,1).charCodeAt(i)>255){
    counts += 2;
    }else{
    counts += 1;
    }
    if(counts >= maxlimit){
    newStr = field.substring(0,i);
    break;
    }
    }
    return newStr;
    }这是我写的一个,调试过没问题