如何限定input字符长度,截断中文字符的跨浏览器的通用实现

input限定输入字节数是8,中文自然算两个字节。本来一路顺利,keyup keydown keypress事件挨个试过去,把中文用正则替换成两个英文字符,超过8的就return false。ie下表现超级完美。<br />
这个时侯Firefox下麻烦事就开始了,ie下,中文输入法状态下他也是能捕获键盘事件的。但ff下却无法捕获输入法状态下的键盘事件,比如我搜狗,他只能识别到最后那次空格……

  • 收藏问题
  • 举报

你的IE浏览器版本过低,为了提升体验,

建议升级到IE10以上或使用Chrome、搜狗等浏览器!

3个答案
  • raine 2014-11-12 09:21

    截断中文字符也可以这样

      
    String.prototype.sub = function(n)
    {
    var r = /[^\x00-\xff]/g;
    if(this.replace(r, "mm").length <= n) return this;
    var m = Math.floor(n/2);
    for(var i=m; i<this.length; i++) {
    if(this.substr(0, i).replace(r, "mm").length>=n) {
    return this.substr(0, i) ; }
    }
    return this;
    };
  • lrwyx 2014-11-12 09:18

    在开启输入法的情况下,IE、FF浏览器的具体问题如下:
    IE:触发keydown和keyup, 不触发keypress. 能够获得输入值。
    Firefox:触发keydown和keypress, 不触发keyup. 输入值未能获得。在回车后会触发keyup, 可获得输入值。

    解决办法:
    一、这个方法是参考google的做法,http://www.google.cn/ac.js
    使用一个计时器,当输入框处于聚焦(focus)状态时,每10秒执行一次回调函数,在输入框失焦(blur)时,一定要清除这个计时器。

    二、去掉keydown、keyup、keypress事件,替换为ie下为onpropertychange事件;FF下为oninput事件,来捕获每次输入值的变化

  • 112125645 2014-11-12 09:08

    换条思路,直接截断字符来解决

      
    $("input").bind("keyup",function() { 
    var str=this.value;
    while (str.replace(/[^\x00-\xFF]/g,"aa").length>8) {
    str=str.substr(0,str.length-1);
    }
    this.value=str;
    });