如何使内容可编辑div表现得像文本区域?

时间:2013-05-23 13:25:36

标签: javascript html css html5

我已经构建了一个将markdown转换为html的editor。现在我必须使用jquery autosize插件来调整文本区域的大小。

如果我使用内容可编辑的div,我可以绕过它。但内容可编辑div的问题在于它不保留新行。每按一次返回键,它就会插入一个新的div。这会将我的应用程序的markdown呈现为html。

有什么方法可以使内容可编辑div的行为与文本区域完全相同?

2 个答案:

答案 0 :(得分:10)

在寻找答案而没有找到任何完全有效的东西后,我编写了自己的jQuery插件。

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

我使用了white-space: pre-wrap;并在输入时插入了“\n”。这样我就可以使用$("div").text()来获取文字而不用担心删除标记并格式化<br/>

样本:

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

答案 1 :(得分:1)

修改

在上面的@Mr_Green评论之后,您应该看看Make a <br> instead of <div></div> by pressing Enter on a contenteditable

正确的JS代码是:

$(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;
        }
      }
    });

})


您可以截取Enter按键,并使用Javascript将其替换为<br>

$(function(){

      $("#editable").keypress(function(e) {
        if (e.which == 13) {
            e.preventDefault();

             if (document.selection) {
                document.selection.createRange().pasteHTML("<br/>");
             } else {
                $(this).append("<br/>");
             }
        }
    });
});