javascript中textContent与innerText的异同分析

2023-12-21 05:18

本文主要是介绍javascript中textContent与innerText的异同分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:http://www.jb51.net/article/25082.htm

textContent与innerText的不同

IE下有个innerText属性,FF下有个textContent属性。很多以前给IE写脚本的,在FF下找不到innerText属性,于是网上搜到的建议是用textContent来替代。反之给FF写脚本的也一样。

但是实际上,这里有个误解。网上很多文章说“FF下等效于innerText属性的属性是textContent”————但是事实上并非如此。innerText与textContent有几点很重要的不同,导致它们在一些情况下不能直接互换使用。

前些日子写了个代码高亮JS插件,在IE下工作完全正常,而在FF下就不对头。在IE下使用的是innerText属性,而在FF下使用的则是textContent属性。在进行字符串处理的时候二者的不同导致了完全不一样的结果。于是就专门写了点东西来测试二者的不同。

根据测试的结果表明:
innerText:它的内容实际上就是你在浏览器看到的内容。它的值是经过浏览器解释过的结果:它将元素的innerHTML换码、解释,最终显示出来,然后去除各种格式信息留下的纯文本。它会把
换成换行符,会将多个空格并成一个空格对待,而本来的换行符却并不会引起换行,IE会将其当作一个普通的单词边界(一般是空格)。再说的形象点,一个元素的innerText属性的值,和你将这个元素内容复制粘贴到记事本里的内容一致。

textContent:它的内容则是innerHTML去除所有标签后的内容(我怀疑这个是从XMLDOM中照搬过来的属性,特性完全一致)。它会将innerHTML中的转义字符(<、 什么的)进行换码,但是不对任何html标签进行解释,而是直接剔除它们。它也不会对innerHTML中的文本按照HTML的方式进行格式转换,比如多个空格还会原原本本地保留,不会合并为一个空格,换行符仍然存在(相反
却不会导致换行)。

更加简练的总结:IE中的innerText是需要对innerHTML的值进行:
1、HTML转义(等同于XML转义,对<、&等转义字符进行处理);
2、经过HTML解释和CSS样式解释
3、之后又剔除格式信息
之后留下的纯文本。
而FF中的textContent没有2、3步,在经过了HTML转义之后直接剔除所有html标签后得到的纯文本。

一个例子:

<div id=”T1″> 
ABCD 
EFG HIJ<br/>KLM  N 
OPQ<div>RS</div>T 
T 
<div> 

这个id为T1的div,
在IE中的innerText属性的值为:

ABCD EFG HIJ 
KLM N OPQ 
RS 
T T 

而在FF中的textContent的属性的值为:

(这里有个换行) 
ABCD 
EFG HIJKLM N 
OPQRST 
T 

注意那个div中还嵌套了个div,而这个更能反映IE的innerText和FF的textContent各自的处理方式的不同:
div是块(block)元素,默认会独占一行,因此,在IE中的innerText反映为上述div中的RS独占一行,而FF的textContent完全不理会HTML格式,因此其textContent中的RS是和其它字符连在一起的,不会独占一行。

如果想更进一步,看看这个有趣的结果:
假如给里面那个div加一个style=”float:left;”,那么这个div就会由块元素变化为行元素,不再独占一行,因此IE的innerText属性中RS便不再独占一行,而与其它字符连在一起,而在FF中由于textContent不理会标签更不会理会CSS,因此它的textContent属性的值不会有任何变化。

这么看来,很多网上说的“让FF支持innerText属性”云云,其实都是多多少少有问题的。要实现IE的innerText,远没有想象中的那么简单,你若要使用JavaScript让FF拥有和innerText完全一样的效果,得自己把html标签属性全部parse一遍,解释它们,甚至还需要去解释css……
(不过根据原理,貌似通过剪贴板的复制和取回操作可以在FF下模拟innerText效果(这个未测试),但是1有副作用,2FF下的剪贴板操作也很麻烦。)

不过还好,大多数时候我们并不需要那么精确,使用innerHTML做点简单的处理即可达到比较接近的效果了。

注:以上代码均在IE6和FF3下完成测试。

个人附加说明:
以下代码

<p>Copyright&copy;2016</p>
<p>dd</p>
<p>designed by crystal. All Right reserved.</p>

在火狐5.0下
火狐
在ie11下
ie
若代码多加一个K,变成这样

<p>Copyright&copy;2016</p>
<p>dd</p>k
<p>designed by crystal. All Right reserved.</p>

那么 在ie11下最终结果将是这样
ie1
火狐5.0下是这样
火狐1

个人理解,ie还会把一个block元素的剩余空白部分解释为一行,若有内容则另起一行。最后一行除外,不会在空白处没有内容时单独留出来一行,但如果有内容,同样另起一行显示。

这篇关于javascript中textContent与innerText的异同分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/518764

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2