Надання HTML всередині textarea


146

Мені потрібно мати можливість відображати деякі теги HTML у текстовій області (а саме <strong>, <i>, <u>, <a>), але текстові області інтерпретують лише їхній вміст як текст. Чи є простий спосіб зробити це, не покладаючись на зовнішні бібліотеки / плагіни (я використовую jQuery)? Якщо ні, чи знаєте ви будь-який плагін jQuery, який я міг би використовувати для цього?


Єдиним способом зробити це буде накладання розмітки HTML на вміст тегу textarea за допомогою фокусів щодо позиціонування CSS. Ніщо не допоможе вам переконати браузер у тому, щоб виводити вміст текстової області по-різному. (Чому саме вам потрібно "це зробити"?
Поні

Мені просто потрібно, щоб користувач мав змогу додати в текст, який він вводить, кілька стилів форматування (подібно до того, як ви пишете статтю на Wordpress). Мені просто не потрібні всі функції, такі як вирівнювання тексту тощо, а лише ті основні теги.
Чернець кодування

Відповіді:


234

Це неможливо зробити з a textarea. Що ви шукаєте - це вміст для редагування вмісту , який дуже легко зробити:

<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>


8
справжній ганьба, що ви практично не можете використовувати це без використання javascript або надсилати свої зміни за допомогою ajax, або скопіювати їх у форму форми. Якщо хтось знайшов спосіб це зробити, мені було б дуже цікаво!
Бен

3
@yckart: Ну, я не думаю, що це насправді дійсно, хоча це працює у всіх браузерах, які я пробував. contenteditableце перерахований атрибут, а не булевий атрибут (є inheritстан, а також trueі false), і я думаю, що це означає, що вказати значення є обов'язковим, хоча я не можу знайти остаточний біт специфікації, щоб підтвердити це. Здається, MDN погоджується .
Тім Даун

2
@yckart: Я вважав, що браузер інтерпретує contenteditableбез значення те саме contenteditable="", що, що, в свою чергу, те саме, що contenteditable="true".
Tim Down

7
Це не працює краще, ніж textarea. Введення <strong>someting</strong>у загадку залишає вас саме таким текстом. HTML не застосовується.
Метт Еллен

2
@MarcusEkwall, але не було питання про html-рендерінг?
phil294

31

За допомогою редагованого 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>


Це не працює в деяких браузерах, просто додаючи це як замітку AS 16-го
jeffrey crowder

5

Оскільки ви лише сказали візуалізацію, так, можете. Ви можете зробити щось відповідно до цього:

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>
Це робить це так, що а textareaвізуалізація html! Окрім миготіння при зміні розміру, неможливості безпосередньо використовувати класи та переконатися, що div у файлі svgмає той самий формат, що і textareaдля карети, щоб правильно вирівняти, це працює!


2

Додаток до цього. Ви можете використовувати символьні об'єкти (наприклад, змінити <div>на &lt;div&gt;), і вони відображатимуться в текстовій області. Але коли він зберігається, значенням текстової області є текст, як наданий . Тож вам не потрібно декодувати. Я щойно тестував це в браузерах (тобто назад до 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.
sirdank

Гм. Я скопіював цей рядок безпосередньо в html-документ, і він відображає розмітку належним чином для мене у версії Chrome 48.0.2552.0 dev (64-розрядна) OS X 10.11.1. Тож, можливо, це проблема з версією.
axlotl

Я продовжую голосувати за це, ось ось перо: codepen.io/axlotl/pen/YGZOEq
axlotl

0

У мене така ж проблема, але в зворотному, і наступне рішення. Я хочу розмістити HTML з div у textarea (щоб я міг редагувати деякі реакції на своєму веб-сайті; я хочу, щоб 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>


0

спробуйте цей приклад

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>


-2

Це можливо за <textarea> допомогою єдиного, що вам потрібно зробити, це використовувати редактор Summernote WYSIWYG

він інтерпретує HTML - теги всередині текстового поля (а саме <strong>, <i>, <u>, <a>)


У ньому не використовується текстоподібна область. Він використовує div, який неможливо надіслати формою.
Усман Ахмед

Це працює з textarea, просто спробуйте дати id textarea замість div. Я створив цілий проект, використовуючи textarea та summernote. Це чудово працює!
Феніл Шах

В чому справа? Він поводиться так само, як ckeditor, якщо використовується textarea. Неможливо відобразити теги HTML за запитом.
Усман Ахмед

Чому я повинен використовувати редактор WYSIWYG? Це справді не відповідь, вибачте.
Лука Де Нарді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.