[转]被玩坏的innerHTML、innerText、textContent和value属性

一、前言                              

由于innerText并非W3C标准属性,因此我们无法在FireFox中使用它,一般情况下我们可以使用textContent来代替,但它两者是否就能完全等同呢?在坑爹的表单元素(如input、textarea等)中表现是否依旧诡异呢?文本将记录一些实验结果,避免日后被玩坏。

二、innerHTML                          

由于innerText和textContent均为对innerHTML内容作不同的处理而成,因此我们需要先明确innerHTML属性的特点。

赋值操作:先对值内容进行模式匹配,然后把处理后的值赋予给innerHTML属性。

模式匹配结果将导致 保留将字符转换为HTML实体 两个操作。

a). 以下情况将被保留

1. HTML实体(ASCII实体、符号实体和字符实体)的实体名或实体编号;

2. 符号实体和字符实体对应的字符;

3. 没有HTML实体与之对应的字符。

b). 以下情况将会执行字符转换为HTML实体

1. ASCII实体对应的字符(<、>、&、‘和")。

也就是说除了 <、>、&、‘和" 会被转换为实体名外,将原封不动地将值赋予给innerHTML属性。

取值操作:直接获取innerHTML属性值。

后面的innerText和textContent内容将以下面的HTML Markup作为实验原材料

<style type="text/css">
 .line3, .line4{
   float: left;
 }
 .line5::after{
   content: "test"
 }
</style>
<div id="view">
  <div>line1</div>
  <div>line2</div><br/>
  <div class="line3">line3</div>
  <div class="line4">line4</div>
  <div style="clear:both;"></div>
  <div class="line5">line5</div>
</div>
<script type="text/javascript">
  var view = document.getElementById(‘view‘)
</script>

二、innerText                         

浏览器支持:IE、Chrome

赋值操作:先将ASCII实体对应的字符(<、>、&、‘和")转换为实体名,然后把处理后的值赋予给innerHTML属性。

取值操作:innerText的取值实际上就是对innerHTML的属性值进行一系列处理,然后返回,具体步骤如下

1. 对HTML标签进行解析;

2. 对CSS样式进行带限制的解析和渲染;

3. 将ASCII实体转换为对应的字符;

4. 剔除格式信息(如\t、\r和\n等),将多个连续的空格合并为一个。

IE各版本和Chrome下对innerText进行取值均执行上述4步,但效果不尽相同。实验结果如下:

  IE5.5~8

页面显示效果:

line1
line2

line3line4
line5

innerText取值结果:

"line1
line2

line3line4line5"

不全面的小结:在进行CSS样式渲染时,不支持伪元素和clear:both。

  IE9~11

页面显示效果:

line1
line2

line3line4
line5test

innerText取值结果:

"line1

line2

line3

line4

line5"

不全面的小结:在进行CSS样式渲染时,只会应用元素的默认样式。

Chrome

页面显示效果:

line1
line2

line3line4
line5test

innerText取值结果:

"line1
line2

line3line4
line5"

不全面的小结:在进行CSS样式渲染时,不支持伪元素。

三、textContent                        

  浏览器支持:IE9~11、FireForx、Chrome

赋值操作:先将ASCII实体对应的字符(<、>、&、‘和")转换为实体名,然后把处理后的值赋予给innerHTML属性。

取值操作:textContent的取值实际上就是对innerHTML的属性值进行一系列处理,然后返回,具体步骤如下

1. 对HTML标签进行剔除;

2. 将ASCII实体转换为相应的字符。

注意:

a). 对HTML标签是剔除不是解析,也不会出现CSS解析和渲染的处理,因此<br/>等元素是不生效的。

b). 不会剔除格式信息和合并连续的空格,因此\t、\r、\n和连续的空格将生效。

所有浏览器效果统一,界面效果:

line1
line2

line3line4
line5test

textContent取值结果:

"
  line1
  line2
  line3
  line4

  line5
"

四、表单元素中的innerHTML、innerText、textContent和value  

到这里大家应该对innerHTML、innerText和textContent之间的关系和行为有一定了解了,但不幸的是表单元素一如既往地会推翻我们之前的理解。请注意的是上述的关系和行为仅限于非表单元素,而本节将介绍表单元素textarea和input[type="text"]相关的蛋疼……

前置信息: textarea和input[type="text"]的value属性与界面输入框是对应的,通过value属性赋值与在界面输入框输入值属于同一个操作。

  textarea

FireFox

a). innerHTML可被设置并且生效,对其他属性的影响:

1. 无条件影响textContent的取值;

2. 在通过value属性赋值前,会影响value的取值;

3. 在通过value属性赋值后,则value的取值与innerHTML无关。

b). textContent可被设置且生效,对其他属性的影响:

     1. 无条件影响innerHTML的取值;

    2. 在通过value属性赋值前,会影响value的取值;

3. 在通过value属性赋值后,则value的取值与textContent无关。

c). value可被设置且生效。

Chrome

   a). innerHTML可被设置并且生效,对其他属性的影响:

1. 无条件影响innerText、textContent的取值;

2. 在通过value属性赋值前,会影响value的取值;

3. 在通过value属性赋值后,则value的取值与innerHTML无关。

   b). innerText可被设置并且生效,对其他属性的影响:

1. 无条件影响innerHTML、textContent的取值;

2. 在通过value属性赋值前,会影响value的取值;

3. 在通过value属性赋值后,则value的取值与innerText无关。

c). textContent可被设置且生效,对其他属性的影响:

     1. 无条件影响innerHTML、innerText的取值;

    2. 在通过value属性赋值前,会影响value的取值;

3. 在通过value属性赋值后,则value的取值与textContent无关。

d). value可被设置且生效。

    IE9~11

  innerHTML、value、innerText和textContent均可设置且有效,无条件相互影响取值。

    IE5.5~8

innerHTML、value、innerText和textContent均可设置且有效,无条件相互影响取值。

  input[type="text"]

    FireFox

  a). innerHTML可被设置且生效,无条件影响innerText和textContent的取值,但不会影响value的取值。

b). textContent可被设置且生效,无条件影响innerHTML的取值,但不会影响value的取值。

  c). value可被设置且生效,不会影响innerHTML和textContent的取值。

Chrome   

  a). innerHTML可被设置但无效,属性值永远保持空字符串。

  b). textContent可被设置且生效,但不会影响value、innerHTML和innerText的取值。

  c). innerText可被设置,但实际设置时会抛异常

<input type="text" id="target">
<script type="text/javascript">
  var getDesc = function(){ return Object.getOwnPropertyDescriptor.apply(Object, arguments) }
    , get = function(){ return document.getElementById.apply(docuemnt, arguments) }
  var target = get(‘target‘);
  console.log(getDesc(target, ‘innerText‘))   // Object {value: "", writable: true, enumerable: true, configurable: true}
  target.innerText = "1" // NoModificationAllowedError: Failed to set the ‘innerText‘ property on ‘HTMLElement‘: The ‘input‘ element does not support text insertion.
</script>

  d). value可被设置且生效,但不会影响textContent、innerHTML和innerText的取值。

   IE5.5~8

a). innerHTML可被设置,但实际设置时会抛异常

<input type="text" id="target">
<script type="text/javascript">
  var getDesc = function(){ return Object.getOwnPropertyDescriptor.apply(Object, arguments) }
    , get = function(){ return document.getElementById.apply(docuemnt, arguments) }
  var target = get(‘target‘);
  console.log(getDesc(target, ‘innerHTML‘))   // Object {value: "", writable: true, enumerable: true, configurable: true}
  target.innerText = "1" // 未知的运行时错误
</script>

b). innerText可被设置且有效,无条件影响value取值。但innerText的取值永远是空字符串。

c). value可被设置且生效,但不会影响innerHTML和innerText的取值。

 IE9~11

   a). innerHTML可被设置且生效,无条件影响innerText和textContent的取值。但不影响value的取值。

b). innerText可被设置且生效,无条件影响value取值。但不影响innerHTML和textContent。innerText的取值由innerHTML的属性值经过处理后返回。

// 假设a是input[type="text"]
a.innerHTML = "

c). textContent可被设置且生效,无条件影响innerHTML和innerText的取值,textContent的取值由innerHTML的属性值经过处理后返回。

d). value可被设置且生效,但不会影响innerHTML、textContent和innerText的取值。

五、HTML编码                         

所谓HTML编码其实就是将字符转换为HTML实体,这是防止脚本注入的重要手段之一。

由于表单元素的value与innerHTML关系在不同浏览器上表现各不相同,因此最保险的方式还是
;(function(exports, doc){
  var dom = doc.createElement(‘textarea‘)

  exports.encode = function(raw){
    dom.innerHTML = raw
    return dom.innerHTML
  }
  exports.decode = function(str){
    dom.innerHTML = str
    return dom[‘innerText‘ in dom ? ‘innerText‘ : ‘textContent‘]
  }
}(window.htmlEncoder = {}, document))

六、总结                            

本文若有纰漏请大家指正补充,谢谢!

尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/4319635.html ^_^肥仔John

时间: 2024-11-06 16:03:33

[转]被玩坏的innerHTML、innerText、textContent和value属性的相关文章

JS魔法堂:被玩坏的innerHTML、innerText、textContent和value属性

一.前言 由于innerText并非W3C标准属性,因此我们无法在FireFox中使用它,一般情况下我们可以使用textContent来代替,但它两者是否就能完全等同呢?在坑爹的表单元素(如input.textarea等)中表现是否依旧诡异呢?文本将记录一些实验结果,避免日后被玩坏. 二.innerHTML 由于innerText和textContent均为对innerHTML内容作不同的处理而成,因此我们需要先明确innerHTML属性的特点. 赋值操作:先对值内容进行模式匹配,然后把处理后的

innerHTML,innertext,textContent区别

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 <style> 7 .demo{ 8 visibility: hidden; 9 } 10 .test{ 11 display: none; 12 } 13 </style> 14 </head> 15 <body

从共享健身仓到共享马扎,看共享经济如何被玩坏

看到现在共享经济项目遍地开花,其实很多行业都捶胸顿足感叹自己诞生地太早了.就像网吧,其实也能说是共享经济--提供电脑解决大众上网需求,并占据他们的time和money.而如今,"共享"已经被完全玩坏了,披着"共享"的外衣却有着各种小九九的项目层出不穷. 共享健身仓.共享马扎--这些打着"共享"名号的项目,或者是名不副实,或者是有着其他目的.而最终的结果,就是让业界.投资者和大众谈"共享"即色变.对于共享经济的破坏,什么时候才能

如何在VS上用C#玩坏“Hello World”。

如何在VS上用C#玩坏“Hello World”. 为了开发win8应用,重装了系统到win8.1,安好了VS2013终极版,我们开始使用C#,今天来玩“Hello World”. 首先,打开vs,建立一个控制台应用程序.我的建立路径是C:\Users\ZhangXiao\Desktop\,工程名字是ConsoleHelloWorld. 如图,打出代码行,调用System命名空间中Console类的WriteLine函数,在控制台上输出一句话. 第一种方法,打开cmd命令提示符,用cd命令进入C

那些年被我玩坏的点子和创意-下篇

时光如白驹过隙,继那些年被我玩坏的点子和创意-上篇已过一个月,平常忙活着和队友一起做产品了,挤得时间总结了下篇,分四个故事来说 自动发微博软件为啥做这个呢,淘宝客接口还没有限制以前好多玩淘宝客的.其中我发现有个淘宝客玩的挺特别的,他是在新浪微博和腾讯微博(当时还没有关闭),上通过时光机等一些定时发微博的平台给粉丝推送淘客商品信息,我还记得他的微博马甲叫"型男服装搭配",他推送的微博都是从淘宝男装男鞋等类目下的按销量等某些筛选条件后的top N条商品,我不知道这样效果怎么样,但我知道可以

漫谈可视化Prefuse(四)---被玩坏的Prefuse API

这个双12,别人都在抢红包.逛淘宝.上京东,我选择再续我的“漫谈可视化”系列(好了,不装了,其实是郎中羞涩...) 上篇<漫谈可视化Prefuse(三)---Prefuse API数据结构阅读有感>主要介绍了可视化工具Prefuse API中主要解读的是prefuse.data包中的主要接口,并利用<漫谈可视化Prefuse(一)---从SQL Server数据库读取数据>中例子,将参数配置模块剥离出来,实现界面传值,绘制图形. 本篇决定不再贴API,实在没啥意思,还占篇幅(但是不

Github 恶搞教程(一起『玩坏』自己的 Github 吧)

最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发现原来有人已经做出『玩坏』Github 的工具啦,名叫 gitfiti.主要对应预先定义的模板,进行相应日期的 commit 操作,push 至 Github 后在贡献栏中生成相应像素点,并且利用 Github 贡献数不同颜色深度不同的机制,就可以在自己的贡献栏里面看见像素画了.怎么样,是不是心动啦,那么下面

众筹是被玩坏的C2B

什么叫"众筹"? 我们先来看看京东众筹对"众筹"的阐述. "众筹"译自crowdfunding,即大众筹资或群众筹资,是一种通过互联网方式向网友募集项目资金的模式.从行业来看,国内的众筹还是一个新兴行业,处在初创阶段.众筹的通俗说法就是,彼此成就梦想,大家筹钱完成一个任务.和预售.团购的区别是:预售是B2C,众筹偏向C2B,就是出资人先有购买或投资的意愿,筹资人按需组织生产. 众筹具有三点特征:1. 排他性,即处于众筹期限内的产品仅在单一渠道发售

科技不该被玩坏!宏碁携自拍帽登时装周

虽然平时我们总能见到许多奇葩的人.事.物,但那些似乎都还情有可原--比如凤姐这么奇葩就是为了出名.在这个奇葩层出不穷的时代,我们似乎已经有了很强的免疫力,对什么都见怪不怪.但总有一些表现得太过分的事物是我们所不能容忍的,比如科技产品中的奇葩.科技产品可以不实用,可以价格高,可以很小众,但绝不能被玩坏!而近日,宏碁却无视了这些底线,将旗下的科技产品彻底玩坏. 宏碁推出一款造型怪异的自拍帽子,完全超出了业界和消费者的想象,让我和围观的小伙伴脑洞大开.但"欣赏"完之后,却丝毫没有购买的冲动,