แสดง HTML ภายใน textarea


146

ฉันต้องสามารถแสดงแท็ก HTML บางส่วนภายใน textarea (เช่น <strong>, <i>, <u>, <a>) แต่ textareas ตีความเนื้อหาของพวกเขาเป็นข้อความเท่านั้น มีวิธีง่าย ๆ โดยไม่ต้องพึ่งพาไลบรารี / ปลั๊กอินภายนอก (ฉันใช้ jQuery) หรือไม่ ถ้าไม่คุณรู้จักปลั๊กอิน jQuery ใด ๆ ที่ฉันสามารถใช้ทำสิ่งนี้ได้หรือไม่?


วิธีเดียวในการทำเช่นนั้นคือการวางมาร์กอัพ HTML ของคุณทับเนื้อหาของแท็ก textarea ผ่านเทคนิคการวางตำแหน่ง CSS ไม่มีอะไรจะช่วยให้คุณโน้มน้าวให้เบราว์เซอร์แสดงเนื้อหาที่แตกต่างออกไป (ทำไมคุณ "ต้อง" ทำเช่นนี้?)
— Pointy

ฉันแค่ต้องการให้ผู้ใช้สามารถเพิ่มสไตล์การจัดรูปแบบบางอย่างให้กับข้อความที่เขาป้อน (เช่นเมื่อคุณเขียนบทความบน Wordpress) ฉันไม่ต้องการคุณสมบัติทั้งหมดเช่นการจัดแนวข้อความเป็นต้น แต่เฉพาะแท็กพื้นฐานเหล่านั้น
— การเข้ารหัสพระภิกษุสงฆ์

คำตอบ:


234

textareaนี้เป็นไปไม่ได้จะทำอย่างไรกับ สิ่งที่คุณกำลังมองหาคือ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>


8
เป็นความอัปยศจริงที่คุณไม่สามารถใช้งานได้จริงโดยไม่ใช้จาวาสคริปต์เพื่อส่งการเปลี่ยนแปลงของคุณโดยใช้ ajax หรือคัดลอกลงในแบบฟอร์มการป้อนข้อมูล หากใครพบวิธีที่จะทำฉันจะสนใจจริงๆ!
— Ben

3
@yckart: ดีฉันไม่คิดว่ามันถูกต้องจริงแม้ว่ามันจะใช้ได้กับทุกเบราว์เซอร์ที่ฉันได้ลอง contenteditableเป็นคุณลักษณะที่แจกแจงมากกว่าแอตทริบิวต์บูลีน (มีinheritสถานะเช่นเดียวกับtrueและfalse) และฉันคิดว่าหมายความว่าการระบุค่าเป็นสิ่งที่จำเป็นแม้ว่าฉันจะไม่สามารถหาข้อมูลจำเพาะที่ชัดเจนเพื่อยืนยันสิ่งนี้ MDN ดูเหมือนจะยอมรับว่า
— Tim Down

2
@yckart: ฉันสันนิษฐานตีความเบราว์เซอร์contenteditableที่มีมูลค่าไม่เป็นเช่นเดียวซึ่งจะเป็นเช่นเดียวกับcontenteditable="" contenteditable="true"
— Tim Down

7
นี้ไม่ได้ทำงานใด ๆ textareaที่ดีกว่า การพิมพ์<strong>someting</strong>ลงไปในซอจะทำให้คุณมีข้อความตรงตามนั้น ไม่ได้ใช้ HTML
— Matt Ellen

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>


สิ่งนี้ใช้งานไม่ได้ในบางเบราว์เซอร์ที่เพิ่มสิ่งนี้เป็นโน้ตของ '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>
สิ่งนี้ทำให้textareahtml จะแสดงผล! นอกจากการกะพริบเมื่อปรับขนาดแล้วไม่สามารถใช้คลาสได้โดยตรงและต้องตรวจสอบให้แน่ใจว่า div ในsvgรูปแบบนั้นมีรูปแบบเดียวtextareaกับเครื่องหมายรูปหมวกเพื่อจัดตำแหน่งอย่างถูกต้องมันใช้งานได้!


2

ภาคผนวกของสิ่งนี้ คุณสามารถใช้อักขระเอนทิตี (เช่นเปลี่ยน<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 แล้ว
— 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 อยู่ในตำแหน่งเดียวกัน)

ในการใส่เนื้อหาของ 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>


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 ภายใน textarea A (คือ<strong>, <i>, <u>, <a>)


มันไม่ได้ใช้ textarea มันใช้ div ซึ่งไม่สามารถส่งแบบฟอร์ม
— Usman Ahmed

มันใช้งานได้กับ textarea เพียงแค่ลองให้ id กับ textarea แทนที่จะเป็น div ฉันสร้างโครงการทั้งหมดโดยใช้ textarea และ summernote มันใช้งานได้ดี!
— Fenil Shah

ประเด็นคืออะไร? มันจะทำงานเหมือนกับ ckeditor หากใช้ textarea ไม่สามารถแสดงแท็ก HTML ตามที่ถาม
— Usman Ahmed

เหตุใดฉันจึงควรใช้เครื่องมือแก้ไขแบบ WYSIWYG นี่ไม่ใช่คำตอบจริงๆขอโทษ
— Luca De Nardi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.