用JavaScript操作DOM时,经常有生成复杂HTML结构的需求。此时,通常不是用标准DOM接口(如createElement()setAttribute()append()等)来语句式地生成,而是直接给innerHTMLouterHTML属性赋值HTML代码字符串,让DOM自动解析。显然,这样既方便,又容易阅读和理解。不过,这里面有一个不容易察觉的坑,那就是异步性问题

经过实验验证,得到如下结论:

  • innerHTMLinnerText的赋值是同步的;
  • outerHTMLouterText赋值是异步的!

所以,在使用outerHTML时要注意到这一点,避免想当然地认为做完了赋值就等于DOM已经变化好了。

如果outerHTML赋值之后的代码依赖于该DOM变化的结果,则不应该使用outerHTML,而应该改用innerHTML。对于innerHTML所属的元素,则可以用DOM接口方法来改变其状态。这些都是同步的,可以确信DOM已经发生了变化。

实验验证

实验代码如下:

<div id="inner-test">
<p>inner</p>
</div>
<div id="outer-test">
<p>outer</p>
</div> <script>
let innerTest = document.querySelector("#inner-test");
console.group("inner测试:");
console.log("赋值前读:", innerTest.innerHTML);
innerTest.innerHTML = "<h2>NEW INNER</h2>"; // 赋值
console.log("赋值后读:", innerTest.innerHTML);
console.log("获取后代:", innerTest.querySelector("h2"));
console.groupEnd(); let outerTest = document.querySelector("#outer-test");
console.group("outer测试:");
console.log("赋值前读:", outerTest.outerHTML);
outerTest.outerHTML = "<h2>NEW OUTER</h2>"; // 赋值
console.log("赋值后读:", outerTest.outerHTML);
console.log("获取后代:", outerTest.querySelector("h2"));
console.groupEnd();
</script>

在浏览器中运行之,页面显示结果为:

控制台输出结果为:

可以看到,innerHTML赋值后再读,得到的是新值,获取新后代也成功,这意味着在第二次读之前,DOM已经完成了变化。此即说明innerHTML的赋值是同步的。

但是,outerHTML赋值后再读,得到的仍然是旧值,获取新后代也失败,这意味着在第二次读时,DOM还没有发生变化。此即说明outerHTML的赋值是异步的:做outerHTML = "……"时,实际上就跟setTimeout(……, 0)一样是开启了另一个线程,DOM的变化由这个新线程来做,原线程中立刻继续往后执行,此时DOM还未来得及变成新的,所以结果仍然是旧值。

innerTextouterText属性结果与此相同。

outerHTML和outerText的赋值是异步的的更多相关文章

  1. vue-learning:12 - 2 - 区分:outerHTML - innerTHML - outerText - innerText - textContent

    区分:outerHTML - innerTHML - outerText - innerText - textContent 获取值 <div id="outer"> ...

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

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

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

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

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

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

  5. DOM中的outerHTML,innerHTML,outerText,innerText的区别

    --转自http://blog.163.com/yw_0721/blog/static/7164579720102932157759/ 简单的说innerHTML和outerHTML.innerTex ...

  6. JS中innerHTML和innerText,outerHTML和outerText

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

  7. innerHTML,outerHTML,innerText,outerText区别以及insertAdjacentHTML()方法

    在需要给文档插入大量的新的HTML标记的情况下,通过多次DOM操作先创建节点再指定它们之间的关系会非常麻烦而且效率不高,相对而言插入标记的方法会更加简单,速度也更快. 插入标记中有这四个属性inner ...

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

    我们在用JS/JQ 获取或设置元素内容的时候,通常是获取或设置指定元素之间的内容 <script> //JS document.getElementById('test').innerHT ...

  9. innerHTML/outerHTML; innerText/outerText; textContent

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

随机推荐

  1. ip地址分配

    目录 一.子网划分基础 二.子网划分的原理 三.IP地址汇总 四.ip地址规划 一.子网划分基础 二进制: 特点:基数为2,数值部分用2个不同的数字符号0.1表示逢二进一 IP地址:IP地址由32位二 ...

  2. Java注解如何对属性动态赋值

    学而不思则罔,思而不学则殆 前言 大家都用过Spring的@Value("xxx")注解,如果没有debug过源码的同学对这个操作还是一知半解,工作一年了学了反射学了注解,还是不会 ...

  3. Linux中配置ftp传输

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  4. 十分钟带你了解CANN应用开发全流程

    摘要:CANN作为昇腾AI处理器的发动机,支持业界多种主流的AI框架,包括MindSpore.TensorFlow.Pytorch.Caffe等,并提供1200多个基础算子. 2021年7月8日,第四 ...

  5. 玩转Java8日期工具类-基础

    内容基于的是 Java8官方文档,以及Java时间类总结 的总结.BTW:其实具体方法的使用直接在IDEA中看源码更方便直接. 1.老一辈:Java.util.Date Java.sql.Date J ...

  6. 【笔记】偏差方差权衡 Bias Variance Trade off

    偏差方差权衡 Bias Variance Trade off 什么叫偏差,什么叫方差 根据下图来说 偏差可以看作为左下角的图片,意思就是目标为红点,但是没有一个命中,所有的点都偏离了 方差可以看作为右 ...

  7. DVWA靶场之SQL injection(blind)通关

    盲注,顾名思义,无法从界面上直接查看到执行结果,一般的SQL注入基本绝迹,最多的就是盲注 基本步骤:(由于没有回显了,相比一般的SQL注入,也就不需要确定查询字段数.判断回显位置了) 判断注入类型 破 ...

  8. 51单片机—LCD1602显示模块

    文章目录 - 什么是LCD1602 - 如何操作LCD1602 - 上代码 - 什么是LCD1602 LCD:Liquid Crystal Display-液晶显示器,简称LCD,其主要显示原理是以电 ...

  9. SQL 练习30

    查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况) SELECT Student.*,CId,score from Student LEFT JOIN SC ON Student.SId = ...

  10. NOIP 模拟 $17\; \rm 时间机器$

    题解 \(by\;zj\varphi\) 一道贪心的题目 我们先将节点和电阻按左边界排序,相同的按右边界排序 对于每一个节点,我们发现,选取左边界小于等于它的电阻中右边界大于它且最接近的它的一定是最优 ...