Limiting Number of Characters in a ContentEditable div
How about passing in the event
object to your function and calling e.preventDefault()
if the max is reached?
var content_id = 'editable_div';
max = 10;
//binding keyup/down events on the contenteditable div
$('#'+content_id).keyup(function(e){ check_charcount(content_id, max, e); });
$('#'+content_id).keydown(function(e){ check_charcount(content_id, max, e); });
function check_charcount(content_id, max, e)
{
if(e.which != 8 && $('#'+content_id).text().length > max)
{
// $('#'+content_id).text($('#'+content_id).text().substring(0, max));
e.preventDefault();
}
}
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.
A simple way to achieve this :
<div onkeypress="return (this.innerText.length <= 256)" contenteditable="true">
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 the keypress
event and simply preventing the character being inserted using preventDefault()
on the event (or in IE, setting the event's returnValue
to true
, assuming you're using attachEvent
). This won't prevent the user from pasting text in, so you'll need to handle the paste
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.