แสดง 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.