I use the contenteditable div as an input field to enter text and enter icons using the button (small html images) inside this text.
While the text is narrower than the contenteditable field, it is great.
As soon as the text is longer than the field (therefore it is partially hidden):
when I enter a text character, everything is fine, the last character is automatically displayed after pressing a key so that you can always see what you are typing. But when I enter the icon through the button, the icon is there, but it is hidden, because the contents of the field do not move to make the newly entered icon visible until I enter another text character.
Any solution for this, so that the last element entered (text or html) is always displayed to the user?
function pasteIcon(html) { var sel, range; if (window.getSelection) { sel = window.getSelection(); if (sel.getRangeAt && sel.rangeCount) { range = sel.getRangeAt(0); range.deleteContents(); var el = document.createElement("div"); el.innerHTML = html; var frag = document.createDocumentFragment(), node, lastNode; while ((node = el.firstChild)) { lastNode = frag.appendChild(node); } range.insertNode(frag); if (lastNode) { range = range.cloneRange(); range.setStartAfter(lastNode); range.collapse(true); sel.removeAllRanges(); sel.addRange(range); } } } else if (document.selection && document.selection.type != "Control") { document.selection.createRange().pasteIcon(html); } } $(document).ready(function() { $('.buttOn').click(function() { $('.contEd').focus(); pasteIcon('<img class="icOn" src="http://www.bmgstuff.com/files/interface/generator_frame/text_blood.png">'); }) });
[contenteditable="true"] { display: inline; white-space: nowrap; overflow: hidden !important; text-overflow: inherit; -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } [contenteditable="true"] br { display: none; } .contAiner { display: flex; } .buttOn { width: 24px; height: 24px; border: none; background: #666; color: white; } .contEd { height: 22px; text-align: center; width: 100px; line-height: 23px; color: black; font-size: 10.5px; font-family: arial; border: 1px solid black; } .icOn { width: 9px; height: 13px; top: 1px; position: relative; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="contAiner"> <input class="buttOn" type="button" value="B"> <div class="contEd" contenteditable="true" spellcheck="false" autocomplete="off"></div> </div>
Here is jsFiddle
And so the source stream I took the function "pasteIcon".
PS: I tried to call key code 39 (right arrow) right after the pasteIcon function to simulate a keystroke, but that just didn't work.
jquery html css contenteditable
Bachir messaouri
source share