Just set contentEditable="false" . See this answer.
To prevent contenteditable element from adding div on pressing enter with Chrome and JavaScript, we can listen for the keydown event on the contenteditable element and prevent the default behavior when Enter is pressed. to add a contenteditable div. document. addEventListener("keydown", (event) => { if (event.
Definition and Usage The contenteditable attribute specifies whether the content of an element is editable or not.
contenteditable="false" Indicates that the element is not editable. contenteditable="inherit" Indicates that the element is editable if its immediate parent element is editable.
Try this:
$('div[contenteditable]').keydown(function(e) {
// trap the return key being pressed
if (e.keyCode === 13) {
// insert 2 br tags (if only one br tag is inserted the cursor won't go to the next line)
document.execCommand('insertHTML', false, '<br/>');
// prevent the default behaviour of return key pressed
return false;
}
});
Click here for demo
Add style display:inline-block;
to contenteditable
, it will not generate div
, p
and span
automatically in Chrome.
You can do this with just a CSS change:
div{
background: skyblue;
padding:10px;
display: inline-block;
}
pre{
white-space: pre-wrap;
background: #EEE;
}
http://jsfiddle.net/ayiem999/HW43Q/
This works in all major browsers (Chrome, Firefox, Safari, Edge)
document.addEventListener('keydown', event => {
if (event.key === 'Enter') {
document.execCommand('insertLineBreak')
event.preventDefault()
}
})
<div class="element" contenteditable="true">Sample text</div>
<p class="element" contenteditable="true">Sample text</p>
There is one inconvenience. After you finish editing, the elements might contain an ending <br>
inside. But you could add code to trim that down if you need to.
Check this answer to remove the trailing <br>
https://stackoverflow.com/a/61237737/670839
document.execCommand('defaultParagraphSeparator', false, 'p');
It overrides the default behavior to have paragraph instead.
On chrome the default behavior on enter is:
<div>
<br>
</div>
With that command it is gonna be
<p>
<br>
</p>
Now that it's more linear across it's easy to have only <br>
would you need to.
Try this:
$('div[contenteditable="true"]').keypress(function(event) {
if (event.which != 13)
return true;
var docFragment = document.createDocumentFragment();
//add a new line
var newEle = document.createTextNode('\n');
docFragment.appendChild(newEle);
//add the br, or p, or something else
newEle = document.createElement('br');
docFragment.appendChild(newEle);
//make the br replace selection
var range = window.getSelection().getRangeAt(0);
range.deleteContents();
range.insertNode(docFragment);
//create a new range
range = document.createRange();
range.setStartAfter(newEle);
range.collapse(true);
//make the cursor there
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
return false;
});
http://jsfiddle.net/rooseve/jDvau/3/
Use shift+enter instead of enter to just put a single <br>
tag in or wrap your text in <p>
tags.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With