7

I have built an editor that converts markdown to html. Right now I have to use jquery autosize plugin to resize the text area as it grows.

If I use a content-editable div I can bypass it. But the problem with content editable div is that it does not preserve new lines. It inserts a new div every time return key is pressed. This breaks the rendering of markdown to html for my application.

Is there any way I can make a content editable div behave exactly like text area?

Akshat Jiwan Sharma
  • 14,370
  • 13
  • 46
  • 59

2 Answers2

10

After searching for an answer and not finding anything that worked completely I wrote my own jQuery plugin.

https://github.com/UziTech/jquery.toTextarea.js

I used white-space: pre-wrap; and inserted '\n' on enter. That way I can use $("div").text() to get the text and not worry about removing tags and formatting <br/>'s

DEMO:

http://jsfiddle.net/UziTech/4msdgjox/

Tony Brix
  • 3,825
  • 7
  • 37
  • 48
  • Your plugin works perfectly and it really helped me a lot after struggling for a while with this. Thank you! – Leo Jul 15 '15 at 18:43
  • Thanks Tony. You really made my day.... I was struggling with this and was finaly about to write my own plugin but u saved my day. – prajnavantha Mar 01 '16 at 05:55
2

Edit

After the @Mr_Green comment above, you should have a look at Make a <br> instead of <div></div> by pressing Enter on a contenteditable

The JS code to make it right is :

$(function(){

  $("#editable")

    // make sure br is always the lastChild of contenteditable
    .live("keyup mouseup", function(){
      if (!this.lastChild || this.lastChild.nodeName.toLowerCase() != "br") {
        this.appendChild(document.createChild("br"));
      }
    })

    // use br instead of div div
    .live("keypress", function(e){
      if (e.which == 13) {
        if (window.getSelection) {
          var selection = window.getSelection(),
              range = selection.getRangeAt(0),
              br = document.createElement("br");
          range.deleteContents();
          range.insertNode(br);
          range.setStartAfter(br);
          range.setEndAfter(br);
          range.collapse(false);
          selection.removeAllRanges();
          selection.addRange(range);
          return false;
        }
      }
    });

})

;


You can intercept the Enter key press and replace it with a <br> with Javascript :

$(function(){
    
      $("#editable").keypress(function(e) {
        if (e.which == 13) {
            e.preventDefault();
            
             if (document.selection) {
                document.selection.createRange().pasteHTML("<br/>");
             } else {
                $(this).append("<br/>");
             }
        }
    });
});
Community
  • 1
  • 1
Xavier
  • 3,717
  • 3
  • 25
  • 52