【问题标题】:Rendering HTML inside textarea在 textarea 中渲染 HTML
【发布时间】:2011-06-10 00:03:53
【问题描述】:

【问题讨论】:

  • 唯一的方法是通过 CSS 定位技巧将 HTML 标记覆盖在 textarea 标记的内容上。没有什么能帮助您说服浏览器以不同的方式呈现 textarea 内容。 (为什么你“需要”这样做?)
  • 我只需要用户能够为他输入的文本添加一些格式样式(就像您在 Wordpress 上写文章时一样)。我只是不需要文本对齐等所有功能,只需要那些基本标签。

标签: javascript jquery html textarea


【解决方案1】:

textarea 无法做到这一点。您正在寻找的是一个content editable div,这很容易做到:

<div contenteditable="true"></div>

jsFiddle

div.editable {
    width: 300px;
    height: 200px;
    border: 1px solid #ccc;
    padding: 5px;
}

strong {
  font-weight: bold;
}
<div contenteditable="true">This is the first line.<br>
See, how the text fits here, also if<br>there is a <strong>linebreak</strong> at the end?
<br>It works nicely.
<br>
<br><span style="color: lightgreen">Great</span>.
</div>

【讨论】:

  • 真的很遗憾,如果不使用 javascript 来使用 ajax 提交更改或将它们复制到表单输入中,您实际上无法使用它。如果有人找到了一种方法,我会很感兴趣!
  • @yckart:好吧,我认为这实际上并不有效,即使它适用于我尝试过的所有浏览器。 contenteditable is an enumerated attribute 而不是布尔属性(有一个 inherit 状态以及 truefalse),我 认为 这意味着指定一个值是强制性的,尽管我可以'找不到规范的明确位来确认这一点。 MDN seems to agree
  • @yckart:我假设浏览器将没有值的contenteditable 解释为与contenteditable="" 相同,而contenteditable="" 又与contenteditable="true" 相同。
  • 这并不比textarea 好用。在小提琴中输入&lt;strong&gt;someting&lt;/strong&gt; 会给你留下确切的文字。未应用 HTML。
  • @MarcusEkwall 但问题不是要求呈现 html 吗?
【解决方案2】:

使用可编辑的 div,您可以使用方法 document.execCommand (more details) 轻松地为您指定的标签和其他一些功能提供支持..

#text {
    width : 500px;
	min-height : 100px;
	border : 2px solid;
}
<div id="text" contenteditable="true"></div>
<button onclick="document.execCommand('bold');">toggle bold</button>
<button onclick="document.execCommand('italic');">toggle italic</button>
<button onclick="document.execCommand('underline');">toggle underline</button>

【讨论】:

  • 这在某些浏览器中不起作用,只是将其添加为 '16 的注释 AS
  • 这真是太棒了——简直就是哇——为我节省了大量的工作!
  • 看起来它已被弃用 - 真可惜
【解决方案3】:

既然你只说渲染,是的,你可以。您可以按照以下方式做一些事情:

function render(){
	var inp     = document.getElementById("box");
	var data = `
<svg xmlns="http://www.w3.org/2000/svg" width="${inp.offsetWidth}" height="${inp.offsetHeight}">
<foreignObject width="100%" height="100%">
<div xmlns="http://www.w3.org/1999/xhtml" 
style="font-family:monospace;font-style: normal; font-variant: normal; font-size:13.3px;padding:2px;;">
${inp.value} <i style="color:red">cant touch this</i>
</div>
</foreignObject>
</svg>`;
	var blob = new Blob( [data], {type:'image/svg+xml'} );
	var url=URL.createObjectURL(blob);
	inp.style.backgroundImage="url("+URL.createObjectURL(blob)+")";
 }
 onload=function(){
  render();
  ro = new ResizeObserver(render);
	ro.observe(document.getElementById("box"));
 }
#box{
  color:transparent;
  caret-color: black;
  font-style: normal;/*must be same as in the svg for caret to align*/
  font-variant: normal; 
  font-size:13.3px;
  padding:2px;
  font-family:monospace;
}
&lt;textarea id="box" oninput="render()"&gt;you can edit me!&lt;/textarea&gt;
这使得textarea 将呈现html! 除了调整大小时闪烁,无法直接使用类,并且必须确保svg 中的 div 与textarea 具有相同的格式,以便插入符号正确对齐,它的工作原理!

【讨论】:

    【解决方案4】:

    试试这个例子

    function toggleRed() {
      var text = $('.editable').text();
      $('.editable').html('<p style="color:red">' + text + '</p>');
    }
    
    function toggleItalic() {
      var text = $('.editable').text();
      $('.editable').html("<i>" + text + "</i>");
    }
    
    $('.bold').click(function() {
      toggleRed();
    });
    
    $('.italic').click(function() {
      toggleItalic();
    });
    .editable {
      width: 300px;
      height: 200px;
      border: 1px solid #ccc;
      padding: 5px;
      resize: both;
      overflow: auto;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="editable" contenteditable="true"></div>
    <button class="bold">toggle red</button>
    <button class="italic">toggle italic</button>

    【讨论】:

    • 只对部分文本应用样式怎么样?
    【解决方案5】:

    对此的附录。您可以使用字符实体(例如将&amp;lt;div&amp;gt; 更改为&amp;lt;div&amp;gt;),它将在文本区域中呈现。但是当它被保存时,textarea 的值是文本呈现的。所以你不需要解码。我刚刚跨浏览器测试了这个(即回到 11)。

    【讨论】:

    • 我真的很想让它为我工作,但它没有。例如&lt;textarea&gt; check for url &amp;lt;B&amp;gt;http://localhost/Dashboard.aspx&amp;lt;/B&amp;gt; &amp;lt;BR&amp;gt; Tool Started at &amp;lt;B&amp;gt;11/10/2015 3:56:58 AM&amp;lt;/B&amp;gt; &amp;lt;BR&amp;gt; .... &lt;/textarea&gt; 不显示为 HTML。我在 Chrome 46 上。
    • 嗯。我将该字符串直接复制粘贴到 html 文档中,它会在 Chrome 版本 48.0.2552.0 dev(64 位)OS X 10.11.1 中为我正确呈现标记。所以可能是版本问题。
    • 我一直对此投反对票,所以这是一支笔:codepen.io/axlotl/pen/YGZOEq
    • 如果你把 <i>测试 <i>那么它会以斜体显示吗?不!但这就是“渲染”的意思。
    【解决方案6】:

    我有同样的问题,但反过来,以及以下解决方案。我想将 div 中的 html 放在 textarea 中(这样我就可以在我的网站上编辑一些反应;我希望将 textarea 放在同一位置。)

    要将这个 div 的内容放在我使用的 textarea 中:

    var content = $('#msg500').text();
    $('#msg500').wrapInner('<textarea>' + content + '</textarea>');
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div id="msg500">here some <strong>html</strong> <i>tags</i>.</div>

    【讨论】:

      【解决方案7】:

      &lt;textarea&gt; 可以做到这一点 您唯一需要做的就是使用 Summernote WYSIWYG editor

      它解释文本区域内的 HTML 标签(即&lt;strong&gt;&lt;i&gt;&lt;u&gt;&lt;a&gt;

      【讨论】:

      • 它不使用文本区域。使用div,不能用表单提交。
      • 它确实适用于 textarea,只需尝试将 id 赋予 textarea 而不是 div。我使用 textarea 和 Summernote 创建了一个完整的项目。效果很好!
      • 重点是什么?如果使用 textarea,它的行为与 ckeditor 相同。无法按要求呈现 HTML 标记。
      • 为什么要使用所见即所得的编辑器?这真的不是一个答案,对不起。
      • 它不使用文本区域。没有答案。
      猜你喜欢
      • 2012-08-31
      • 2011-10-22
      • 1970-01-01
      • 2011-09-14
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多