当前位置: 代码迷 >> Web前端 >> 文本输入框限制输入:12个字符或六个中文(中英文夹杂)
  详细解决方案

文本输入框限制输入:12个字符或六个中文(中英文夹杂)

热度:82   发布时间:2012-10-26 10:30:59.0
文本输入框限制输入:12个字符或6个中文(中英文夹杂)
这个功能在很多地方都需要用到,会令人头疼的地方就是中英文夹杂的时候无法处理,下面是我自己通过google查询和自己编写的结果:

首先设置maxChars 这个属性,它控制文本框输入的字符长度,在as3中,一个中文和一个字母的长度都是1,但实际上一个中文是2个字节,1个英文是一个字节!

设置restrict = "a-zA-Z\u4e00-\u9fa5",这样是代表只能够输入大小写的英文字母和中文

以上设置可以保证文本的长度和合法性,但是无法达到 12个字符或6个中文(中英文夹杂) 的条件,所一下面我们再加上一步操作:

//获取字符串的字节数

private function getStringBytesLength(str:String,charSet:String):int
   {
   
    var bytes:ByteArray = new ByteArray();
   
    bytes.writeMultiByte(str, charSet);
   
    bytes.position = 0;
   
    return bytes.length;
   
   }

给文本输入框加上一个事件:

inputTxt.addEventListener(TextEvent.TEXT_INPUT, __nameInputEvent);

private function __nameInputEvent(e:TextEvent):void
   {
   
      if((getStringBytesLength(__nameInput.text,"gb2312") +

            getStringBytesLength    (e.text,'gb2312')) > __nameInput.maxChars)
      {
         e.preventDefault();
       return; 
    }
   }

这样就完成了!上面是在flash ide 下可以实现的,但是在flex中,TextEvent.TEXT_INPUT 这个事件是不管用的,无法e.preventDefault();所以我继续查资料,然后通过下面的方法,在flex中实现了这个功能:

//这是组件

<s:TextInput x="100" y="65" id="txt_name" width="105" enabled="true" changing="__nameChangingEvent(event)"/>

//这是需要设置的两个属性

txt_name.restrict = "a-zA-Z\u4e00-\u9fa5";
txt_name.maxChars = 12;

//下面是用到的操作

/**
    * 姓名输入事件
    * 
    */ 
    protected function __nameChangingEvent(event:TextOperationEvent):void
    {
     if((event.operation as InsertTextOperation)==null)
     {
      return;
     }
    
     var input:String=(event.operation as InsertTextOperation).text;
    
     if((__getStringBytesLength(txt_name.text,"gb2312") + __getStringBytesLength(input,'gb2312')) > txt_name.maxChars)
     {
      event.preventDefault();
     }
    }
   
   
    /**
    * 获取该字符串的字节数 
    */ 
    private function __getStringBytesLength(str:String,charSet:String):int
    {
     var bytes:ByteArray = new ByteArray();
    
     bytes.writeMultiByte(str, charSet);
    
     bytes.position = 0;
     return bytes.length;
    
    }
  相关解决方案