Reputation: 1199
I would like to limit number of chars in my editable div to 10. After user reach the limit I would like to use .preventDefault()
method to protect the div from additional chars. Can you help me out, please?
JSFiddle https://jsfiddle.net/7x2dfgx6/1/
HTML
<div class="profileInfo" id="About" style="border:solid;" contenteditable="true">OOOOO</div>
JQuery
jQuery(document).ready(function($){
const limit = 10;
rem = limit - $('#About').text().length;
$("#counter").append("You have <strong>" + rem + "</strong> chars left.");
$("#About").on('input', function(event) {
var char = $('#About').text().length;
rem = limit - char;
$("#counter").html("You have <strong>" + rem + "</strong> chars left.");
if(char>limit)
{
event.preventDefault();
//TODO
}
});
});
Upvotes: 23
Views: 41491
Reputation: 688
beforeinput
¹ event without jQuery²beforeinput
event wasn't available when the question was asked.document.getElementById("myinput").addEventListener('beforeinput', function(event) {
if (event.inputType.startsWith("insert")) {
const totalLength = this.innerText.length + event.data.length;
if (totalLength > 10)
event.preventDefault()
}
});
See more in the MDN page for the beforeinput
event.
Upvotes: 0
Reputation: 189
I tried this solution with JavaScript.
Also below the input is the character counter.
HTML:
<input type="text" class="about">
<span></span>
javascript:
let about = document.querySelector("input")
let text = document.querySelector("span")
const limit = 10
about.addEventListener("keypress" ,function(event) {
let char = about.value.length;
if(char>=limit){
event.preventDefault();
}
let rem = limit - char
text.innerText = ` You have ${rem} chars left.`
})
Upvotes: 0
Reputation: 21
el.addEventListener('input', function(event) {
if ( this.innerHTML.length >300 && event.keyCode != 8) {
document.execCommand("undo");
}
});
Upvotes: -1
Reputation: 940
Here is one way to limit the characters in an input. Works with paste and typing.
/**
* Limit an inputs number of characters
* @param {event} e - event of the input the user is typing into
* @param {number} limit - number of characters to limit to
*/
function limitInputCharacters(e, limit){
if(!e){
return;
}
var inputText = e.target.value;
var charsLeft = limit - inputText.length;
if (charsLeft >= 0) {
// do something, or nothing
} else if (charsLeft < 0) {
e.target.value = inputText.slice(0, limit)
}
}
document.addEventListener("DOMContentLoaded", function() {
const aboutTextArea = document.getElementById('input-about');
aboutTextArea.addEventListener("input", function(e) {
limitInputCharacters(e, 300)
})
})
Upvotes: 0
Reputation: 9157
To answer your main question:
.preventDefault()
cancel behavior of the events that are cancelable. input
event is not .
To check whether an event
is cancelable, try: console.log(event.cancelable);
.
For input
it will say "false"
You may want something like this (untested):
const limit = 10;
var rem = limit - $('#About').text().length;
$("#counter").append("You have <strong>" + rem + "</strong> chars left.");
$("#About").on('input', function(event) {
var char = $(this).text().length;
rem = limit - char;
if(rem <= 0){
$(this).text($(this).text().slice(0, limit));
}
$("#counter").html("You have <strong>" + rem + "</strong> chars left.");
});
EDIT
JSFiddle demo
Since it's contentEditable, I had to use an additional code (from this answer) to set a caret at the end of the input.
Upvotes: 30
Reputation: 1047
use keydown
instead of input
jQuery(document).ready(function($){
const limit = 10;
rem = limit - $('#About').text().length;
$("#counter").append("You have <strong>" + rem + "</strong> chars left.");
$("#About").on('keypress', function(event) {
var char = $('#About').text().length;
if(char>limit)
{
return false;
//or
event.preventDefault();
//TODO
}
rem = limit - char;
$("#counter").html("You have <strong>" + rem + "</strong> chars left.");
});
});
Upvotes: 9
Reputation: 4058
Try changing the value of the contenEditable attribute. Also I set the check for the limit to >=
jQuery(document).ready(function($){
const limit = 10;
rem = limit - $('#About').text().length;
$("#counter").append("You have <strong>" + rem + "</strong> chars left.");
$("#About").on('input', function(event) {
var char = $('#About').text().length;
rem = limit - char;
event.preventDefault();
if(char>=limit)
{
$('#About').attr('contenteditable','False');
//TODO
}
$("#counter").html("You have <strong>" + rem + "</strong> chars left.");
});
});
Upvotes: -1