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

Aks*_*rma 6 html javascript css html5

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

如果我使用内容可编辑的div,我可以绕过它.但内容可编辑div的问题在于它不保留新行.每按一次返回键,它就会插入一个新的div.这打破了我的应用程序的markdown渲染到html.

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

Ton*_*rix 10

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

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

我在输入时使用white-space: pre-wrap;并插入' \n'.这样我可以用$("div").text()得到的文本,不用担心删除标签和格式<br/>

DEMO:

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


Xav*_*ier 2

编辑

在上面的 @Mr_Green 评论之后,您应该看看通过在可编辑内容上按 Enter 键来创建 <br> 而不是 <div></div>

正确的 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;
        }
      }
    });

})
Run Code Online (Sandbox Code Playgroud)

;


您可以拦截Enter按键并将其替换为<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/>");
             }
        }
    });
});
Run Code Online (Sandbox Code Playgroud)