2012-05-02 101 views
21

我想阻止用户在达到最大字符数限制时在textarea中输入文本。发生了什么事情,当我达到最大限度,然后我的文本区域滚动条移动到顶部我以某种方式防止此代码。如何防止用户在达到最大字符数限制后在textarea中输入文本

jQuery(document).ready(function($) { 
    $('textarea.max').keyup(function() { 
     var $textarea = $(this); 
     var max = 400; 
     if ($textarea.val().length > max) { 
      var top = $textarea.scrollTop(); 
      $textarea.val($textarea.val().substr(0, max)); 
      $textarea.scrollTop(top); 

     } 
    }); 
}); //end if ready(fn) 

但我也希望达到最大限制后用户无法在textarea中输入任何内容。目前发生的事情是,如果用户按住按键达到最大限制,则字符在文本区域中键入,但释放按键后会回到原始文本(即$ textarea.val($ textarea.val())。 substr(0,max));)。但我希望一旦这个条件成真

if ($textarea.val().length > max) { 

用户无法输入任何内容。我希望光标从textarea消失。但是,如果用户删除一些文本,则光标也可供用户再次输入输入。我该怎么做?

回答

43

keyup事件在默认行为(填充文本区域)发生后触发。

最好使用keypress事件,并过滤不可打印的字符。

演示:http://jsfiddle.net/3uhNP/1/(最大长度为4)

jQuery(document).ready(function($) { 
    var max = 400; 
    $('textarea.max').keypress(function(e) { 
     if (e.which < 0x20) { 
      // e.which < 0x20, then it's not a printable character 
      // e.which === 0 - Not a character 
      return;  // Do nothing 
     } 
     if (this.value.length == max) { 
      e.preventDefault(); 
     } else if (this.value.length > max) { 
      // Maximum exceeded 
      this.value = this.value.substring(0, max); 
     } 
    }); 
}); //end if ready(fn) 
+1

谢谢,但在测试你的代码之后。一旦达到最大限制,它就会停止。我无法输入一个单词。但是,如果我按下退格键,那么它也不起作用。至少用户可以选择按退格删除文本,然后再次开始输入。顺便说一句,这是我想要的行为。用户在达到最大限制后不能输入任何内容。 :)我怎么做,该用户按退格键删除,然后再次开始输入文字。谢谢 – Basit

+0

@Basit更新回答。在Firefox中,jQuery不能将非可打印字符标准化为零。所以,你必须手动排除(http://www.asciitable.com/)。 –

+0

感谢Rob W :)但请告诉我你使用过'(e.which <0x20)'。这意味着所有的字符,如退格键,输入,制表符,shift键都是不可打印的。我对吗?你还说过,“不可打印的字符没有通过jQuery来归为零”。你没有归一化到0是什么意思?你能向我解释吗? – Basit

24
<textarea maxlength="400"> </textarea> 

使用上面的代码,以限制插入一个文本区域的字符数,如果要禁用textarea的本身(即以后不能编辑),您可以使用javascript/jquery来禁用它。

+0

地狱@RobW,请检查http://jsfiddle.net/ucb3n/。 编辑:测试Firefox 12.0,Chrome 18.0,IE9。没有在IE9上工作。 – KBN

+2

'maxlength'属性是HTML5的新特性,不适用于Internet Explorer或Firefox <4。尽管如此,+1,因为这是一个不错的解决方案。 –

+0

@RobW,谢谢你的信息。我真的相信现在是我们全部使用更新的浏览器的时候了,当然除了“需要”的人之外。 – KBN

0

您可以使用this插件而不是试图编写自己的插件。我发现它工作得很好。

+0

上述链接已损坏,请使用[this one](https://stjerneman.com/portfolio/maxlength- jquery /)insted –

+0

更新了我的链接。感谢您指出。 – arb

1

只需在您的Javascript文件中写入此代码。 但需要用textarea指定'maxlength'属性。 这将适用于页面的所有textarea。

$('textarea').bind("change keyup input",function() { 

     var limitNum=$(this).attr("maxlength"); 

     if ($(this).val().length > limitNum) { 
      $(this).val($(this).val().substring(0, limitNum)); 
     } 

    }); 
4

保持简单

var max = 50; 
$("#textarea").keyup(function(e){ 
$("#count").text("Characters left: " + (max - $(this).val().length)); 
}); 

,并在你的HTML

<textarea id="textarea" maxlength="50"></textarea> 
<div id="count"></div> 

view example

+0

请在Firefox Chrome和Safari中测试解决方案此解决方案在Firefox 51.0.1(64位) –

0

添加此你可以保持您的活动,因为他们,而只是用这个library

例子

// applying a click event to one element 

Touche(document.querySelector('#myButton')).on('click', handleClick); 

// or to multiple at once 

Touche(document.querySelectorAll('.myButtons')).on('click', handleClicks); 

// or with jQuery 

$('.myButtons').on('click', handleClicks); 
0

你可以直接给maxlengthtextarea禁用本身。但是,您想要显示适当的消息,然后使用keyup事件作为默认行为,并使用textarealength来计算字符并显示合适的消息。

HTML

<div id="count"></div> 
<textarea class="max" maxlength="250" id="tarea"></textarea> 
<div id="msg"></div> 

jQuery的

$(function(){ 
    var max = parseInt($("#tarea").attr("maxlength")); 
    $("#count").text("Characters left: " + max); 
    $("#tarea").keyup(function(e){ 
     $("#count").text("Characters left: " + (max - $(this).val().length)); 
    if($(this).val().length==max) 
     $("#msg").text("Limit Reached...."); 
     else 
     $("#msg").text(""); 
    }); 
}); 

Demo Fiddle

0

对于那些在您的浏览器已经使用ES2015,下面是一个使用上面的一些答案的实现:

class InputCharacterCount { 
    constructor(element, min, max) { 
    this.element = element; 
    this.min = min; 
    this.max = max; 
    this.appendCharacterCount(); 
    } 

    appendCharacterCount(){ 
    let charCount = `<small class="char-counter help-block"></small>`; 
    this.element.closest('.form-group').append(charCount); 
    } 

    count(event){ 
    this.element.attr('maxlength', this.max); // Add maxlenght attr to input element 

    let value = this.element.val(); 
    this.element 
     .closest('.form-group') 
     .find('.char-counter') 
     .html(value.length+'/'+this.max); // Add a character count on keyup/keypress 

    if (value.length < this.min || value.length > this.max) { // color text on min/max changes 
     this.element.addClass('text-danger'); 
    } else { 
     this.element.removeClass('text-danger'); 
    } 
    } 
} 

用法:

let comment = $('[name="collection-state-comment"]'); 
let counter = new InputCharacterCount(comment, 21, 140); 
$(comment).keyup(function(event){ 
    counter.count(event); 
}); 
相关问题