用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属性结果与此相同。

最新文章

  1. pageX,clientX,offsetX,layerX的区别
  2. VS2013中C++创建DLL导出class类
  3. Top与ROW_NUMBER
  4. 解决Socket粘包问题——C#代码
  5. 你应该知道的jQuery技巧【收藏】
  6. CVE-2017-11882漏洞 Msf利用复现
  7. 正确理解python的装饰器
  8. String构造函数
  9. 《React Native 精解与实战》书籍连载「React Native 底层原理」
  10. jquery 返回浏览器顶部
  11. List does not exist. The page you selected contains a list that does not exist. It may have been deleted by another user
  12. tomcat远程部署war包,显示连接被重置
  13. CRM WEB UI 04明细界面添加按钮
  14. [UE4]关于分支Sequence和条件分支的组合用法
  15. Javascript图片预加载详解 分类: JavaScript HTML+CSS 2015-05-29 11:01 768人阅读 评论(0) 收藏
  16. http协议格式
  17. 【爬坑】python3+pyqt5+pyinstaller 打包成exe的各种问题
  18. Resources in Visual Tracking
  19. 学习 HMM
  20. centsos各个版本的区别

热门文章

  1. C# 10 完整特性介绍
  2. 说说 VARCHAR 背后的那些事
  3. Python实现AI图像识别-身份证识别
  4. windows中抓取hash小结(下)
  5. Linux 进程间传递文件描述符
  6. Spring中为什么不建议使用字段注入
  7. NLP与深度学习(一)NLP任务流程
  8. 深层剖析鸿蒙轻内核M核的动态内存如何支持多段非连续性内存
  9. 《深入浅出vue.js》阅读笔记之数组变化侦测
  10. Mysql 之 IFNULL(expr1,expr2) 对空不可判