div 요소 내부의 텍스트를 바꾸려면 어떻게합니까?


166

DIV 요소 내에서 텍스트를 동적으로 설정해야합니다. 가장 안전한 브라우저 접근 방식은 무엇입니까? prototypejs와 scriptaculous를 사용할 수 있습니다.

<div id="panel">
  <div id="field_name">TEXT GOES HERE</div>
</div>

기능은 다음과 같습니다.

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById('field_name');
  //Make replacement here
}

허용 된 답변은 다음과 같이 텍스트를 할당 할 때 원하는 작업을 수행합니까? 이 동작이 바람직한 경우 일치하는 질문을 다시 표현할 수 있습니까?
AnthonyWJones

이것이 XSS 주입 공격에 사용될 수 있습니까?
James Westgate

답변:


49

update일반 텍스트, HTML 스 니펫 또는 toString메소드 를 정의하는 JavaScript 오브젝트를 지원 하는 프로토 타입의 메소드를 사용합니다 .

$("field_name").update("New text");

26
@Aeyoun OP는 이미 프로토 타입을 사용하고 있음을 암시하므로이 경우이를 활용하는 것이 좋습니다.
John Topley

6
나에게만 도움이되는 이유$("field_name").text("new text");
Drako

@Drako PrototypeJS를 사용하고 있습니까?
John Topley

10
@Drako 7 년 전의 원래 질문과 대답은 jQuery가 아닌 PrototypeJS에 대한 것입니다.
John Topley

255

간단하게 사용할 수 있습니다 :

fieldNameElement.innerHTML = "My new text!";

2
'정적'텍스트에 작은 따옴표를 사용해서는 안됩니까?
밀라노 Babuškov

5
PHP에서는 그렇습니다. JavaScript에서는 중요하지 않다고 생각합니다.
ceejayoz

46
Javascript에서 작은 따옴표와 큰 따옴표는 서로 바꿔 사용할 수 있습니다.
17 of 26

18
텍스트에 우연히 HTML 마크 업과 유사한 내용이 포함될 수 있으므로 잘못된 조언
Trident D' Gao

10
element.innerHTML = "<script>doSomethingMalicious()</script>";좋은 생각이 아닙니다. element.innerHTML = "& neither will this";
조셉 님드

175

2013 년 이후에이 내용을 읽는 모든 사람을 위해 업데이트되었습니다.

이 답변에는 많은 SEO가 있지만 모든 답변은 심각하게 구식이며 모든 현재 브라우저에서 즉시 사용할 수있는 작업을 수행하기 위해 라이브러리에 의존합니다.

div 요소 내부의 텍스트를 바꾸려면 모든 현재 브라우저에서 제공되는 Node.textContent를 사용하십시오.

fieldNameElement.textContent = "New text";

10
@Legolas 2 년 전 '현재 브라우저'를 작성합니다.
mikemaccana

2
감사합니다! 왜 'innerHTML'이 작동하지 않는지 궁금해하는 다른 답변을 시도하고있었습니다.
GreySage

2
HTML 마크 업을 의도적으로 삽입하지 않을 때 더 빠르고, 안전하며, 더 적합한 textContent방법 인 이유 에 대한 자세한 설명을 고려할 수 있습니다 innerHTML.
특정 성능

75

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById("field_name");
  while(fieldNameElement.childNodes.length >= 1) {
    fieldNameElement.removeChild(fieldNameElement.firstChild);
  }
  fieldNameElement.appendChild(fieldNameElement.ownerDocument.createTextNode(fieldName));
}

이런 식으로하는 것의 장점 :

  1. DOM 만 사용 하므로이 기술은 다른 언어로 이식 가능하며 비표준 innerHTML에 의존하지 않습니다.
  2. fieldName은 HTML을 포함 할 수 있으며, 이는 시도 된 XSS 공격 일 수 있습니다. 텍스트라는 것을 알고 있다면 브라우저가 HTML에 대해 구문 분석하는 대신 텍스트 노드를 작성해야합니다.

자바 스크립트 라이브러리를 사용하려는 경우 jQuery를 사용하고 다음을 수행하십시오.


  $("div#field_name").text(fieldName);

참고 것을 @AnthonyWJones '댓글이 올바른지 : "FIELD_NAME은"특히 설명 ID 또는 변수 이름이 아닙니다.


이 기술을 다른 언어로 이식 할 수 있습니까?
John Topley

DOM 구현을 가진 모든 언어가이를 지원합니다 (대부분의 언어에는 DOM 구현이 있습니다).
Quentin

이것은 내 대답보다 좋은 대답이며 정답입니다. 그래도 예제를 정리하는 것을 고려할 수 있습니다. 'fieldname'은 (는) 함수 매개 변수에 적합한 이름이 아닙니다. 실제로 요소 ID와 콘텐츠에 각각 하나씩 두 가지를 취하는 것이 가장 좋습니다. elemID, 내용
AnthonyWJones

질문 자체에서 fieldName과 ID를 빌 렸습니다.
Daniel Papasian

질문은 아마도 field_name을 사용하여 예제를 일반화했습니다. 또한 질문자는 프로토 타입은 사용할 수 있지만 jQuery는 사용할 수 없다고 언급합니다.
John Topley

17
$('field_name').innerHTML = 'Your text.';

프로토 타입의 멋진 기능 중 하나는와 $('field_name')동일한 기능을 수행한다는 것 document.getElementById('field_name')입니다. 그걸 써! :-)

프로토 타입 update기능을 사용한 John Topley의 답변 은 또 다른 좋은 솔루션입니다.


4
그것은 JavaScript처럼 보이지 않습니까?
밀라노 Babuškov

1
innerHTML을 사용하지 마십시오. 그것은 w3c 권장 사항이 아니며 일관성이 없습니다. 나쁜 스타일로 간주됩니다.
Tom

Tom, 대신 무엇을 사용해야합니까 (프로토 타입을 사용하지 않는 경우)?
밀라노 Babuškov

1
밀라노에서 더 많이 허용되는 방법은 childNodes를 반복하고 각각에서 removeNode (true)를 호출 한 다음 document.createElement () 또는 document.createTextNode ()를 사용하여 만든 새 노드를 추가하는 것입니다. 그렇게해야한다면 많은 타이핑을 피하기 위해 함수를 작성하는 것이 좋습니다.
Joel Anair

3
@RaduSimionescu 아니, 그렇지 않습니다. 이 질문과 답변은 jQuery가 아니라 Prototype.js에 관한 것입니다. 프로토 타입 $에서 ID별로 항목을 찾습니다. jQuery와 같은 선택기 기반이 아닙니다. api.prototypejs.org/dom/dollar
ceejayoz

15

빠른 답변은 innerHTML (또는 프로토 타입의 업데이트 방법과 거의 동일)을 사용하는 것입니다. innerHTML의 문제점은 할당 된 컨텐츠를 이스케이프해야한다는 것입니다. 대상에 따라 다른 코드로 수행해야합니다.

IE에서 :-

document.getElementById("field_name").innerText = newText;

FF에서 :-

document.getElementById("field_name").textContent = newText;

(실제로 FF의 코드에는 다음과 같은 내용이 있습니다)

HTMLElement.prototype.__defineGetter__("innerText", function () { return this.textContent; })

HTMLElement.prototype.__defineSetter__("innerText", function (inputText) { this.textContent = inputText; })

이제 가장 광범위한 브라우저 지원이 필요한 경우 innerText를 사용할 수 있습니다.이 솔루션은 완벽한 솔루션은 아니지만 rawHTML에서 innerHTML을 사용하지 않습니다.


7

중단 한 곳에서 계속 진행하기를 원한다면 다음을 수행 할 수 있습니다.

if (fieldNameElement)
    fieldNameElement.innerHTML = 'some HTML';

5

nodeValue는 또한 사용할 수있는 표준 DOM 속성입니다.

function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);
  if(fieldNameElement.firstChild)
    fieldNameElement.firstChild.nodeValue = "New Text";
}


1

사이트에서 많은 JavaScript를 사용하려는 경향이있는 경우 jQuery를 사용하면 DOM을 매우 간단하게 사용할 수 있습니다.

http://docs.jquery.com/Manipulation

$ ( "# field-name"). text ( "일부 새로운 텍스트.");


프로토 타입은 유사한 유틸리티 기능을 가지고 있습니다.
ceejayoz


0
function showPanel(fieldName) {
  var fieldNameElement = document.getElementById(field_name);

  fieldNameElement.removeChild(fieldNameElement.firstChild);
  var newText = document.createTextNode("New Text");
  fieldNameElement.appendChild(newText);
}

노드를 교체 한 다음 제거하고 두 개의 별도 작업으로 새 노드를 추가하는 것이 좋습니다.
Quentin

0

다음은 쉬운 jQuery 방법입니다.

var el = $('#yourid .yourclass');

el.html(el.html().replace(/Old Text/ig, "New Text"));

이것은 나쁜 생각처럼 보입니다-요소에 동일한 텍스트를 가진 하위 노드가 포함되어 있거나 텍스트가 요소 태그 이름의 일부와 일치하면 어떻게됩니까? .text 만 사용하지 않습니까?
제임스 웨스트 게이트

제임스 웨스트 게이트에 전적으로 동의합니다.
TGarrett

0

HTML에서 이것을 넣어

<div id="field_name">TEXT GOES HERE</div>

자바 스크립트에서 이것을 넣어

var fieldNameElement = document.getElementById('field_name');
        if (fieldNameElement)
        {fieldNameElement.innerHTML = 'some HTML';}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.