javascript textContent与innerText的异同分析

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下完成测试。

(0)

相关推荐

  • javascript解决innerText浏览器兼容问题思路代码

    下面的函数接收一个参数,该参数可以是数组还可以是一个元素,返回元素的文本. 复制代码 代码如下: function text(e){ var str = ""; //如果传入的是元素,获取它的子元素 //否则,当它是一个数组 e=e.childNodes || e; for ( var i = 0; i < e.length; i++ ) { //判断元素类型 //如果是text就获取它的文本,否则,遍历它的子元素 str += e[i].nodeType != 1 ? e[i]

  • javascript innerHTML使用分析

    空格处理 当在DIV中输入"a[任意个空格]a" HTML呈现在Chrome和IE下是一样的:只显示一个空格. innerHTML属性 IE还是两个a加一个空格, Chrome则是原始输入的样子. 回车 当在DIV中输入"a[回车][任意个空格]a"时,HTML呈现Chrome和IE是一样的. innerHTML属性 IE是3个字符,在两个a中间加了个空格. Chrome则是原始输入的样子,将回车解析为\n. HTML标记 当在DIV中输入"a<Br

  • javascript innerText和innerHtml应用

    看看代码 <head runat="server">    <title>无标题页</title>    <script language="javascript">        function ok(){            var txt=new Array();            txt.push("<strong>");            txt.push(&quo

  • javascript中innerText和innerHTML属性用法实例分析

    本文实例讲述了javascript中innerText和innerHTML属性用法.分享给大家供大家参考.具体分析如下: 几乎所有DOM元素都有innerText,innertHTML属性(注意大小写),分别是元素标签内 的文本表示形式和HTML源代码,这两个属性是可读可写的 innerHTML也可以取代createElement,属于简单,粗放型,后果自负的创建 <html xmlns="http://www.w3.org/1999/xhtml"> <head>

  • Javascript createElement和innerHTML增加页面元素的性能对比

    最近遇到js的效率问题,是关于在页面中新增元素的问题. 假设我们有页面如下: 复制代码 代码如下: <HTML> <HEAD> </HEAD> <BODY> <div id="div1"></div> </BODY> <script> // 脚本位置 </script> </HTML> 现在,我们要往div1中添加对象,大家都知道在为web页面增加一个元素时可以使用如

  • javascript innerHTML、outerHTML、innerText、outerText的区别

    1.功能讲解: innerHTML 设置或获取位于对象起始和结束标签内的 HTML outerHTML 设置或获取对象及其内容的 HTML 形式 innerText 设置或获取位于对象起始和结束标签内的文本 outerText 设置(包括标签)或获取(不包括标签)对象的文本 2.示例 <html> <head> <title>Demo</title> <style><!-- body {font-family:"宋体";

  • Javascript中innerHTML用法实例分析

    本文实例讲述了Javascript中innerHTML用法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: <html> <head> <script type="text/javascript"> function t(){  var cont = document.getElementById('container');  var htmlcode = "<p>哈哈哈哈</p>";  

  • Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法

    复制代码 代码如下: <script> document.getElementById("trone").innerHTML = "<td>haha</td>"; </script> <tr id="trone"> </tr> 在IE中,有时候会出现"未知的运行时错误(unknown runtime error)",而在firefox里不会. 这主要是IE

  • javascript textContent与innerText的异同分析

    textContent与innerText的不同 IE下有个innerText属性,FF下有个textContent属性.很多以前给IE写脚本的,在FF下找不到innerText属性,于是网上搜到的建议是用textContent来替代.反之给FF写脚本的也一样. 但是实际上,这里有个误解.网上很多文章说"FF下等效于innerText属性的属性是textContent"----但是事实上并非如此.innerText与textContent有几点很重要的不同,导致它们在一些情况下不能直接

  • javascript的理解及经典案例分析

    js的简介: JavaScript是一种能让你的网页更加生动活泼的程式语言,也是目前网页中设计中最容易学又最方便的语言. 你可以利用JavaScript轻易的做出亲切的欢迎讯息.漂亮的数字钟.有广告效果的跑马灯及简易的选举,还可以显示浏览器停留的时间.让这些特殊效果提高网页的可观性. javascript现在可以再网页上做很多很多事情,网页特效,操作dom,html5游戏(基于html5和JavaScript的结合),动画等等特效,还可以实现拉去后台数据(通过ajax),不仅可以做前台还可以做后

  • JavaScript仿微博输入框效果(案例分析)

    这篇文章给大家分享一个小的JavaScript的案例,就是模仿微博输入框的效果. 效果图: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>仿微博输入框效果</title> <script src="jquery.js"></script> </h

  • JavaScript 数组的进化与性能分析

    正式开始前需要声明,本文并不是要讲解 JavaScript 数组基础知识,也不会涉及语法和使用案例.本文讲得更多的是内存.优化.语法差异.性能.近来的演进. 在使用 JavaScript 前,我对 C.C++.C# 这些已经颇为熟悉.与许多 C/C++ 开发者一样,JavaScript 给我的第一印象并不好. Array 是主要原因之一.JavaScript 数组不是连续(contiguous)的,其实现类似哈希映射(hash-maps)或字典(dictionaries).我觉得这有点像是一门

  • JavaScript进阶练习及简单实例分析

    当用户点击"统计"按钮时,在窗口中弹出文本框中出现次数最多的字符并显示其出现的次数 点击统计按钮时效果如图所示: 实现代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo

  • JavaScript实现按键精灵的原理分析

    最近有个需求,需要在页面上面自动点击.输入.提交. 用以模拟真实用户的操作行为,可以通过直接执行某个元素绑定的事件,来执行操作. 也可以创建事件,再派发事件,执行操作.关于事件的更多细节,可以参考<JavaScript中事件处理> 1.模拟MouseEvent中的click事件,x与y位置随机点击 2.模拟TouchEvent中的touchstart和touchmove,用scroll来做滑动效果 3.模拟FocusEvent,聚焦到屏幕中的输入框内 一.鼠标事件MouseEvent Mous

  • javascript递归函数定义和用法示例分析

    递归函数:是指函数直接或间接调用函数本身,则称该函数为递归函数. 这句话理解起来并不难,从概念上出发,给出以下的例子: function foo(){ console.log("函数 foo 是递归函数."); foo(); } 这个例子的 foo 函数就是一个递归函数. 当你把这个函数拿到浏览器上运行的时候,你会发现内存溢出了,为什么呢?因为这个递归函数没有停止处理或运算的出口,因此这个递归函数就演变为一个死循环. 那如何使用递归呢? 使用递归函数必须要符合两个条件: 1. 在每一次

  • Java Vector和ArrayList的异同分析及实例讲解

    在线程中有两种常用的方法,能够通过数组实现相应的功能,但除此之外在区别上也是很明显的.本篇就其中的代表方法ArrayList和Vector进行比较分析,一个是非线程安全,另一个是线程安全.在进行相同和不同点的分析之后,带来二者的实例代码对比,帮助大家体会它们的异同. 1.相同点 (1)都是有序集合. (2)数据不允许重复. (3)都实现了list接口. (4)都是通过数组实现的. (5)数组进行复制.移动.代价比较高,因此,适合随机查询和遍历,不适合插入和删除. 2.不同点 (1)ArrayLi

  • JavaScript中的LHS和RHS分析详情

    目录 进一步理解 编译特点 分析 区分 LHS 和 RHS 的重要性 前言: 对于LHS和RHS,从字面意思来说是​​ Left Hand Side​​和​​ Right Hand Side​​即左手边和右手边,一般可以理解为赋值操作的左侧和右侧,然而不能片面的用​​=​​号左边还说右边去判断是​​LHS​​还是​​RHS​​通俗的理解,​ ​LHS​​是赋值操作即可以看做是在往内存中存储值,而​​RHS​​是取值操作,它是从内存中进行检索.事实上赋值操作还有其他几种形式,因此在概念上最好将其理

  • JavaScript Set与Map数据结构详细分析

    目录 Set 基本使用 遍历操作 Map 基本使用 Set ES6提供了新的数据结构 Set(集合).它类似于数组,但成员的值都是唯一的,集合实现了iterator接口,所以可以使用 [扩展运算符] 和 [for...of] 进行遍历. 基本使用 添加新的元素 Set函数可以接受一个数组(或者具有iterable接口的其他数据结构)作为参数,用来初始化. <script> // 声明一个 set let s = new Set([1,2,2,3,4,4,5]) //Set方法会自动去重 //

随机推荐