你可能知道,獲取和設定 DOM 元素內部文字可以用這兩個屬性:Node.textContent
和 Element.innerText
。
乍一看,它們似乎做著完全相同的事情,但它們之間有一些微妙但重要的區別。今天,我們來看看它們的作用,以及它們的異同之處。
廢話不說,直接看程式碼。
相同之處
比如下面這個 DOM 元素。
<p id="sandwich">I love a good tuna sandwich!</p>
Node.textContent
和Element.innerText
屬性都能獲取#sandwich
元素內部的文字。
let sandwich = document.querySelector('#sandwich');
// returns "I love a good tuna sandwich!"
let text1 = sandwich.textContent;
// also returns "I love a good tuna sandwich!"
let text2 = sandwich.innerText;
如果元素內部還有其他標籤,它們都會忽略。
<p id="sandwich">I love a good <strong>tuna</strong> sandwich!</p>
// returns "I love a good tuna sandwich!"
let textHTML1 = sandwich.textContent;
// also returns "I love a good tuna sandwich!"
let textHTML2 = sandwich.innerText;
另外,這兩個屬性都能用於設定元素內部文字。
// 替換文字
// <p id="sandwich">Hello, world!</p>
sandwich.textContent = 'Hello, world!';
// 也可以追加
// <p id="sandwich">Hello, world! And hi, Universe!</p>
sandwich.innerText += ' And hi, Universe!';
不同之處
看上去做著同樣的事情,那麼它們有什麼區別?
Node.textContent
屬性獲取全部文字內容,包括元素內部那些未渲染到頁面的內容。Element.innerText
只返回渲染出來的文字,類似於可以用游標和鍵盤選中的文字部分。
舉個例子就清楚了。
<div class="greeting">
<style type="text/css">
p {
color: rebeccapurple;
}
</style>
<p hidden>This is not rendered.</p>
<p>Hello world!</p>
</div>
let greeting = document.querySelector('.greeting');
/* 返回
p {color: rebeccapurple;}
This is not rendered.
Hello world!
*/
let text1 = greeting.textContent;
// 返回 "Hello world!"
let text2 = greeting.innerText;
這下總算知道區別了!又躺學了一個知識點~
本文首發於公眾號 1024譯站