Мне нужно иметь возможность отображать некоторые теги HTML внутри текстового поля (а именно, <strong> , < я > , <u> , <a> ), но текстовые области интерпретируют только их текст как текст. Есть ли простой способ сделать это, не полагаясь на внешние библиотеки/плагины (я использую jQuery)? Если нет, знаете ли вы о каком-либо плагине jQuery, который я мог бы использовать для этого?
Рендеринг HTML внутри textarea
Ответ 1
Это невозможно сделать с textarea
. То, что вы ищете, - это редактируемый контент div, что очень легко сделать:
<div contenteditable="true"></div>
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>
Ответ 2
С помощью редактируемого 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>
Ответ 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;
}
<textarea id="box" oninput="render()">you can edit me!</textarea>
Ответ 4
попробуйте этот пример на JSFiddle
<style>
.editable {
width: 300px;
height: 200px;
border: 1px solid #ccc;
padding: 5px;
resize: both;
overflow: auto;
}
</style>
<div class="editable" contenteditable="true"></div>
<button class="bold">toggle red</button>
<button class="italic">toggle italic</button>
<script>
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();
});
</script>
Редактировать Джеффри Кроудер - программист для веб-разработчиков/Windows
Я добавил скрипт JS для кода.
Ответ 5
У меня та же проблема, но в обратном порядке и следующее решение. Я хочу поместить html из div в текстовое поле (так что я могу отредактировать некоторые реакции на своем веб-сайте, я хочу иметь текстовое поле в том же месте.)
<div id="msg500">here some <strong>html</strong> <i>tags</i>.</div>
Чтобы разместить содержимое этого div в текстовом поле, я использую:
var content = $('#msg500').text();
$('#msg500').wrapInner('<textarea>'+content+'</textarea>');
Ответ 6
Добавление к этому. Вы можете использовать символьные сущности (например, изменить <div>
на <div>
), и оно будет отображаться в текстовом поле. Но когда он будет сохранен, значение textarea будет отображаемым текстом. Поэтому вам не нужно де-кодировать. Я просто протестировал это в браузерах (т.е. вернулся к 11).
Ответ 7
Это возможно с помощью <textarea>
единственное, что вам нужно сделать, это использовать
Summernote WYSIWYG editor
он интерпретирует теги HTML внутри текстового поля (а именно <strong>
, <i>
, <u>
, <a>
)