Kết xuất HTML bên trong textarea


145

Tôi cần có khả năng hiển thị một số thẻ HTML bên trong textarea (cụ thể là <strong>, <i>, <u>, <a>) nhưng textareas chỉ diễn giải nội dung của chúng dưới dạng văn bản. Có cách nào dễ dàng để làm điều đó mà không cần dựa vào các thư viện / plugin bên ngoài (tôi đang sử dụng jQuery) không? Nếu không, bạn có biết bất kỳ plugin jQuery nào tôi có thể sử dụng để làm điều này không?


Cách duy nhất để làm điều đó sẽ là phủ lớp đánh dấu HTML của bạn lên nội dung của thẻ textarea thông qua các thủ thuật định vị CSS. Không có gì giúp bạn thuyết phục trình duyệt hiển thị nội dung textarea khác nhau. (Tại sao chính xác bạn "cần" làm điều này?)
Pointy

Tôi chỉ cần người dùng có thể thêm một số kiểu định dạng vào văn bản anh ta nhập (giống như khi bạn viết một bài viết trên Wordpress). Tôi chỉ không cần tất cả các tính năng như căn chỉnh văn bản, v.v., mà chỉ cần những thẻ cơ bản đó.
Nhà sư mã hóa

Câu trả lời:


233

Điều này là không thể làm với a textarea. Những gì bạn đang tìm kiếm là một div có thể chỉnh sửa nội dung , rất dễ thực hiện:

<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
thật xấu hổ khi bạn thực tế không thể sử dụng điều này mà không sử dụng javascript để gửi các thay đổi của mình bằng cách sử dụng ajax hoặc sao chép chúng vào đầu vào biểu mẫu. Nếu bất cứ ai đã tìm ra cách để làm điều đó tôi sẽ thực sự quan tâm!
Ben

3
@yckart: Chà, tôi không nghĩ điều đó thực sự hợp lệ, mặc dù nó hoạt động trong tất cả các trình duyệt tôi đã thử. contenteditablelà một thuộc tính được liệt kê chứ không phải là thuộc tính Boolean (có inherittrạng thái cũng như truefalse) và tôi nghĩ điều đó có nghĩa là việc chỉ định một giá trị là bắt buộc, mặc dù tôi không thể tìm thấy một chút rõ ràng của thông số kỹ thuật để xác nhận điều này. MDN dường như đồng ý mặc dù.
Tim Down

2
@yckart: Tôi đã giả sử trình thông dịch trình duyệt contenteditablekhông có giá trị giống như contenteditable="", lần lượt giống như contenteditable="true".
Tim Down

7
Điều này không làm việc tốt hơn a textarea. Gõ <strong>someting</strong>vào fiddle để lại cho bạn văn bản chính xác. HTML không được áp dụng.
Matt Ellen

2
@MarcusEkwall nhưng không phải là câu hỏi yêu cầu kết xuất html?
phil294 30/03/2016

31

Với một div có thể chỉnh sửa, bạn có thể sử dụng phương thức document.execCommand( chi tiết hơn ) để dễ dàng cung cấp hỗ trợ cho các thẻ bạn đã chỉ định và cho một số chức năng khác ..

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


Điều này không hoạt động trong một số trình duyệt chỉ thêm điều này như một ghi chú NHƯ '16
jeffrey đông hơn

5

Vì bạn chỉ nói render, vâng, bạn có thể. Bạn có thể làm một cái gì đó dọc theo dòng này:

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>
Điều này làm cho nó textareasẽ hiển thị html! Bên cạnh việc nhấp nháy khi thay đổi kích thước, không thể sử dụng trực tiếp các lớp và phải đảm bảo rằng div trong svgđịnh dạng có cùng định dạng textareavới dấu mũ để căn chỉnh chính xác, nó hoạt động!


2

Một phụ lục cho điều này. Bạn có thể sử dụng các thực thể ký tự (chẳng hạn như thay đổi <div>thành &lt;div&gt;) và nó sẽ hiển thị trong vùng văn bản. Nhưng khi nó được lưu, giá trị của textarea là văn bản như được hiển thị . Vì vậy, bạn không cần phải giải mã. Tôi chỉ thử nghiệm điều này trên các trình duyệt (tức là trở lại 11).


Tôi thực sự muốn nó làm việc cho tôi nhưng không được. Ví dụ <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>không hiển thị dưới dạng HTML. Tôi đang sử dụng Chrome 46.
sirdank 10/11/2015

Hừm. Tôi đã sao chép chuỗi đó trực tiếp vào tài liệu html và nó hiển thị đánh dấu đúng cho tôi trong Chrome Phiên bản 48.0.2552.0 dev (64-bit) OS X 10.11.1. Vì vậy, có lẽ đó là một vấn đề phiên bản.
axlotl 10/11/2015

Tôi liên tục bị bỏ phiếu vì điều này vì vậy đây là một cây bút: codepen.io/axlotl/pen/YGZOEq
axlotl

0

Tôi có cùng một vấn đề nhưng ngược lại, và giải pháp sau đây. Tôi muốn đặt html từ một div trong textarea (vì vậy tôi có thể chỉnh sửa một số phản ứng trên trang web của mình; tôi muốn có textarea ở cùng một vị trí.)

Để đưa nội dung của div này vào textarea tôi sử dụng:

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

thử ví dụ này

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

Điều này là có thể với <textarea> điều duy nhất bạn cần làm là sử dụng trình soạn thảo Summernote WYSIWYG

nó diễn giải các thẻ HTML bên trong một textarea (cụ thể là <strong>, <i>, <u>, <a>)


Nó không sử dụng textarea. Nó sử dụng div, không thể được gửi với một hình thức.
Usman Ahmed

Nó không hoạt động với textarea, chỉ cần thử đưa id cho textarea thay vì div. Tôi đã tạo ra một dự án toàn bộ bằng cách sử dụng textarea và summernote. Nó hoạt động tốt!
Fenil Shah

Vấn đề ở đây là gì? Nó hoạt động giống như ckeditor nếu textarea được sử dụng. Không thể kết xuất thẻ HTML như đã hỏi.
Usman Ahmed

Tại sao tôi nên sử dụng trình soạn thảo WYSIWYG? Đây thực sự không phải là một câu trả lời, xin lỗi.
Luca De Nardi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.