细说innerHTML、innerText、outerHTML、outerText、textContent的区别

本文深入剖析了innerHTML、innerText、outerHTML、outerText及textContent等DOM属性的功能与差异,通过实例展示了它们在获取和设置HTML节点内容时的表现,揭示了浏览器显示与代码结构之间的联系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简析

这几个属性都是原生 JS 用来获取和设置 DOM 节点的内容的,但是获取的内容格式和范围却有一些不同。

对比一

先上一段代码

<!- HTML -->
<div id="test"> 
     <span style="color:red">test1</span> test2 
</div>

<!- JS -->
var elementNode = document.getElementById('test');

innerHTML

获取或设置从对象的起始位置到终止位置的全部内容,包括 Html 标签

elementNode.innerHTML;  // <span style="color:red">test1</span> test2

innerText

获取或设置从起始位置到终止位置的内容, 但是不含 Html 标签

elementNode.innerText; // test1 test2

  可以看到,该例子中的 innerHTML 获取到的是含有 HTML 标签的内容,而 innerText 获取的内容不含有 HTML 标签的文本。

outerHTML

获取或设置除了包含 innerHTML 的全部内容外, 还包含对象标签本身

elementNode.outerHTML;  // <div id="test"> <span style="color:red">test1</span> test2 </div>

outerText

获取或设置从起始位置到终止位置的内容, 还包含对象标签本身, 但是不含 Html 标签

elementNode.outerText; // test1 test2

小结

1)innerHTML 与 outerHTML 在设置对象的内容时包含的 HTML 会被解析,但 innerText 与 outerText 则不会转义 HTML 内容,而是按照文本直接输出 HTML 标签。

2)在设置时,innerHTML 与 innerText 仅设置标签内的文本,而 outerHTML与 outerText 设置包括标签在内的文本。

 3)innerHTML 是符合W3C标准的属性,而 innerText 只适用于IE浏览器。

 

对比二 

textContent

获取或设置从起始位置到终止位置的内容, 还包含对象标签本身, 但是不含 Html 标签

textContent 与 innerText

区别一

继续再上例子

<!- HTML -->
<div id="test2">
    <span>test1</span>
    <span>test2</span>
</div>

<!- JS -->
var elementNode2 = document.getElementById('test2');

 分别用 textContent 与 innerText 来获取节点的内容,结果如下

elementNode2.textContent; 
/*       
        test1
        test2
*/

elementNode2.innerText; // test1 test2

可以看到,innerText 输出结果是在和页面中显示是一样的在同一行显示,而 textContent 输出结果和代码中的显示是一致的。当然我们也可以把代码改成下面这样,来看看是不是真的跟前面说的一样。

<!- HTML -->
<div id="test2">
    <span>test1</span><span>test2</span>
</div>

<!- JS -->
var elementNode2 = document.getElementById('test2');
elementNode2.textContent; // test1test2
elementNode2.innerText; // test1test2

是吧。这次 innerText 输出结果是在和页面中显示也是一样。textContent 输出结果和代码中的显示也是一致的。

可以这样总结:innerText 的值决定于浏览器的显示结果,textContent 的值决定于代码的结构

区别二

再来看一个例子

<!- HTML -->
<div id="test3">
    <span>test1</span>
    <span style="display: none;">test2</span>
    <script>var a='test3';</script>
</div>

<!- JS -->
var elementNode3 = document.getElementById('test3');

这里我们再分别用 textContent 与 innerText 来获取节点的内容,看看结果如何?

elementNode3.textContent; 
/*       
        test1
        test2
        var a='test3';
*/

elementNode3.innerText; // test1

textContent 可以获取到一个元素之间包含了 script 标签或者 style.display 的值为 none 标签,innerText 是获取不到这些文本的。再一次验证“ innerText 的值决定于浏览器的显示结果”这个总结。

区别三

<!- HTML -->
<div id="test4">
    test1
    <span></span>
    test2
    <p></p>
    test3
    <span></span>
    <span></span>
    <span></span>
    test4
    <p></p>
    <p></p>
    <p></p>
    test5
</div>

<!- JS -->
var elementNode4 = document.getElementById('test4');
elementNode3.textContent; 
/*       
test1 test2

test3 test4

test5
*/

elementNode3.innerText; 
/*       
        test1
        
        test2
        
        test3
        
        
        
        test4
        
        
        
        test5
*/

 textContent 会把空标签解析成换行(几个空标签就是几行),innerText 只会把 block 元素类型的空标签解析换行,并且如果是连续多个的话仍看成是一个,而 inline 类型的元素则解析成空格,同样也是连续多个算成一个。

区别四

innerText 和 textContent 两个属性并非 html5 的规范属性,它们是各个浏览器厂商自己实现的,那么也就是说有些浏览器实现了innerText,有些浏览器实现了 textContent ,有些浏览器两个属性都有实现,因此书写的时候就要考虑到兼容性判断了,可以参考这样写:

if(el.textContent){
    el.textContent='test';
}else{
    el.innerText='test';
}

另外,还需要我们注意的是,innerText 的操作一定会引起浏览器回流,所以是比较耗性能的。而 textContent 并非一定会触发回流,但它也是在特定情况下(比如所赋值的内容超出了容器尺寸,影响到了页面整体布局)才会触发回流,在其他情况下一般只是触发浏览器的重绘。

 

恭喜你,阅读完毕~


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值