使用 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. MongoDB Shard部署及Tag的使用

    Shard部署 准备测试环境 为准备数据文件夹 Cd  /home/tiansign/fanr/mongodb/Shard mkdir configdb1 configdb2 configdb3 mk ...

  2. Sql Server之旅——终点站 nolock引发的三级事件的一些思考

    曾今有件事情让我记忆犹新,那年刚来携程不久,马上就被安排写一个接口,供企鹅公司调用他们员工的差旅信息,然后我就三下五除二的给写好 了,上线之后,大概过了一个月...DBA那边报告数据库出现大量锁超时, ...

  3. redis k-v数据库、高速缓存、消息队列代理

    Redis 简介   Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的 ...

  4. 编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能

    package com.hanqi.test; //银行账号 public class account { private String zhanghao;//账号 //私有余额 private do ...

  5. javascript日历控件

    以前要用到日历控件都是直接从网上下载一套源码来使用,心里一直有个梗,就是想自己动手写一个日历控件,最近刚好来了兴趣,时间上也允许,于是自己摸索写了一个,功能还算完善,界面就凑合了.可能最值得说的一点就 ...

  6. 支付宝APP支付开发- IOException : DerInputStream.getLength(): lengthTag=127, too big.

    支付宝APP支付Java开发报错: IOException : DerInputStream.getLength(): lengthTag=127, too big. 后来排查是因为没有设置私钥.

  7. SmartPointer Smar指针

    #include<iostream> using namespace std; // private class for use by HasPtr only class U_Ptr { ...

  8. [转]OnKeyDown Numeric Validator CLIENT SIDE

    本文转自:http://forums.asp.net/t/1211724.aspx?OnKeyDown+Numeric+Validator+CLIENT+SIDE <!DOCTYPE html ...

  9. CF 371B Fox Dividing Cheese[数论]

    B. Fox Dividing Cheese time limit per test 1 second memory limit per test 256 megabytes input standa ...

  10. 关于反射blog

    非常好的Java反射例子   疯狂java   在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请浏览疯狂java ...