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

开发编程  |  电脑网络

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

2014-11-12最佳答案

截断中文字符也可以这样

  
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;
};

其它2条答案

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

  
$("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;
});

2014-11-12

在开启输入法的情况下,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事件,来捕获每次输入值的变化

2014-11-12