【问题标题】:How to make a content editable div behave like a text area?如何使内容可编辑的 div 表现得像文本区域?
【发布时间】:2013-05-18 21:15:14
【问题描述】:

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

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

有什么方法可以让内容可编辑的 div 的行为与文本区域完全一样?

【问题讨论】:

  • 简单的答案没有。我最近与两者一起工作并遇到了同样的问题。 :(
  • 您可以告诉浏览器在文本区域处于焦点时将任何“Enter”视为“Shift+Enter”,这将使其能够保持在同一个 div 中。
  • @Mr_Green 那真是太糟糕了。那么使用文本区域是我唯一的选择吗?
  • 可以试试html5吗contenteditablehtml5demos.com/contenteditable
  • @AkshatJiwanSharma 对不起,我误解了你的解释。这有一个解决方法。让我处理它。

标签: javascript css html


【解决方案1】:

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

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

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

演示:

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

【讨论】:

  • 您的插件运行良好,经过一段时间的努力,它确实对我帮助很大。谢谢!
  • 谢谢托尼。你真的让我很开心....我一直在努力解决这个问题,最终要编写自己的插件,但你拯救了我的一天。
【解决方案2】:

编辑

在上面的@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 的&lt;br&gt;

$(function(){
    
      $("#editable").keypress(function(e) {
        if (e.which == 13) {
            e.preventDefault();
            
             if (document.selection) {
                document.selection.createRange().pasteHTML("<br/>");
             } else {
                $(this).append("<br/>");
             }
        }
    });
});

【讨论】:

  • document.selection 似乎只适用于 IE。有没有跨浏览器的解决方案?
  • @Mr_Green 我们可以使用 Jquery,请参阅我的答案的编辑 :)
  • 接受了这个答案,但我想我会使用默认文本区域。让 div 表现得像文本区域对我来说不值得。
  • @AkshatJiwanSharma 会更好。 :)
  • @AkshatJiwanSharma 是的,我想是的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 2011-11-18
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 2023-02-10
相关资源
最近更新 更多