I am using contenteditable div elements in my web application and I am trying to come up with a solution to limit the amount of characters allowed in the area, and once the limit is hit, attempting to enter characters simply does nothing. This is what I have so far:
var content_id = 'editable_div';
//binding keyup/down events on the contenteditable div
$('#'+content_id).keyup(function(){ check_charcount(content_id, max); });
$('#'+content_id).keydown(function(){ check_charcount(content_id, max); });
function check_charcount(content_id, max)
{
if($('#'+content_id).text().length > max)
{
$('#'+content_id).text($('#'+content_id).text().substring(0, max));
}
}
This DOES limit the number of characters to the number specified by 'max', however once the area's text is set by the jquery .text() function the cursor resets itself to the beginning of the area. So if the user keeps on typing, the newly entered characters will be inserted at the beginning of the text and the last character of the text will be removed. So really, I just need some way to keep the cursor at the end of the contenteditable area's text.
This is the way I did it by jQuery binding, making it easy for me by just adding a property data-input-length to a content editable element. Just add the javascript code anywhere in your document.
A more generalized revision of @user113716's answer which does not work for multiple contenteditable fields (it counts the total number of characters for all of the elements matching the given id, so you can only enter max characters total on the page).
This solution allows you to use a general class, and limits the number of characters in each contenteditable field independently.
the html:
And the JavaScript:
Firstly, this kind of thing is irritating for the user: I would suggest instead doing something similar to StackOverflow's comment field, which allows you type as much or as little as you like, shows you a message telling you how many characters you've typed and whether it's too many or too few, and refuses to let you submit a comment whose length is not valid.
Secondly, if you really have to limit the length of text, replacing the whole content of the
<div>
on every keystroke if the content is too long is unnecessarily expensive, and will make the editor unresponsive on slower machines. I suggest handling thekeypress
event and simply preventing the character being inserted usingpreventDefault()
on the event (or in IE, setting the event'sreturnValue
totrue
, assuming you're usingattachEvent
). This won't prevent the user from pasting text in, so you'll need to handle thepaste
event (which doesn't exist in Opera or Firefox < 3, so you'll need some kind of polling-based solution for those). Since you won't be able to access the content being pasted in advance, you'll have no way of knowing if the paste will take you over the character limit, so you'll need to set a timer to check the length again shortly after the paste. All that being the case, the first option seems preferable to me.How about passing in the
event
object to your function and callinge.preventDefault()
if the max is reached?Although, you may need to do a little more to allow the user to do things like 'delete'.
EDIT:
Added support for 'delete' key.
EDIT 2:
Also, you could probably get rid of the
keyup
handler.keydown
should be enough.The following solution also considers the control keys (which correspond to non-printable characters).