From 0679cae485004e08df3f8c36f05786fae96eb81a Mon Sep 17 00:00:00 2001 From: LeviDing Date: Sat, 21 Mar 2020 17:44:19 +0800 Subject: [PATCH 1/5] Update article.md --- .../07-modifying-document/article.md | 226 +++++++++--------- 1 file changed, 112 insertions(+), 114 deletions(-) diff --git a/2-ui/1-document/07-modifying-document/article.md b/2-ui/1-document/07-modifying-document/article.md index 5cc3217961..9bf1ed07f3 100644 --- a/2-ui/1-document/07-modifying-document/article.md +++ b/2-ui/1-document/07-modifying-document/article.md @@ -1,16 +1,14 @@ -# 修改文档内容 +# 修改文档(document) -DOM(document object model 文档对象模型,此文中全部以缩写 DOM 表示)的可修改性是网页能“实时”刷新的关键。 +DOM 修改是创建“实时”页面的关键。 -以下的例子向我们展示如何创建一个“弹幕”新元素并且修改它在页面中展示的内容。 +在这里,我们将会看到如何“即时”创建新元素并修改现有页面内容。 -这里我们先展示出一个简单的例子,随后会逐一向你说明。 +## 例子:展示一条消息 -## 例子:展示一条信息 +让我们使用一个示例进行演示。我们将在页面上添加一条比 `alert` 更好看的消息。 -首先,我们可以看到一条信息,它看起来像是一个美化版的 `alert`。 - -这里是它的样式: +它的外观如下: ```html autorun height="80" ``` +## 节点移除 +想要移除一个节点,可以使用 `node.remove()`。 +让我们的消息在一秒后消失: +```html run untrusted + + - ``` - -`parentElem.insertBefore(node, nextSibling)` -: 在 `parentElem` 的 `nextSibling` 插入 `node`。 - - 下面这段代码在第二个 `
  • ` 标签前面插入一个新列表项: - - ```html run height=100 -
      -
    1. 0
    2. -
    3. 1
    4. -
    5. 2
    6. -
    - - ``` - 如果需要把 `newLi` 插入成为第一个子元素,我们可以这样做: - - ```js - list.insertBefore(newLi, list.firstChild); - ``` - -`parentElem.replaceChild(node, oldChild)` -: 将 `parentElem` 的 `oldChild` 替换为 `node`。 - -所有这些插入节点的操作都会返回节点。换句话说,`parentElem.appendChild(node)` 返回 `node`。但是通常返回的节点都没有用,只是插入方法的默认返回值。 - -以上方法都是“旧三板斧”:它们从很早就存在,我们在老的脚本里能看到它们的影子。很不幸的是它们不够灵活。 + document.body.append(div); +*!* + setTimeout(() => div.remove(), 1000); +*/!* + +``` -例如,我们怎样在 **html** 插入字符串呢?又或者,给定你一个节点,如何在不引用其父节点的情况下删除它?虽然也能完成需求开发,总归不是那么优雅的解决方式。 +请注意:如果我们要将一个元素 **移动** 到另一个地方,则无需将其从原来的位置中删除。 -所以诞生了两种优雅插入方法来代替这些繁琐的插入操作。 +**所有插入方法都会自动从旧位置删除该节点。** +例如,让我们进行元素交换: +```html run height=50 +
    First
    +
    Second
    + +``` ## 克隆节点:cloneNode @@ -335,7 +315,6 @@ after ``` - ## 文档片段(DocumentFragment) [#document-fragment] `DocumentFragment` 是一个特殊的 DOM 节点,用于传递节点列表的包装器。 @@ -400,64 +379,86 @@ ul.append(...getListContent()); // append + “...” 操作符 = 一对好朋 ``` + + + + + + + + + + + + 我们在这里提及 `DocumentFragment` 主要是因为有一些概念是基于它的,比如 [模板](info:template-element) 元素,我们将在后面的章节中详细介绍它。 +`parentElem.appendChild(node)` +: 将 `node` 作为 `parentElem` 最后一个子元素。 -## 移除 + 可以看到增加了一个 `
  • ` 在 `
      ` 的最末尾: -想要移除节点,可以通过以下方法: + ```html run height=100 +
        +
      1. 0
      2. +
      3. 1
      4. +
      5. 2
      6. +
      + + ``` + +`parentElem.insertBefore(node, nextSibling)` +: 在 `parentElem` 的 `nextSibling` 插入 `node`。 + + 下面这段代码在第二个 `
    1. ` 标签前面插入一个新列表项: + + ```html run height=100 +
        +
      1. 0
      2. +
      3. 1
      4. +
      5. 2
      6. +
      + + ``` + 如果需要把 `newLi` 插入成为第一个子元素,我们可以这样做: + + ```js + list.insertBefore(newLi, list.firstChild); + ``` + +`parentElem.replaceChild(node, oldChild)` +: 将 `parentElem` 的 `oldChild` 替换为 `node`。 + +所有这些插入节点的操作都会返回节点。换句话说,`parentElem.appendChild(node)` 返回 `node`。但是通常返回的节点都没有用,只是插入方法的默认返回值。 + +以上方法都是“旧三板斧”:它们从很早就存在,我们在老的脚本里能看到它们的影子。很不幸的是它们不够灵活。 + +例如,我们怎样在 **html** 插入字符串呢?又或者,给定你一个节点,如何在不引用其父节点的情况下删除它?虽然也能完成需求开发,总归不是那么优雅的解决方式。 + +所以诞生了两种优雅插入方法来代替这些繁琐的插入操作。 -`node.remove()` -: 从当前位置移除 `node`。 -能看出第二个方法更加简洁,第一个方法的存在是有其历史原因的。 -````smart -如果我们想要**移动**一个元素到另一个地方 —— 不需要移除旧的元素。 -**所有插入操作都会从节点原来的位置把节点移除掉。** -例如,这里有一些嵌套的元素: -```html run height=50 -
      First
      -
      Second
      - -``` -```` -使信息一秒后消失: -```html run untrusted - - -``` ## 聊一聊 "document.write" From e7048185b4b29af9a48deff901a751c76e39b6b5 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Sat, 21 Mar 2020 19:50:45 +0800 Subject: [PATCH 3/5] Update article.md --- .../07-modifying-document/article.md | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/2-ui/1-document/07-modifying-document/article.md b/2-ui/1-document/07-modifying-document/article.md index 268e9ab1db..f740ac39b5 100644 --- a/2-ui/1-document/07-modifying-document/article.md +++ b/2-ui/1-document/07-modifying-document/article.md @@ -280,15 +280,15 @@ after ## 克隆节点:cloneNode -怎么插入多条相同的信息? +如何再插入一条类似的消息? -我们可以声明一个函数来实现这个方法。但是怎样通过**克隆**的方式来替换掉那些原本存在的 `div` 并且更改里面的文本(如果有这样一个需求)。 +我们可以创建一个函数,并将代码放在其中。但是另一种方法是 **克隆** 现有的 `div`,并修改其中的文本(如果需要)。 -如果我们有一个很大的元素,克隆的方式要远比创建后插入来的更简单,性能也更好。 +当我们有一个很大的元素时,克隆的方式可能更快更简单。 -- `elem.cloneNode(true)` 方法用来对一个元素进行“深”克隆 —— 包括所有特性和子元素。`elem.cloneNode(false)` 方法只克隆该元素本身,不对子元素进行克隆。 +调用 `elem.cloneNode(true)` 来创建元素的一个“深”克隆 — 具有所有特性(attribute)和子元素。如果我们调用 `elem.cloneNode(false)`,那克隆就不包括子元素。 -一个复制信息的例子: +一个拷贝消息的示例: ```html run height="120"