On Internet Explorer, a contentEditable DIV creates a new paragraph (<p></p>
) each time you press Enter whereas Firefox creates a <br/>
tag.
As discussed here, it is possible to use JavaScript to intercept the Enter keyPress and use range.pasteHTML to create a <br/>
instead. But doing this breaks the Undo menu; once you hit Enter, you can no longer Undo past that point.
How can I force the contentEditable element to create single line breaks on Enter without breaking Undo?
Presumably you are going to post the editable content back to a server. Therefore, you shouldn't really care whether you have paragraph or break tags in place while the user is editing, because you can parse the HTML before submission (or on the server, if you like) and replace instances of paragraphs with breaks. This keeps the UNDO queue in operation for the user, but lets you have your HTML as clean as you want it.
I'll further presume that you're going to know exactly which DIV elements are going to be contentEditable. Before the form is submitted, you can run each contentEditable div through a function like this:
And you call this in a loop (which iterates through all contentEditable DIVs, using an array I will call ceDivs), like this:
and then:
An improvement on this (especially if you don't want to do this right at submit time), might be to clean the contents of each such div any other time you like (onblur, whatever) and assign the contents of each ceDiv to its own invisible form element for later submission. Used in combination with your own CSS suggestion above, this might work for you. It doesn't preserve your literal requirements to the letter (i.e., it doesn't get Javascript to make IE behave differently than it has been coded under the covers to behave) but for all practical purposes the effect is the same. The users get what they want and you get what you want.
While you're at it you may also want to clean space strings in IE as well. If the user types multiple spaces (as some still do after periods), what is inserted by IE is not [space][space] but [space] , an initial space character (String.fromCharCode(32)) plus as many entities as there are left in the space run.
Use
<BR>
instead of<P>
(Tested in IE9. Maybenbsp;
is needed in older versions after<BR>
(pasteHTML("<br> "))
)Use it on keydown event:
Hold down shift when you press enter for breaks, don't hold it down for full paragraphs. This behaviour is the same by default in Firefox, given a contenteditable area containing a paragraph: i.e.
Not an exact solution, but another workaround. If you use the markup:
Then pressing enter will create new
div
tags instead ofp
tags.Consider using
<span contenteditable="true"></span>
when using Internet Explorer. You may not want to do this with Chrome because the focus looks funny. You will probably want to implement your ownonfocus
andonblur
code.IE binds the text node with a
<p>
tag on Enter key press. To achieve a line break Shift+Enter. Firefox adds a<br>
tag on Enter key press. To make the behavior common across both the browsers, you can do the following:Assume the following markup:
Javascript [assume the below code is in a function closure so that you don't bloat the page with globals]:
Note: this script is prior to jQuery < 1.9 for the use of the deprecated
$.browser