Javascript 对于textbox/textarea,在键入时限制输入长度,但在粘贴时不限制输入长度

Javascript 对于textbox/textarea,在键入时限制输入长度,但在粘贴时不限制输入长度,javascript,jquery,html,Javascript,Jquery,Html,我有一个奇怪的要求: function TextLimit(elem, maxChars) { ... } 其中elem是一个textarea或type=text的输入,maxChars是可以进入elem的最大字符数。当用户键入时,函数中的代码必须将elem中的文本长度限制为maxChars。但是,如果用户是第一次粘贴,即使粘贴的文本的字符数大于maxChars,elem也必须获取粘贴的所有内容。 编辑:如果粘贴的文本比maxChars长,则在第一次粘贴后,用户不能再键入/粘贴,除非文本被删除

我有一个奇怪的要求:

function TextLimit(elem, maxChars) { ... }
其中elem是一个textarea或type=text的输入,maxChars是可以进入elem的最大字符数。当用户键入时,函数中的代码必须将elem中的文本长度限制为maxChars。但是,如果用户是第一次粘贴,即使粘贴的文本的字符数大于maxChars,elem也必须获取粘贴的所有内容。 编辑:如果粘贴的文本比maxChars长,则在第一次粘贴后,用户不能再键入/粘贴,除非文本被删除/退格到比maxChars短的长度

任何使用纯JavaScript或jQuery的建议都将不胜感激


maxlenght属性不允许粘贴。在粘贴时以编程方式设置/删除它并不适用于所有浏览器。在keydown/keypress/keypup上获取elem值的子字符串会产生一些令人不快的结果。

类似的方法似乎有效:

还有几件事需要解决,比如在达到最大值时允许删除键。不过,这应该很容易解决

试试看:(更新)

函数文本限制(元素、最大字符){
var permittedKeys=[8,37,38,39,40,46];
要素焦点(函数(){
if(elem.val().length>=maxChars){
要素数据(“防止”,真实);
elem.data('value',elem.val());
}
});
元素模糊(函数(){
if(元素数据(‘防止’)){
元素值(元素数据(‘值’);
}
});
元素键控(功能(事件){
var count=elem.val().length;
如果(计数>=maxChars&$.inArray(event.which,permittedKeys)<0){
要素数据(“防止”,真实);
elem.data('value',elem.val());
返回false;
}否则{
要素数据(“防止”,错误);
}
});  
}
TextLimit($('myTextarea'),30);
函数文本限制(元素、最大字符){
var permittedKeys=[8,37,38,39,40,46];
要素焦点(函数(){
if(elem.val().length>=maxChars){
要素数据(“防止”,真实);
elem.data('value',elem.val());
}
});
元素模糊(函数(){
if(元素数据(‘防止’)){
元素值(元素数据(‘值’);
}
});
元素键控(功能(事件){
var count=elem.val().length;
如果(计数>=maxChars&$.inArray(event.which,permittedKeys)<0){
要素数据(“防止”,真实);
elem.data('value',elem.val());
返回false;
}否则{
要素数据(“防止”,错误);
}
});  
}
TextLimit($('myTextarea');

谢谢你,Patrick。但是,这并不是我想要的。如果粘贴的文本比maxChars长,那么用户就不能再输入了,无论是通过键入还是通过粘贴。让我修改我的问题来反映这一点。@Patrick-Backspace有一种古怪的行为,如果我突出显示所有粘贴的输入,然后对其进行Backspace,我就不能键入/粘贴任何内容除非我在一个空的文本区域上再次点击backspace,否则,代码似乎限制为maxChars+1,否则,我想你已经接近了。我喜欢它不使用粘贴事件的方式:)@dimskiy-我已经做了一些更改,但会再看一看。我只测试了删除,没有退格。几分钟后回来…@dimskiy-更新并简化了一点。试试看@帕特里克-我感谢你的帮助。我要离开办公室了,几个小时后我会在家里检查一下。非常感谢。
function TextLimit(elem, maxChars) {
    var permittedKeys = [8,37,38,39,40,46];

    elem.focus(function() {
        if(elem.val().length >= maxChars) {
            elem.data('prevent', true);
            elem.data('value', elem.val());
        }
    });

    elem.blur(function() {
        if( elem.data('prevent') ) {
            elem.val( elem.data('value') );
        }
    });

    elem.keydown(function(event) {
        var count = elem.val().length;
        if(count >= maxChars && $.inArray(event.which, permittedKeys) < 0) {
            elem.data('prevent', true);
            elem.data('value', elem.val());
            return false;
        } else {
            elem.data('prevent', false);
        }
    });  
}

TextLimit($('#myTextarea'), 30);
function TextLimit(elem, maxChars) {
 var permittedKeys = [8,37,38,39,40,46];

 elem.focus(function() {
     if(elem.val().length >= maxChars) {
         elem.data('prevent', true);
         elem.data('value', elem.val());
     }
 });

 elem.blur(function() {
     if( elem.data('prevent') ) {
         elem.val( elem.data('value') );
     }
 });

 elem.keydown(function(event) {
     var count = elem.val().length;
     if(count >= maxChars && $.inArray(event.which, permittedKeys) < 0) {
         elem.data('prevent', true);
         elem.data('value', elem.val());
         return false;
     } else {
         elem.data('prevent', false);
     }
 });  
}

TextLimit($('#myTextarea');