使用 Javascript 字符串创建并向 DOM 中添加元素与文本节点


innerHTML、outerHTML、textContent 及 insertAdjacentHTML() 属性和方法提供了使用 Javascript 字符串创建并向 DOM 中添加节点的功能。

<!DOCTYPE html>
<html lang='en'>
  <body>
    <div id='A'></div>
    <span id='B'></span>
    <div id='C'></div>
    <div id='D'></div>
    <div id='E'></div>

    <script>
      // 创建一个 strong 元素和文本节点,并添加到 DOM
      document.getElementById('A').innerHTML = '<strong>Hi</strong>';

      // 创建一个 div 元素和文本节点来替换 <span id='B'></span>
      // 注意 span#B 被替换掉了
      document.getElementById('B').outerHTML = '<div id="B">replace</div>';

      // 创建一个文本节点并用它更新 div#C
      document.getElementById('C').textContent = 'update';

      // 下面是非标准的扩展 例如,innerText 和 outerText

      // 创建一个文本节点,并用它更新 div#D
      document.getElementById('D').innerText = 'Keep it';

      // 创建一个文本节点,并用它替换 div#E (注意 div#E 没了)
      document.getElementById('E').outerText = 'real!';

    </script>
  </body>
</html>

经过 Javascript 部分的操作后,部分 DOM 树变成了这个样子:

<div id="A"><strong>Hi</strong></div>
<div id="B">replace</div>
<div id="C">update</div>
<div id="D">Keep it</div>
real!

innerHTML 属性会将字符串中找到的 HTML 元素都转换成实际的 DOM 节点,而 textContent 只能用来构造文本节点。如果你传给 textContent 的字符串包含 HTML 元素,它会直接按文本格式吐出来。

insertAdjacentHTML() 方法仅在 Element 节点上有效,是个比前述方法精准得多的方式。使用这个方法,就可以将节点插入到开标签之前,开标签之后,闭标签之前,以及闭标签之后:

<!DOCTYPE html>
<html lang='en'>
  <body>
    <i id='elm'>最近</i>

    <script>
      var elm = document.getElementById('elm');

      elm.insertAdjacentHTML('beforebegin', '<span>A</span>');
      elm.insertAdjacentHTML('afterbegin', '<span>B</span>');
      elm.insertAdjacentHTML('beforeend', '<span>C</span>');
      elm.insertAdjacentHTML('afterend', '<span>D</span>');
    </script>
  </body>
</html>

执行完 inline 的 Javascript 后, 部分 DOM 树如下:

<span>A</span>
<i id="elm">
  <span>B</span>
  最近
  <span>C</span>
</i>
<span>D</span>

next:

<!DOCTYPE html>
<html lang='en'>
  <body>
    <div id='A'>
      <strong>hanzichi</strong>
    </div>

    <script>
      console.log(document.querySelector('#A').innerHTML); //   <strong>hanzichi</strong>
      console.log(document.querySelector('#A').textContent); //   hanzichi
      console.log(document.querySelector('#A').innerText); // hanzichi

    </script>
  </body>
</html>

将 NodeList 或者 HTMLCollection 转换成 Javascript 数组


将节点列表与 HTML 集合转换成真正的 Javascript 数组可以有许多好处。其一,考虑到 NodeList 和 HTMLCollection 都是实时列表,这么做使得我们能够创建该列表的快照,不与实时 DOM 绑定。其二,转换列表成数组可以使用 Array 对象提供的方法。

// IE8 及之前无效
var arrayOfNodes = Array.prototype.slice.call(someNode.childNodes, 0);

// 兼容
function convertToArray(nodes) {
  var array = null;
  try {
    array = Array.prototype.slice.call(nodes, 0);
  } catch(ex) {
    array = [];
    for (var i = 0, len = nodes.length; i < len; i++)
      array.push(nodes[i]);
  }

  return array;
}

获取文档中当前聚焦/激活节点的引用


使用 document.activeElement,我们可以快速取得文档中聚焦/激活节点的引用。在如下代码中,当页面加载,我们将文档聚焦设为 <textarea> 节点然后使用 activeElement 属性取得该节点的引用:

<!DOCTYPE html>
<html lang='en'>
  <body>
    <textarea></textarea>

    <script>
      document.querySelector('textarea').focus();

      console.log(document.activeElement); // <textarea>
    </script>
  </body>
</html>

使用 document.hasFocus() 方法,可以知道用户当前是否聚焦在加载该 HTML文档的窗口上(并不是判断某元素是否是焦点)。在如下代码中,你可以看到当我们执行代码,然后聚焦在另一个窗口、标签或者应用程序时,getFocus() 会返回 false。

setTimeout(function() {
  console.log(document.hasFocus());
}, 5000);

《DOM启蒙》 随笔的更多相关文章

  1. "笨方法学python"

    <笨方法学python>.感觉里面的方法还可以.新手可以看看... 本书可以:教会你编程新手三种最重要的技能:读和写.注重细节.发现不同.

  2. 笨方法学python 22,前期知识点总结

    对笨方法学python,前22讲自己的模糊的单词.函数进行梳理总结如下: 单词.函数 含义 print() 打印内容到屏幕 IDLE 是一个纯Python下自带的简洁的集成开发环境 variable ...

  3. 《笨方法学python》随笔

    字符串 字符串可以包含格式化字符%s,只要将格式化的变量放到字符串中,再紧跟着一个百分号 %(percent), 再紧跟着变量名即可.唯一要注意的地方是, 如果你想要在字符串中通过格式化字符放入多个变 ...

  4. LPTHW 笨方法学python 19章

    本章节,我只是把所有的输出加上了自己的注释. #!/usr/bin/env python # -*- coding:utf-8 -*- def cheese_and_crakers(cheese_co ...

  5. 笨方法学python 33课

    今天Eiffel看到了第33章,任务是把一个while循环改成一个函数. 我在把while循环改成函数上很顺利,但是不知道怎么写python的主函数,在参数的调用上也出现了问题. 通过查资料,发现py ...

  6. 《笨方法学Python》加分题32

    注意一下 range 的用法.查一下 range 函数并理解它在第 22 行(我的答案),你可以直接将 elements 赋值为 range(0, 6) ,而无需使用 for 循环?在 python ...

  7. 《笨方法学Python》加分题33

    while-leep 和我们接触过的 for-loop 类似,它们都会判断一个布尔表达式的真伪.也和 for 循环一样我们需要注意缩进,后续的练习会偏重这方面的练习.不同点在于 while 循环在执行 ...

  8. 《笨方法学Python》加分题28

    #!usr/bin/python # -*-coding:utf-8-*- True and True print ("True") False and True print (& ...

  9. 《笨方法学Python》加分题20

    加分练习通读脚本,在每一行之前加注解,以理解脚本里发生的事情.每次 print_a_line 运行时,你都传递了一个叫 current_line 的变量,在每次调用时,打印出 current_line ...

  10. 《笨方法学Python》加分题17

    题目通过前学习的文件操作把一个文件中的内容拷贝到另一个文件中,并使用 os.path.exists 在拷贝前判断被拷贝的文件是否已经存在,之后由用户判断是否继续完成拷贝. 新知识os.path.exi ...

随机推荐

  1. python里面出现中文的时候报错 'ascii' codec can't encode characters in position

    编码问题,在头部添加 import sys reload(sys) sys.setdefaultencoding( "utf-8" ) http://www.xuebuyuan.c ...

  2. JavaScript Patterns 5.4 Module Pattern

    MYAPP.namespace('MYAPP.utilities.array'); MYAPP.utilities.array = (function () { // dependencies var ...

  3. ORACLE关于索引是否需要定期重建争论的整理

    ORACLE数据库中的索引到底要不要定期重建呢? 如果不需要定期重建,那么理由是什么? 如果需要定期重建,那么理由又是什么?另外,如果需要定期重建,那么满足那些条件的索引才需要重建呢?关于这个问题,网 ...

  4. SQLServer复合查询条件(AND,OR,NOT)对NULL值的处理方法

    在SQL的3值逻辑下,一个查询条件可以产生以下三种情况:TRUE,FALSE,NULL.只有那些满足WHERE子句的值是TRUE的记录才出现在结果表中. NULL值影响查询条件的结果,并且结果很微妙. ...

  5. coursera机器学习笔记-神经网络,初识篇

    #对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...

  6. PS网页设计教程——30个优秀的PS网页设计教程的中文翻译教程

    PS网页设计教程--30个优秀的PS网页设计教程的中文翻译教程   作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,"熟读唐诗三百首,不会作 ...

  7. 【hadoop】——window下elicpse连接hadoop集群基础超详细版

    1.Hadoop开发环境简介 1.1 Hadoop集群简介 Java版本:jdk-6u31-linux-i586.bin Linux系统:CentOS6.0 Hadoop版本:hadoop-1.0.0 ...

  8. 烂泥:使KVM显示VM的IP地址及主机名

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. KVM虚拟化学习已经有一段时间了,现在虚拟化软件比较多,对比了下目前使用比较多的VMware Vsphere.发现在不进入VM系统的情况下,Vspher ...

  9. Linux IPC System V 信号量

    模型 #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> ftok() //获取key ...

  10. 知道创宇研发技能表v3.1

    by @知道创宇(www.knownsec.com) @余弦 & 404团队 后续动态请关注微信公众号:Lazy-Thought 说明 关于知道创宇 知行合一 | 守正出奇 知道创宇是一家黑客 ...