텍스트 영역 내에서 HTML 렌더링


146

텍스트 영역 (예 : <strong>, <i>, <u>, <a>) 내에 일부 HTML 태그를 렌더링 할 수 있어야하지만 텍스트 영역은 내용을 텍스트로만 해석합니다. 외부 라이브러리 / 플러그인 (jQuery를 사용하고 있음)에 의존하지 않고 쉽게 할 수 있습니까? 그렇지 않은 경우이 작업을 수행하는 데 사용할 수있는 jQuery 플러그인을 알고 있습니까?


이를 수행하는 유일한 방법은 CSS 포지셔닝 트릭을 통해 텍스트 영역 태그의 내용 위에 HTML 마크 업을 오버레이하는 것입니다. 브라우저가 텍스트 영역 내용을 다르게 렌더링하도록 설득하는 데 도움이되지 않습니다. (왜 이렇게해야합니까?)
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
자바 스크립트를 사용하지 않고 실제로 이것을 사용하여 아약스를 사용하여 변경 사항을 제출하거나 양식 입력으로 복사 할 수 없다는 것은 부끄러운 일입니다. 누군가 그것을 할 수있는 방법을 찾았다면 정말 관심이있을 것입니다!

3
@ yckart : 글쎄, 그것이 시도한 모든 브라우저에서 작동하더라도 실제로는 유효하지 않다고 생각합니다. contenteditable 부울 속성이 아닌 열거 된 속성 이며 ( 및 inherit상태가 true있으며 false) 값을 지정하는 것이 필수임을 의미 한다고 생각 합니다.이 사양을 확인하기 위해 사양의 결정적인 비트를 찾을 수는 없습니다. MDN 은 동의하는 것 같습니다 .
팀 다운

2
@ yckart : 브라우저 contenteditable가와 같은 값으로 해석 하지 않는다고 가정 contenteditable=""했습니다 contenteditable="true".
팀 다운

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

흠. 해당 문자열을 html 문서에 직접 복사하여 붙여 넣었으며 Chrome 버전 48.0.2552.0 dev (64 비트) OS X 10.11.1에서 마크 업을 올바르게 렌더링합니다. 버전 문제 일 수 있습니다.
axlotl


0

나는 같은 문제가 있지만 그 반대의 해결책은 다음과 같습니다. div의 html을 텍스트 영역에 넣고 싶습니다. 그래서 웹 사이트에서 반응을 편집 할 수 있습니다. 텍스트 영역을 같은 위치에두고 싶습니다.)

이 div의 내용을 텍스트 영역에 넣으려면 다음을 사용하십시오.

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를 사용합니다.
Usman Ahmed

textarea와 함께 작동하므로 div 대신 id를 textarea에 제공하십시오. textarea와 summernote를 사용하여 전체 프로젝트를 만들었습니다. 잘 작동합니다!
Fenil Shah

점은 무엇인가? textarea가 사용되면 ckeditor와 동일하게 작동합니다. 요청한대로 HTML 태그를 렌더링 할 수 없습니다.
Usman Ahmed

왜 WYSIWYG 편집기를 사용해야합니까? 이것은 실제로 대답이 아닙니다. 죄송합니다.
Luca De Nardi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.