在 textarea 中渲染 HTML

IT技术 javascript jquery html textarea
2021-02-05 14:01:19

我需要能够在 textarea(即 <strong>、<i>、<u>、<a>)内呈现一些 HTML 标签,但 textareas 仅将其内容解释为文本。有没有一种不依赖外部库/插件的简单方法(我使用的是 jQuery)?如果没有,你知道我可以用来做这件事的任何 jQuery 插件吗?

6个回答

这是不可能的textarea您正在寻找的是一个内容可编辑的div,这很容易完成:

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

js小提琴

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 提交更改或将它们复制到表单输入中,则您实际上无法使用它。如果有人找到了一种方法,我会非常感兴趣!
2021-03-16 14:01:19
@yckart:我假设浏览器contenteditable在没有值的情况下解释为与 相同contenteditable="",而后者又与contenteditable="true".
2021-03-25 14:01:19
这并不比textarea. 输入<strong>someting</strong>小提琴会给你留下确切的文本。不应用 HTML。
2021-03-25 14:01:19
@MarcusEkwall 但不是要求 html 渲染的问题吗?
2021-03-31 14:01:19
@yckart:嗯,我认为这实际上并不有效,即使它适用于我尝试过的所有浏览器。contenteditable是一个枚举属性而不是布尔属性(有一个inheritstate 以及trueand false),我认为这意味着指定一个值是强制性的,尽管我找不到明确的规范来确认这一点。不过,MDN似乎同意
2021-04-08 14:01:19

使用可编辑的 div,您可以使用该方法document.execCommand更多详细信息)轻松为您指定的标签和其他一些功能提供支持。

#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 的注释
2021-03-27 14:01:19
这太棒了——简直就是哇——为我节省了大量的工作!
2021-03-27 14:01:19
2021-03-31 14:01:19
看起来它已被弃用 - 真可惜
2021-04-08 14:01:19

既然你只说渲染,是的,你可以。你可以做一些类似的事情:

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;
}
<textarea id="box" oninput="render()">you can edit me!</textarea>
这使得 atextarea将呈现 html!除了在调整大小时闪烁,无法直接使用类以及必须确保 div 中的 div与插入符号svg具有相同的格式textarea才能正确对齐,它的工作原理!

试试这个例子

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>

仅将样式应用于部分文本怎么样?
2021-03-15 14:01:19

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

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