javascript textContent与innerText的异同分析


Posted in Javascript onOctober 22, 2010

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换码、解释,最终显示出来,然后去除各种格式信息留下的纯文本。它会把<br/>换成换行符,会将多个空格并成一个空格对待,而本来的换行符却并不会引起换行,IE会将其当作一个普通的单词边界(一般是空格)。再说的形象点,一个元素的innerText属性的值,和你将这个元素内容复制粘贴到记事本里的内容一致。

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

更加简练的总结: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下完成测试。

Javascript 相关文章推荐
jquery中通过过滤器获取表单元素的实现代码
Jul 05 Javascript
jQuery ajax 路由和过滤器使用说明
Aug 02 Javascript
js截取字符串的两种方法及区别详解
Nov 05 Javascript
JQuery中$.each 和$(selector).each()的区别详解
Mar 13 Javascript
JS实现可展开折叠层的鼠标拖曳效果
Oct 09 Javascript
每天一篇javascript学习小结(Date对象)
Nov 13 Javascript
jQuery CSS3自定义美化Checkbox实现代码
May 12 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
Nov 09 Javascript
jquery mobile移动端幻灯片滑动切换效果
Apr 15 Javascript
Javascript实现登录记住用户名和密码功能
Mar 22 Javascript
Vue2.0设置全局样式(less/sass和css)
Nov 18 Javascript
Echarts实现单条折线可拖拽效果
Dec 19 Javascript
js各种验证文本框输入格式(正则表达式)
Oct 22 #Javascript
JavaScript学习点滴 call、apply的区别
Oct 22 #Javascript
Web 前端设计模式--Dom重构 提高显示性能
Oct 22 #Javascript
jQuery中add实现同时选择两个id对象
Oct 22 #Javascript
jquery下动态显示jqGrid以及jqGrid的属性设置容易出现问题的解决方法
Oct 22 #Javascript
为jQuery.Treeview添加右键菜单的实现代码
Oct 22 #Javascript
使用jQuery模板来展现json数据的代码
Oct 22 #Javascript
You might like
利用php+mysql来做一个功能强大的在线计算器
2010/10/12 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
2013/06/18 PHP
Symfony2学习笔记之系统路由详解
2016/03/17 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
jQuery使用手册之 事件处理
2007/03/24 Javascript
json跟xml的对比分析
2008/06/10 Javascript
js loading加载效果实现代码
2009/11/24 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
javascript实现分栏显示小技巧附图
2014/10/13 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
jquery购物车结算功能实现方法
2020/10/29 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
深入理解Vue官方文档梳理之全局API
2017/11/22 Javascript
详解使用React.memo()来优化函数组件的性能
2019/03/19 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
Python按钮的响应事件详解
2019/03/04 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
2019/08/18 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
Django DRF认证组件流程实现原理详解
2020/08/17 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
pytorch下的unsqueeze和squeeze的用法说明
2021/02/06 Python
学生手册家长评语
2014/02/10 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
公安民警正风肃纪剖析材料
2014/10/10 职场文书
2015年环境整治工作总结
2015/05/22 职场文书
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python