今天要讲的这些属性都可以用来获取某个元素的内容,你可能会觉得不可思议,或是说上一句“丧心病狂”也。但当你看完以下内容后,会发现除outerText无用外,其他的都有各自的使用场景,不然它就真的是丧心病狂,然后我们就可以各回各家了。

innerText

引用MDN,Node.textContent上的一段话:

Internet Explorer 引入了 element.innerText,目的是相似的,不过有下面几点不同之处:

  • textContent 会获取所有元素的内容,包括<script><style> 元素,然而 IE 专有属性 innerText 不会。

  • innerText 会受样式的影响,它不返回隐藏元素的文本,但 textContent 返回。

  • 由于 innerText 受 CSS 样式的影响,它会触发重排(reflow),但textContent 不会。

  • 与 textContent 不同的是, 在 Internet Explorer (对于小于等于 IE11 的版本) 中对 innerText 进行修改, 不仅会移除当前元素的子节点,而且还会永久性地销毁所有内部文本节点(由此导致无法再将这些被销毁的文本节点插入到当前元素或任何其他元素中)。

虽然innerText是IE私有属性,但现在很多浏览器也都支持这个属性。

也许你看了以上MDN上的一段话后,心情澎湃,原来天天使用的innerText竟然有如此多的问题,但如果你看了下面这段或许又是另外一种心情了。

innerText属性和textContent属性除了MDN上面说的几点以外,还有一个很大的区别,而这个区别会让你对innerText属性即爱又恨,这个区别就在于innerText和textContent属性对换行的处理,来看下面这段代码

    <div id="box"></div>
<div id="content1"></div>
<div id="content2"></div>
<script>
box.innerHTML = "a\na";
content1.innerText = box.innerHTML;
content2.textContent = box.innerHTML;
</script>

别问我为什么不获取元素直接使用id操作dom,懒/

以上我给box元素添加了两个a和一个\n换行符,其解析结果如下图

从上图我们可以看到使用innerText设置内容的元素中莫名的出现了一个br标签,也就是说innerText把\n当成了br来解析,我们再看使用textContent设置内容的元素,可以看到它好像多一个空格,但如果你打开源代码会发现它不是空格,而是实实在在的换行符,不信你瞧

也就是说textContent才是解析正常的,那么为什么在页面中看到的content2元素是一个空格呢,其实这不足为怪,来看看下面这段代码

    <div id="content2">a
a
</div>

以上代码是编辑器中的源代码,我们每天编写的无数行代码中,又有无数个换行和空格吧?你应该看到过它的效果吧?HTML对换行和空格不敏感!!!多个换行或空格只会当成是一个空格。

那么有没有办法解决?有!而且用CSS就可以做到了,想让浏览器对某个元素原样输出,可以给它加以下这段CSS

white-space: pre;

这段css的意思是,将此元素按照在源代码中的样子进行输出,也就是你代码怎么写的,它就怎么输出(保留空格和换行符)。除了用css以外也还可以使用pre元素来达到同样的效果。

textContent和innerText的区别不仅仅在设置内容的时候会出现,在获取的时候一样也会出现,比如下面这段

    <div id="box"></div>
<div id="content1"></div>
<div id="content2"></div>
<script>
box.innerHTML = "a<div></div>a";
content1.innerHTML = box.innerText;
content2.innerHTML = box.textContent;
</script>

效果如下图

使用innerText获取的内容将<div></div>当成了一个换行,使用textContent获取内容的元素一切正常。如果我们将<div></div>换成<br>,你会发现更坑,它把每个<br>都当成了一个换行,效果如下

你没有看错就是两个换行符,源代码如下

    <div id="box"></div>
<div id="content1"></div>
<div id="content2"></div>
<script>
box.innerHTML = "a<br><br>a";
content1.innerHTML = box.innerText;
content2.innerHTML = box.textContent;
</script>

也许你会想,如果使用两个div元素,那么是不是也会出现两个换行符呢?结果令你失望,只有当是<br>才会。

它们的区别大概就是如此了,所以以后在选择使用innerText和textContent的时候,请慎重啊。

textContent

用来设置或是获取某个元素内所有文本内容,包括子元素中的内容,如果是设置,则原本的子元素会被同被替换掉。

innerHTML

用来设置或是获取某个元素内所有元素及内容,包括子元素。当内容都是文本的时候,可以把这个属性当做textContent属性来用。

outerHTML

outerHTML和innerHTML很像,它们的唯一区别就是outerHTML包括自身元素而innerHTML不包括自身元素。

nodeValue

nodeValue和textContent很像,它们都是用来获取某个元素中的内容的,不过nodeValue并不能直接操作某个dom元素,它只能用来获取某段文本节点中的内容,知道你肯定对这个不熟,演示一下给你看。

    <div id="box">javascript<span>html</span></div>
<div id="content1"></div>
<script>
content1.innerHTML = box.childNodes[0].nodeValue;
</script>

在使用nodeValue之前,我们需要先使用childNodes获取box中的所有节点集合,childNodes返回的是一个NodeList数组,如下图

虽然NodeList数组返回所有子节点,不过我们只能对文本节点使用nodeValue属性噢,假如你想把html赋给content1,是不能直接通过box.childNodes[1].nodeValue来获取的,因为box.childNodes[1]是元素,而如果想获取span中的文本节点,我们得像下面这样

    <div id="box">javascript<span>html</span></div>
<div id="content1"></div>
<script>
content1.innerHTML = box.childNodes[1].childNodes[0].nodeValue;
</script>

效果如下

虽然你可能会觉得以上那段代码写着很烦,但如果你想细致化的操作文本节点,这个属性对你来说就非常有用了。

outerText

看了以上内容,你肯定想到了,这个outerText和outerHTML有同样的功能它们都包括自身,不同的是outerText获取的是元素内容,而outerHTML获取到的内容包括元素。

那么为什么我一开始说outerText无用呢,因为它能做的事,textContent、innerText和innerHTML都可以做。

那么为什么textContent、innerText和innerHTML都可以做outerText的事呢?

<div>javascript</div>

以上这段代码使用div包含了一段文本节点。

因为文本节点不可能单独使用,也就是说所有文本节点都有父元素!既然有父元素那么文本节点就只能是属于某个元素的子节点,又因为是子节点,textContent、innerText和innerHTML自然也就能使用啦,所有这个outerText也就只能做个有名无份的主了。

注意:就算文本节点是属于元素自身的,那它也还是元素的子节点!

完。

textContent、innerHTML、innerText、outerText、outerHTML、nodeValue使用场景和区别的更多相关文章

  1. innerHTML innerText与outerHTML间的区别

    innerHTML与innerText及outerHTML间的区别最容易使初学者搞混淆,为了更好的使读者区分开.下面我就通过一个demo来解释: 代码: <!DOCTYPE html>&l ...

  2. innerHTML/outerHTML; innerText/outerText; textContent

    innerHTML v.s. outerHTML Element.innerHTML Reference: https://developer.mozilla.org/en-US/docs/Web/A ...

  3. JS之innerHTML,innerText,outerHTML,textContent的用法与区别

    示例html代码: <div id="test"> <span style="color:red">test1</span> ...

  4. innerHTML、innerText、outerHTML、textContent的区别

    示例html代码: <div id="test"> <span style="color:red">test1</span> ...

  5. JS中innerHTML/outerHTML和innerText/outerText以及value 的区别与使用

    value value:value是表单元素特有的属性,输入输出的是字符串 如下面的例子,获取到的是他们的value值 <input type="text" id=" ...

  6. (转)innerHTML、innerText和outerHTML、outerText的区别

    原文:http://walsh.iteye.com/blog/261966 innerHTML.innerText和outerHTML.outerText的区别          博客分类: CSS/ ...

  7. 测试开发技术:DOM中 innerHTML、innerText、outerHTML、outerText的区别

    测试开发技术:DOM中 innerHTML.innerText.outerHTML.outerText的区别   我们在做web自动化的过程中通过dom处理web页面元素,那么你就要了解innerHT ...

  8. innerHTML、innerText和outerHTML、outerText的区别

    区别描述如下: innerHTML 设置或获取位于对象起始和结束标签内的 HTML outerHTML 设置或获取对象及其内容的 HTML 形式 innerText 设置或获取位于对象起始和结束标签内 ...

  9. JS中innerHTML和innerText,outerHTML和outerText

      innerHTML 声明了元素含有的HTML文本,不包括元素本身的开始标记和结束标记 innerHTML是符合W3C标准的属性,而innerText只适用于IE浏览器(现在也适应chrome浏览器 ...

随机推荐

  1. 写给Java开发者的Node.JS简介

    前言 今天上推特看见这篇文章,点进去发现是新货. 正好最近想入Node的坑,又有一些Java基础,所以希望翻译出来给大家,同时也让自己加深理解. 才疏学浅,如有不妥之处请指正. 原文链接:Node f ...

  2. 分布式架构--Dubbo项目实战学习文档

    安装Dubbo注册中心(Zookeeper-3.4.6) 安装Dubbo管理控制台 Tomcat中部署web应用 ---- Dubbo服务消费者Web应用war包的部署 Dubbo监控中心的介绍与简易 ...

  3. 最简单的排序算法之一冒泡排序----js实现

    1. 算法步骤 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数. 针对所有的元素重复以上的步骤, ...

  4. Ext Js详解指南

    什么是Ext JS 走进Ext的世界 Ext JS是一款富客户端开发框架它基于javascript.HTML和CSS开发而成,无需安装任何插件即可在常用浏览器中创建出绚丽的页面效果. 个人总结Ext ...

  5. My97DatePicker.js 之无效日期设置

    1.下载并引用My97DatePicker.js 2.将工作日休假的和周末上班的维护到数据库中 3.取出某段时间内的不上班日期集合 /// <summary> ///获取 无效日期集合 1 ...

  6. find查找命令

    find # 格式 find [路径] [参数] [表达式] -exec 指令 {} \ ; -{} 代表find找到的文件 -\ 禁止转意 : 表示本行指令结束 # find /sbin -type ...

  7. 在vim中搜索单词

    基本的搜索: /pattern    向前搜索 ?pattern   向后搜索 n               向前重复搜索 N               向后重复搜索 搜索并替换 :%s/sear ...

  8. NodeJs之crypto

    NodeJs版本:4.4.4 crypto nodejs提供了内置加密模块crypto. 加密模块提供了 HTTP 或 HTTPS 连接过程中封装安全凭证的方法. 它也提供了 OpenSSL 的哈希, ...

  9. PAT---完美数列

    由于数值比较大,选用long型的 先用快速排序方法对数组进行排序,然后进行查找. 用一个问题是所要查找的数可能不在数组中,因此不能用现成的二叉查找法.试着对二叉查找法进行改进,单没调通. 在查找过程中 ...

  10. 为 instance 配置静态 IP - 每天5分钟玩转 OpenStack(157)

    这是 OpenStack 实施经验分享系列的第 7 篇. 传统运维中为服务器配置静态 IP 是再常见不过的了.但在 OpenStack 环境下只能指定 network,IP 都是 Neutron 从 ...