innerText와 textContent는 돔 요소의 text 값을 get하거나 set하는데 사용한다. 핵심 역할로는 상당히 비슷한 기능을 하는 이 두 프로퍼티는 어떤 차이가 있을까? 한번 알아 봅시다!
The innerText property of the HTMLElement interface represents the "rendered" text content of a node and its descendants. in mdn(https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText)
요소와 요소의 모든 후손을 포함하여 렌더링된 텍스트 콘텐트. 렌더링이 되지 않은 경우, textContent와 동일하게 동작한다.
<p id="source">
<span style="display:none">HIDDEN TEXT</span>
</p>
const source = document.getElementById("source");
source.textContent; // HIDDEN TEXT
source.innerText; // undefined
jest에서 snapshot test를 할 때도 렌더링이 되지 않기 때문에 innerText를 사용하는 경우 제대로된 테스트를 할 수 없다. 아래 예시는 text가 바뀌어도 test가 통과되는 모습니다. 이 문제를 해결하려면 textContent를 사용하거나 혹은 puppeteer를 추가로 사용하는 방법이 있다. puppeteer는 추후에 학습후 포스팅할 예정이다.
function createItem(text) {
const result = document.createElement('p');
result.innerText = text;
return result;
}
test("createTodoItem('hello')", () => {
expect(createTodoItem("hello")).toMatchSnapshot();
});
exports[`createTodoItem('world') 1`] = `
<p></p>
`;
test("createTodoItem('world')", () => {
expect(createTodoItem("world")).toMatchSnapshot();
});
exports[`createTodoItem('world') 1`] = `
<p></p>
`;
1.Node가 document 혹은 doctype인 경우 null을 반환한다.
Note: document의 모든 text, CDATA를 취득하기 위해서는 documentElement.textContent를 사용해라.
2. Node가 CDATA section(parsing 되지 않을 Charactor-문자), 주석, ProcessingInstruction, text node 이면 Node.nodeValue를 반환한다.
3. 그 외에는 주석, processing instructions를 제외한 모든 자식 노드의 textContent를 취득하여 하나로 합친 string 값을 반환한다.
<script>, <style>
을 포함하여 모든 elements를 취급하지만, innerText는 사람이 읽을 수 있는 elements만을 취급한다.