'innerText'는 IE에서는 작동하지만 Firefox에서는 작동하지 않습니다.


289

다음을 포함하는 IE에서 작동하는 JavaScript 코드가 있습니다.

myElement.innerText = "foo";

그러나 Firefox에서 'innerText'속성이 작동하지 않는 것 같습니다. Firefox에 상응하는 것이 있습니까? 아니면 더 일반적인 크로스 브라우저 속성을 사용할 수 있습니까?


3
이렇게해야합니다. myElement.innerHTML = "foo";
stefita

그러면 객체 내의 모든 HTML이 제공된 값으로 바뀝니다.
OMG Ponies

24
jQuery와 같은 라이브러리는 표준 프레임 워크를 사용할 수있게함으로써 이와 같은 브라우저 간 불일치를 처리 할 때보다 편리하게 사용할 수 있습니다.
Dan Diplo

그러나 처리 할 HTML이없는 경우에도 여전히 적합 할 수 있습니다.
Alex Polo

21
따라서 가능하지 않다고 말하는 대신이 교차 브라우저 대안을 사용하는 방법을 알려주십시오.
SasQ

답변:


249

Firefox는 W3C 호환 textContent 속성을 사용합니다 .

Safari와 Opera 도이 속성을 지원한다고 생각합니다.



2
@Bob 2016 년 2 월 22 일 현재는 그렇지 않습니다.
krillgar

@krillgar 3 월 8 일 주에 출시 될 예정인 Firefox 45로 예정되어 있습니다. 이미 베타 버전으로 출시되었으며 한동안 오로라에있었습니다. 이것이 실제로 의미하는 것은 innerText단지 사용하여 사이트를 개발할 수 있고 가까운 장래에 모든 현재 브라우저에서 작동 할 것으로 예상 할 수 있다는 점입니다.
Bob

1
FTR은 : innerText입니다 근본적으로 다른 에서 textContent, 실제로 (추정 된 IE의 특질 ...에서 놀라 울 정도로) 매우 유용하다 : innerText시도는 텍스트가되는 방법의 근사치 제공하기 위해 실제로 발표 완전히 달리 브라우저를 textContent, 어느 단지에 대한 반환 한 태그 제거 된 마크 업 소스 , 가치가 거의 없거나 단어 경계 상실과 같은 추가 문제가 발생합니다.
Sz.

innerText는 2019 년 버전 64에서 여전히 지원되지 않습니다.
Tony Dong

285

업데이트 : 모든 차이점을 자세히 설명 하는 블로그 게시물을 작성했습니다 .


Firefox는 W3C 표준을 사용 Node::textContent하지만 그 동작은 MSHTML 소유의 동작과 약간 다릅니다 innerText( 오랫 동안 수십 가지 다른 MSHTML 기능 중에서 Opera에 의해 복사 됨).

우선, textContent공백 표현은 innerText하나 와 다릅니다 . 둘째, 더 중요한 것은 textContent 모든 SCRIPT 태그 내용 을 포함하지만 innerText는 포함하지 않습니다.

표준 구현 외에 - 그냥, 오페라를 즐겁게하고 더 일을 만들기 위해 textContent- 또한 MSHTML의를 추가하기로 결정 innerText 하지만이 역할을 변경textContent - 즉, 스크립트 내용을 포함하여 (사실, textContent그리고 innerText오페라는, 동일한 결과를 생성하는 것 아마 서로 별칭되는) .

textContent의 일부인 Node반면 인터페이스의 innerText일부입니다 HTMLElement. 예를 들어 이것은 텍스트 노드에서 "검색"할 수 textContent있지만 다음을 의미합니다 innerText.

var el = document.createElement('p');
var textNode = document.createTextNode('x');

el.textContent; // ""
el.innerText; // ""

textNode.textContent; // "x"
textNode.innerText; // undefined

마지막으로 Safari 2.x에는 버그 innerText구현이 있습니다. Safari에서 innerText요소가 style.display == "none"문서 를 통해 숨겨 지거나 (연결되지 않은) 경우에만 올바르게 작동합니다 . 그렇지 않으면 innerText빈 문자열이됩니다.

나는 textContent(이 결함을 해결하기 위해) 추상화 로 놀고 있었지만 다소 복잡 하다는 것이 밝혀졌습니다 .

가장 좋은 방법은 먼저 정확한 요구 사항을 정의 하고 거기서부터 따르는 것입니다. 가능한 innerHTML모든 textContent/ innerText편차를 처리하는 대신 요소에서 태그를 제거하는 것이 종종 가능합니다 .

물론 다른 가능성은 DOM 트리를 걷고 텍스트 노드를 재귀 적으로 수집하는 것입니다.


35
Chrome은 innerText도 지원하므로 Firefox가 지원하지 않는 유일한 주요 브라우저 인 것 같습니다. 그리고 IE는 textContent를 지원하지 않는 유일한 브라우저입니다.
mike nelson 5

7
@mike-그러나 innerTextChrome 에서 사용하는 속도가 60 배 느립니다 . jsperf.com/text-content/3
gblazex

8
textContent현재는 IE9 +에서 지원되지만 Firefox는 여전히 지원하지 않습니다 innerText(단, outerHTML며칠 전에 IE가 추가 된 IE를 추가했지만 ).
kangax

1
여전히 IE8을 지원 해야하는 사람들을 위해 github.com/usmonster/aight/blob/node-textcontent-shim/js/…Node.textContent 에서 꽤 완벽한 shim이 진행 중입니다 (곧 aight에 포함될 예정입니다 ).
Noyo


83

텍스트 내용 만 설정하고 검색하지 않아도되는 경우 모든 브라우저에서 사용할 수있는 간단한 DOM 버전이 있습니다. IE innerText 확장 또는 DOM Level 3 Core textContent 속성이 필요하지 않습니다.

function setTextContent(element, text) {
    while (element.firstChild!==null)
        element.removeChild(element.firstChild); // remove all existing content
    element.appendChild(document.createTextNode(text));
}

JavaScript에 "! =="연산자가 없다면 두 번째 줄의 연산자는 "! ="이어야합니다.
RexE

23
@RexE : JavaScript에는 !==연산자의 역수가 ===있습니다. ===/ !==에 의해 사용되는 유형별 비교 는 일반적으로 느슨한 비교기 ==/에 비해 바람직합니다 !=.
bobince

인터넷 익스플로러에서는 스크립트 태그의 텍스트를 설정하지 못합니다 (템플릿에 사용하고있었습니다). `scriptTagElement.text = 'my template {{here}}';을 설정했습니다.
Christopher Tarquini

나는 생각했다 매우 당신이 루프를 사용하는 이유를 이해하기 어려운 (그리고 나는 버릴 것 !==null대신에 루프 교체의 완전 그런데)를 element.innerHTML=''루프와 동일한 작업을 수행 할 스펙을 갖추고 다음 내가 기억된다 (.. . (legacy-) ... IE의 테이블 ericvasilik.com/2006/07/code-karma.html는 I은 "숨겨진"거의 간단한 설명 첨가하지 않을까 결코 의 설명 없음 "부작용" createTextNode교체 앰프를 LT 그리고 그 각각의 HTML 문자 엔터티에 gt? 그것의 정확한 행동에 대한 링크는 웅장 할 것입니다!
GitaarLAB

26

jQuery.text()모든 브라우저에서 사용할 수 있는 방법을 제공 합니다. 예를 들면 다음과 같습니다.

$('#myElement').text("Foo");

22

Prakash K의 답변에 따르면 Firefox는 innerText 속성을 지원하지 않습니다. 따라서 사용자 에이전트가이 특성을 지원하는지 여부를 테스트하고 다음과 같이 진행할 수 있습니다.

function changeText(elem, changeVal) {
    if (typeof elem.textContent !== "undefined") {
        elem.textContent = changeVal;
    } else {
        elem.innerText = changeVal;
    }
}

2
elem의 'textContent'는 더 간단 할 것입니다.
Jamie Pate

if (elem.textContent! = null)도 더 쉬울 것입니다!
Elmue

14

정말 간단한 자바 스크립트 줄은 모든 기본 브라우저에서 "taggy"텍스트를 얻을 수 있습니다.

var myElement = document.getElementById('anyElementId');
var myText = (myElement.innerText || myElement.textContent);

2
이것에 문제가 있습니다 (적어도 IE8에서는) : innerText가 비어 있고 textContent가 정의되어 있지 않으면 (myElement.innerText || myElement.textContent) 정의되지 않습니다.
Magnus

1
잘 @Magnus 지적한 버그로, 그것은이 있다는 사실을 인식하고도 가치가 얼마나 유의 한 차이 textContentinnerText공백 보고서 가 일부 사용하는 경우에 문제가 있습니다가.
Mark Amery

2
간단하게 다른 추가 ||예 : var myText = (myElement.innerText || myElement.textContent || "") ;정의되지 않은 값을 극복 할 수 있습니다.
PeterM

6

Element::innerText속성 에는 Chrome에서 CSS 스타일 " " 로 숨겨진 텍스트가 포함 되지 않습니다display:none (글꼴 크기 : 0, 색상 : 투명도 및 기타 CSS 기술에 의해 마스크 된 내용도 삭제됨) 텍스트가 눈에 띄게 렌더링되지 않도록하는 몇 가지 다른 유사한 효과).

다른 CSS 속성도 고려됩니다.

  • 먼저 내부 요소의 "display :"스타일이 구문 분석되어 블록 컨텐츠 (예 : 브라우저의 내장 스타일 시트에서 HTML 블록 요소의 기본값 인 "display : block")를 구분하는지 여부를 판별합니다. 자신의 CSS 스타일); 그렇다면 innerText 속성 값에 줄 바꿈이 삽입됩니다. textContent 속성에서는 발생하지 않습니다.
  • 인라인 내용을 생성하는 CSS 속성도 고려됩니다. 예를 들어 <br \>인라인 개행을 생성하는 인라인 요소 는 innerText 값으로 개행을 생성합니다.
  • "display : inline"스타일은 textContent 또는 innerText에 줄 바꿈을 일으키지 않습니다.
  • "display : table"스타일은 테이블 주위와 테이블 행 사이에 줄 바꿈을 생성하지만 "display : table-cell"은 테이블 문자를 생성합니다.
  • "position : absolute"속성 (display : block 또는 display : inline과 함께 사용하더라도 중요하지 않음)으로 인해 줄 바꿈이 삽입됩니다.
  • 일부 브라우저에는 범위 사이에 단일 공간 분리가 포함됩니다.

그러나 Element::textContent내부 텍스트 요소의 모든 내용은 보이지 않는 경우에도 적용된 CSS에 독립적으로 포함됩니다. 또한 textContent에는 추가 줄 바꿈이나 공백이 생성되지 않습니다. textContent는 모든 스타일과 구조 및 인라인 / 블록 또는 내부 요소의 위치 유형을 무시합니다.

마우스 선택을 사용하여 복사 / 붙여 넣기 작업을 수행하면 숨겨진 텍스트가 클립 보드에있는 일반 텍스트 형식으로 삭제되므로에있는 모든 내용은 포함되지 않고 안에 포함 된 내용 textContent만 포함 됩니다 innerText(위의 공백 / 개행 생성 후). .

그러면 Chrome에서 두 속성이 모두 지원되지만 내용이 다를 수 있습니다. 이전 브라우저는 여전히 textContent에 포함 된 것과 같은 모든 것을 여전히 innetText에 포함했습니다 (그러나 공백 / 줄 바꿈 생성과 관련한 동작은 일관성이 없었습니다).

jQuery는 $ () 쿼리를 통해 반환하는 구문 분석 된 요소에 추가 된 ".text ()"메소드를 사용하여 브라우저 간의 이러한 불일치를 해결합니다. 내부적으로는 "노드"레벨에서만 작동하는 HTML DOM을 조사하여 어려움을 해결합니다. 따라서 표준 textContent와 유사한 것을 반환합니다.

이 jQuery 메소드는 <br />컨텐츠의 하위 요소 (예 :)로 인해 화면에 표시 될 수있는 추가 공백이나 줄 바꿈을 삽입하지 않는다는 점에주의해야 합니다.

접근성을 위해 일부 스크립트를 디자인하고 점자 리더와 통신하는 데 사용되는 플러그인과 같이 비 청각 렌더링을 위해 스타일 시트를 구문 분석하는 경우이 도구는 스타일 범위에 추가 된 특정 문장 부호를 포함해야하는 경우 textContent를 사용해야합니다 "display : none"이며 일반적으로 페이지에 포함되어 있으며 (예 : 위첨자 / 첨자), 그렇지 않으면 innerText가 점자 독자에게 매우 혼란 스러울 수 있습니다.

CSS 트릭으로 숨겨진 텍스트는 일반적으로 HTML / CSS 파서 및 DOM 속성을 사용하여 주요 검색 엔진 (HTML 페이지의 CSS를 구문 분석하고 백그라운드에서 대비되는 색상이 아닌 텍스트를 무시 함)에 의해 무시됩니다. "innerText"는 최신 비주얼 브라우저에서와 동일합니다 (적어도이 보이지 않는 컨텐츠는 색인화되지 않으므로 숨겨진 텍스트는 페이지에 일부 키워드를 포함시켜 컨텐츠를 점검하도록하는 트릭으로 사용될 수 없습니다). 그러나이 숨겨진 텍스트는 추가 스타일과 스크립트를 제거하기 위해 전체 HTML 대신 "textContent"속성을 사용하여 결과 페이지 (결과에 포함 할 색인에서 페이지가 여전히 규정 된 경우)에 여전히 표시됩니다.

이 두 속성 중 하나에 일반 텍스트를 할당하면 내부 마크 업과 적용된 스타일을 덮어 쓰게되며 (할당 된 요소 만 해당 유형, 속성 및 스타일을 유지함) 두 속성에 동일한 내용이 포함됩니다 . 그러나 일부 브라우저는 이제 innerText에 대한 쓰기를 더 이상 존중하지 않으며 textContent 속성을 덮어 쓸 수만 있습니다 (HTML 특수 문자가 문자 참조를 사용하여 문자 그대로 표시되도록 HTML 특수 문자가 올바르게 인코딩되므로 이러한 속성에 쓸 때 HTML 마크 업을 삽입 할 수 없음) , 당신은 다음 읽으면 innerHTML의 할당 후 재산 innerText또는 textContent.


1
실제로 "font-size : 0", "color : transparent", "opacity : 0", "text-indent : -9999px"등이 모두 Chrome / WebKit 's에 포함되어 innerText있습니다. 내 테스트에서는 "display : none"및 "visibility : hidden"만 무시됩니다.
kangax

5
myElement.innerText = myElement.textContent = "foo";

편집 (아래 주석에 Mark Amery에게 감사드립니다) : jQuery 와 같이 이러한 속성의 존재를 확인하는 데 코드가 의존하지 않는다는 합리적인 의심을 알고있는 경우에만이 방법을 사용하십시오 . 그러나 jQuery를 사용하는 경우 "text"함수를 사용하고 다른 답변에서 볼 수 있듯이 $ ( '# myElement'). text ( 'foo')를 수행하십시오.


4
-1; 이것은 나쁜 생각입니다. jQuery와 같은 라이브러리의 코드를 포함하여 코드에서 사용할 속성을 결정하기 위해 innerText또는 textContent속성이 있는지 확인하는 것은 매우 일반적입니다 . 둘 다 문자열로 설정하면 요소에서 작동하는 다른 사람의 코드가 브라우저가 두 속성을 모두 지원한다는 것을 실수로 감지하게됩니다. 결과적으로 해당 코드는 오작동하기 쉽습니다.
Mark Amery

JQuery $ ( '# myElement'). val ()은 크로스 브라우저에서 작동합니다.
Tony Dong

4

innerTextFirefox에 추가되었으며 FF45 릴리스에서 사용할 수 있습니다 : https://bugzilla.mozilla.org/show_bug.cgi?id=264412

초안 사양이 작성되었으며 향후 HTML 생활 표준에 통합 될 것으로 예상됩니다 : http://rocallahan.github.io/innerText-spec/ , https://github.com/whatwg/html/issues/ 465

현재 Firefox, Chrome 및 IE 구현은 모두 호환되지 않습니다. 앞으로는 IE, Firefox, Chrome 및 Edge가 수렴 될 것으로 예상되지만 이전 IE는 호환되지 않습니다.

참조 : https://github.com/whatwg/compat/issues/5


사용 가능한 폴리 필이 있습니까?
serv-inc

1
@user 정말 필요한 것에 달려 있습니다. 이전 버전의 Firefox를 지원할 필요가없고 구현상의 사소한 차이점에 신경 쓰지 않으려면을 사용하십시오 innerText. 경우 textContent허용 대체이며 오래된 FX는을 지원해야하고 사용 (innerText || textContent). 모든 브라우저에서 동일한 구현을 원한다면이에 대한 특정 polyfill이 있다고 생각하지 않지만 일부 프레임 워크 (예 : jQuery)는 이미 비슷한 것을 구현할 수 있습니다.이 페이지의 다른 답변을 참조하십시오.
Bob

1
의 기능 innerText, 즉 : Firefox에서 페이지에 보이는 텍스트> = 38 (애드온의 경우) 최소한 <script>태그는 완전히 생략해야합니다. jQuery가 $('#body').text()작동하지 않았습니다. 그러나 해결 방법으로innerText || textContent 은 괜찮습니다. 감사합니다.
serv-inc

@user 예, Fx 38을 지원해야하는 경우에는이 답변이 실제로 적용되지 않습니다. 당신은 한계 / 차이와 함께 살아야합니다textContent .
Bob

1

이런 건 어때?

//$elem is the jQuery object passed along.

var $currentText = $elem.context.firstChild.data.toUpperCase();

** 나는 대문자를 만들어야했다.


1
랩 솔루션; 요소에 하나 이상의 텍스트 노드가 포함되어 있으면 작동하지 않습니다.
Mark Amery


0

이것은 내 경험이었다 innerText, textContent, innerHTML, 및 값 :

// elem.innerText = changeVal;  // works on ie but not on ff or ch
// elem.setAttribute("innerText", changeVal); // works on ie but not ff or ch
// elem.textContent = changeVal;  // works on ie but not ff or ch
// elem.setAttribute("textContent", changeVal);  // does not work on ie ff or ch
// elem.innerHTML = changeVal;  // ie causes error - doesn't work in ff or ch
// elem.setAttribute("innerHTML", changeVal); //ie causes error doesn't work in ff or ch
   elem.value = changeVal; // works in ie and ff -- see note 2 on ch
// elem.setAttribute("value", changeVal); // ie works; see note 1 on ff and note 2 on ch

즉 = 인터넷 익스플로러, ff = 파이어 폭스, ch = 구글 크롬. 참고 1 : ff는 백 스페이스로 값을 삭제 한 후까지 작동합니다. 위의 Ray Vega 참고 참고 2 : 크롬에서 다소 작동합니다-업데이트 후에는 변경되지 않은 다음 클릭하고 필드를 다시 클릭하면 값이 나타납니다. 많은 것이 최고입니다 elem.value = changeVal; 나는 위에서 언급하지 않았습니다.


1
나 뿐인가요 ? 또는 OP 질문을 절대 무시하지 않습니까? 그는 innerText / textContent를 요청했으며 대부분 입력에 대해 이야기하고 있습니다.
Dementic

이 답변은 읽기가 매우 어렵습니다. 반면에, 내용을 정리할 가치가 충분하다고 확신하지 않습니다.
Mark Amery

-1

원래 게시물 아래의 댓글에서 다시 게시하면됩니다. innerHTML은 모든 브라우저에서 작동합니다. 고마워 stefita.

myElement.innerHTML = "foo";


1
-1; 할당하는 텍스트에 태그 나 다른 HTML 구문이 포함되어 있지 않다는 것을 확신 할 수 없다면 / innerHTML은 적절한 대체 방법 이 아닙니다. 사용자가 제공 한 데이터에 대해서는 반드시 그 보장이 없습니다. XSS 보안 허점으로 이어질 수 있으므로 이러한주의없이이 방법을 사용하는 것은 위험 합니다. 사용 가능한 안전한 접근 방법이 너무 많기 때문에이를 고려할 이유가 없습니다. textContentinnerText
Mark Amery

Mark, 내 이해는 innerHTML이 div, span, p와 같은 html 요소에 데이터를 쓰는 일반적인 방법이라는 것입니다. 반환 된 JSON 데이터를 처리하는 데 사용합니다. 그것은 ... 너무, JQuery와에 있어요
레오 니드 Alzhin에게

1
JSON 응답에서 임의의 문자열을 가져 와서 요소에 할당하면 .innerHTML코드가 손상되어 잠재적으로 XSS에 취약합니다. 해당 문자열이 "<script>alert(1)</script>"무엇입니까?
Mark Amery

1
@MarkAmery : HTML5 는 <script>통해 삽입 된 태그 innerHTML가 실행되지 않도록 지정합니다 . 그러나 이것이 구형 브라우저를 보호하지는 않습니다. 또한 HTML5 innerHTML는 예를 들어 보호하지 않습니다 "<img src='x' onerror='alert(1)'>".
GitaarLAB

-1

이것을 여기에서 찾았습니다 :

<!--[if lte IE 8]>
    <script type="text/javascript">
        if (Object.defineProperty && Object.getOwnPropertyDescriptor &&
            !Object.getOwnPropertyDescriptor(Element.prototype, "textContent").get)
          (function() {
            var innerText = Object.getOwnPropertyDescriptor(Element.prototype, "innerText");
            Object.defineProperty(Element.prototype, "textContent",
              { // It won't work if you just drop in innerText.get
                // and innerText.set or the whole descriptor.
                get : function() {
                  return innerText.get.call(this)
                },
                set : function(x) {
                  return innerText.set.call(this, x)
                }
              }
            );
          })();
    </script>
<![endif]-->

약간의 설명이 좋을 것입니다! 또한 여기에는 이상한 똥이 있습니다. 왜 IE> = 9가 기본적으로 지원할textContent 때 조건부 주석을 사용하여 IE 8만을 대상으로하지 않고 IE> = 8로 실행을 제한 합니까? 그것은 이후 있음을 주목할 가치 innerTexttextContent다른 동작을 위의 코드가 충실하지 textContent심 -이 반드시 명백한 잠재적으로 중요하지만,하지 않습니다!
Mark Amery

결함을 지적 주셔서 감사합니다, 그것은 <= 8 IE 될하고자 하였다
simonarame

-2

innerText다른 브라우저에서 동작 을 에뮬레이트 할 수도 있습니다 .

 if (((typeof window.HTMLElement) !== "undefined") && ((typeof HTMLElement.prototype.__defineGetter__) !== "undefined")) {
     HTMLElement.prototype.__defineGetter__("innerText", function () {
         if (this.textContent) {
             return this.textContent;
         } else {
             var r = this.ownerDocument.createRange();
             r.selectNodeContents(this);
             return r.toString();
         }
     });
     HTMLElement.prototype.__defineSetter__("innerText", function (str) {
         if (this.textContent) {
             this.textContent = str;
         } else {
             this.innerHTML = str.replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;').replace(/\n/g, "<br />\n");
         }
     });
 }

내 머리 꼭대기에서 문제를 찾으려면 세터가 pre줄 바꿈을 두 배로 늘리기 때문에 s 가 깨졌습니다 . 여기에 더 잘못된 것이 있다고 생각합니다.
Mark Amery
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.