Sự khác biệt giữa InternalText và InternalHTML


256

Sự khác nhau giữa là gì innerHTML, innerTextchildNodes[].valuetrong JavaScript?


4
@tymeJV Thành thật mà nói, sự khác biệt với innerText, việc triển khai textContext không chuẩn của MSIE, là không tầm thường.
fny

4
Ngoài việc InternalText không hoạt động trong Firefox: textContent dường như hoạt động trong tất cả các trình duyệt chính, vì vậy chỉ cần sử dụng textContent thay vì InternalText.
auco

5
LƯU Ý QUAN TRỌNG: 3 ý kiến ​​trên không còn hiệu lực. innerTextđã được thêm vào các tiêu chuẩn và được hỗ trợ bởi tất cả các trình duyệt chính. textContenthiện được IE> = 9 hỗ trợ và có thể được sử dụng thay vì innerTexttrong hầu hết các trường hợp (phần thưởng, nó nhanh hơn nhiều), nhưng có sự khác biệt giữa hai loại, vì vậy trong một số trường hợp bạn không thể trao đổi chúng.
Racil Hilan

3
Cập nhật 2019: innerTextđược hỗ trợ tốt trong tất cả các trình duyệt. Firefox bắt đầu hỗ trợ nó từ phiên bản 45. caniuse.com/#search=innertext
Aditya Gupta

Tôi ngạc nhiên rằng an ninh không được giải quyết ở đây. innerHTML là một lỗ hổng được biết đến cho các cuộc tấn công XSS. Điều đó nói rằng, innerTextcũng không an toàn 100%. stackoverflow.com/questions/52707031/does-innertext-prevent-xss blog.cloudboost.io/ Kẻ
davidhartman00

Câu trả lời:


147

innerTextTuy nhiên, không giống như , innerHTMLcho phép bạn làm việc với văn bản có định dạng HTML và không tự động mã hóa và giải mã văn bản. Nói cách khác, innerTextlấy và đặt nội dung của thẻ dưới dạng văn bản thuần túy, trong khi innerHTMLlấy và đặt nội dung ở định dạng HTML.


7
Rất quan trọng để dán vào đây trong câu trả lời được chấp nhận @ bình luận của jor bên dưới trong một câu trả lời khác: "Chỉ cần rõ ràng: Điều này chỉ áp dụng khi THIẾT LẬP một giá trị. Khi bạn NHẬN các thẻ HTML giá trị bị tước và bạn sẽ có được văn bản đơn giản."
Heitor

261

Các ví dụ dưới đây đề cập đến đoạn mã HTML sau:

<div id="test">
   Warning: This element contains <code>code</code> and <strong>strong language</strong>.
</div>

Nút sẽ được tham chiếu bởi JavaScript sau:

var x = document.getElementById('test');


element.innerHTML

Đặt hoặc lấy cú pháp HTML mô tả hậu duệ của phần tử

x.innerHTML
// => "
// =>   Warning: This element contains <code>code</code> and <strong>strong language</strong>.
// => "

Đây là một phần của Đặc tả phân tích và tuần tự hóa DOM của W3C . Lưu ý đó là một tài sản của Elementcác đối tượng.


node.innerText

Đặt hoặc lấy văn bản giữa các thẻ bắt đầu và kết thúc của đối tượng

x.innerText
// => "Warning: This element contains code and strong language."
  • innerTextđược Microsoft giới thiệu và trong một thời gian không được Firefox hỗ trợ. Vào tháng 8 năm 2016, innerTextđã được WHATWG thông qua và được thêm vào Firefox vào năm 45.
  • innerText cung cấp cho bạn một văn bản, đại diện cho văn bản cố gắng khớp với những gì được trình duyệt hiển thị trong điều này có nghĩa là:
    • innerTextáp dụng text-transformwhite-spacequy tắc
    • innerText cắt khoảng trắng giữa các dòng và thêm ngắt dòng giữa các mục
    • innerText sẽ không trả lại văn bản cho các mục vô hình
  • innerTextsẽ trả về textContentcác phần tử không bao giờ được hiển thị như thế nào <style />và `
  • Tài sản của Nodecác yếu tố


node.textContent

Gets hoặc đặt nội dung văn bản của một nút và hậu duệ của nó.

x.textContent
// => "
// =>   Warning: This element contains code and strong language.
// => "

Mặc dù đây là tiêu chuẩn W3C nhưng nó không được IE <9 hỗ trợ.

  • Không biết về kiểu dáng và do đó sẽ trả về nội dung bị ẩn bởi CSS
  • Không kích hoạt một dòng chảy lại (do đó hiệu suất cao hơn)
  • Tài sản của Nodecác yếu tố


node.value

Điều này phụ thuộc vào yếu tố mà bạn đã nhắm mục tiêu. Đối với ví dụ trên, xtrả về một đối tượng HTMLDivE bổ sung , không có thuộc valuetính được xác định.

x.value // => null

Các thẻ đầu vào ( <input />), ví dụ, xác định một thuộc valuetính , tham chiếu đến "giá trị hiện tại trong điều khiển".

<input id="example-input" type="text" value="default" />
<script>
  document.getElementById('example-input').value //=> "default"
  // User changes input to "something"
  document.getElementById('example-input').value //=> "something"
</script>

Từ các tài liệu :

Lưu ý: đối với một số loại đầu vào, giá trị trả về có thể không khớp với giá trị mà người dùng đã nhập. Ví dụ: nếu người dùng nhập một giá trị không phải là số vào một <input type="number">, thay vào đó giá trị được trả về có thể là một chuỗi rỗng.


Kịch bản mẫu

Đây là một ví dụ cho thấy đầu ra cho HTML được trình bày ở trên:

var properties = ['innerHTML', 'innerText', 'textContent', 'value'];

// Writes to textarea#output and console
function log(obj) {
  console.log(obj);
  var currValue = document.getElementById('output').value;
  document.getElementById('output').value = (currValue ? currValue + '\n' : '') + obj; 
}

// Logs property as [propName]value[/propertyName]
function logProperty(obj, property) {
  var value = obj[property];
  log('[' + property + ']'  +  value + '[/' + property + ']');
}

// Main
log('=============== ' + properties.join(' ') + ' ===============');
for (var i = 0; i < properties.length; i++) {
  logProperty(document.getElementById('test'), properties[i]);
}
<div id="test">
  Warning: This element contains <code>code</code> and <strong>strong language</strong>.
</div>
<textarea id="output" rows="12" cols="80" style="font-family: monospace;"></textarea>


1
Ngay cả các phiên bản gần đây nhất của Firefox cũng không hỗ trợ innerText: quirksmode.org/dom/htmlquirksmode.org/dom/tests/innerhtml.html
Jarno Lamberg

Sẽ rất hữu ích khi mỗi một trong bốn thuộc tính (InternalHTML, InternalText, textContent, value) được chia thành hai tiêu đề phụ: hành vi "get" và hành vi "set".
Luke Hutchison

3
Theo developer.mozilla.org/en-US/docs/Web/API/Node/innerText Firefox >=45 được hỗ trợ.
Kilmazed

4
Nếu tôi hiểu MDN chính xác, innerTextgiờ đây là một phần của Tiêu chuẩn và sẽ được Firefox hỗ trợ từ phiên bản 45 trở đi; có thể lý do cho một bản cập nhật cho câu trả lời tuyệt vời này @faraz
domsson

1
Nó cũng cải đạo &lt;để <, &gt;để >vv
SarcasticSully

23

InnerTextthuộc tính html mã hóa nội dung, chuyển <p>sang &lt;p&gt;, v.v. Nếu bạn muốn chèn các thẻ HTML bạn cần sử dụng InnerHTML.


8
Chỉ để rõ ràng: Điều này chỉ áp dụng khi THIẾT LẬP một giá trị. Khi bạn NHẬN các thẻ HTML giá trị chỉ bị tước và bạn sẽ có được văn bản đơn giản.
Jor

9

Nói một cách đơn giản:

  1. innerTextsẽ hiển thị giá trị như hiện có và bỏ qua mọi HTMLđịnh dạng có thể được bao gồm.
  2. innerHTMLsẽ hiển thị giá trị và áp dụng bất kỳ HTMLđịnh dạng.

3
var element = document.getElementById("main");
var values = element.childNodes[1].innerText;
alert('the value is:' + values);

Để tiếp tục tinh chỉnh nó và lấy giá trị Alec chẳng hạn, hãy sử dụng .childNodes khác [1]

var element = document.getElementById("main");
var values = element.childNodes[1].childNodes[1].innerText;
alert('the value is:' + values);

2

Về mặt MutationObservers, cài đặt innerHTMLtạo childListđột biến do các trình duyệt loại bỏ nút và sau đó thêm một nút mới với giá trị làinnerHTML .

Nếu bạn đặt innerText, một characterDatađột biến được tạo ra.


2

Sự khác biệt duy nhất giữa innerTextinnerHTMLinnerTextchèn chuỗi như nó vào phần tử, trong khi innerHTMLchạy nó dưới dạng nội dung html.

const ourstring = 'My name is <b class="name">Satish chandra Gupta</b>.';
document.getElementById('innertext').innerText = ourstring;
document.getElementById('innerhtml').innerHTML = ourstring;
.name{
color:red;
}
<h3>Inner text below. It inject string as it is into the element.</h3>
<div id="innertext"></div>
<br />
<h3>Inner html below. It renders the string into the element and treat as part of html document.</h3>
<div id="innerhtml"></div>


1

InnerTextsẽ chỉ trả về giá trị văn bản của trang với mỗi thành phần trên dòng mới bằng văn bản thuần túy, trong khi innerHTMLsẽ trả về nội dung HTML của mọi thứ bên trong bodythẻ và childNodessẽ trả về danh sách các nút, như tên cho thấy.


1

Các innerTexttài sản trả về văn bản thực tế giá trị của một phần tử html trong khi innerHTMLtrả về HTML content. Ví dụ dưới đây:

var element = document.getElementById('hello');
element.innerText = '<strong> hello world </strong>';
console.log('The innerText property will not parse the html tags as html tags but as normal text:\n' + element.innerText);

console.log('The innerHTML element property will encode the html tags found inside the text of the element:\n' + element.innerHTML);
element.innerHTML = '<strong> hello world </strong>';
console.log('The <strong> tag we put above has been parsed using the innerHTML property so the .innerText will not show them \n ' + element.innerText);
console.log(element.innerHTML);
<p id="hello"> Hello world 
</p>


0

để thêm vào danh sách, InternalText sẽ giữ cho biến đổi văn bản của bạn, bên trongHTML sẽ không

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.