page contents

WEB前端教程:DOM 元素的添加与删除

学习 DOM 节点的插入和删除

attachments-2022-10-45rLcoXP6357538db4b55.png课程目标

  • 学习 DOM 节点的插入和删除
  • 掌握 DOM 文本内容和节点属性的编辑与修改
  • 学习使用 innerHTML 方法可能导致的安全问题

DOM 新增/插入/删除

现在我们将学习如何使用 JavaScript 实现 DOM 元素新建删除插入

学习完以上文档请您确保自己掌握了以下 DOM 方法:

DOM 元素创建

使用 document.createElement(tag)方法创建一个 

let img = document.createElement("img");

DOM 元素删除 使用 node.remove() 删除这个 dom 节点

<h1 id="headline">title</h1>;
const headline = document.querySelector("#headline");
headline.remove(); //删除了 headline

DOM 元素插入

使用 element.insertAdjacentHTML(position, htmlString)将 htmlString 根据位置添加/附加到 element 中。

<ul></ul>;
const fruits = ["apple", "banana", "orange"];
const list = document.querySelector("ul");

fruits.forEach((fruit) => {
  list.insertAdjacentHTML("beforeend", `<li>${fruit}</li>`);
});

将会得到 DOM 结构如下:

<ul>
  <li>apple</li>
  <li>banana</li>
  <li>orange</li>
</ul>

您可以使用 parentNode .appendChild( childNode )] 方法追加 childNode 作为 parentNode 的最后一个子节点

使用 parentNode .insertBefore( newNode , referenceNode )方法在 referenceNode 之前将 newNode 插入 parentNode

使用 parentNode.prepend(newNode)方勇 在 parentNode 的第一个子节点之前插入 newNode

编辑 DOM 元素

修改文本内容

element.textContent 返回 DOM 元素内部文本,可以通过它修改 DOM 内部文本值。

#修改 HTML 内容

如果您希望浏览器将 HTML 字符串呈现并解释为 HTML,则必须使用 innerHTML 属性

innerHTML 安全问题: XSS 攻击

如果您正在呈现的字符串来自您的用户(例如,来自用户可以填写的评论框的字符串),那么您应该避免使用 innerHTML,因为您的用户将能够在其中编写 HTML 和 JavaScript 代码您的页面可能会导致安全问题。这称为跨站点脚本 (XSS) 攻击。

这是一个例子。假设您有一个输入框:

<input id="name" type="text" />
<p id="showName"></p>

用户在评论框中写下以下代码:

<script>alert("你被黑客袭击了!");</script>

然后,您获取此用户输入并将其呈现为页面某处的 HTML 字符串: /* bca-disable */

let userComment = document.querySelector("#name").value; //"<script> alert("你被黑客袭击了!");</script>"
document.querySelector("#showName").innerHTML = userComment;

浏览器最终将运行该用户编写的脚本。用户可以做更多恶意的事情,比如将用户重定向到另一个网站,或者窃取他们的 cookie,从而允许攻击者冒充用户等。

所以底线是:如果您正在呈现的字符串来自您的用户,那么您应该坚持 element.textContent = string 并且永远不要更改该 innerHTML 属性,以避免在您的页面上出现不需要的 HTML。 /* bca-disable */

修改属性

HTML 元素可以有零个或多个属性,例如常见属性:class、id 和 disabled ,您可以使用与属性相关的通用方法来获取、设置和删除属性。

现在,我们就运用上面学习的 DOM 知识来实现留言板功能

下载DOM_TASK_CommentBoard.zip 压缩包 (opens new window),您将得到三个文件:index.js,index.html,style.css,保存到本地

为了让您集中练习今天学到的 DOM 知识,我们已经给出了 HTML 和 CSS 代码(有兴趣的同学可以自行实现),请您在 index.js 中实现以下功能:

  1. 渲染留言列表
  • 完成 renderComments 函数,使其为其接收 comments 数组中的每条留言构建一个 html 字符串,使用 insertAdjacentHTML 方法将其添加到 id 为 comments 的容器内。
  • 每条留言 html 模板字符串格式如下
  • 模板 html 中的内容相对应替换成 comments 数组中的值,比如:姓名替换为 comments 数组对象中的 name 属性值,日期替换成 time 属性值
  • 您可以假设 comments 数组的内容是安全的,格式如下。
  • 此外,留言列表的顺序应与数组中的顺序相同。因此,第一条留言应该首先显示在顶部。
<hr />
<h4>
  <span>姓名</span>
  <span class="date">日期</span>
</h4>
<p>留言内容</p>
const comments = [
  {
    name: "Danny",
    comment:
      "Lorem Ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam",
    time: "Thu Jan 12 2022",
  },
  {
    name: "Jackson",
    comment: "Lorem Ipsum dolor sit amet, consectetur adipiscing elit",
    time: "Thu Jan 11 2022",
  },
];
  1. 实现更新留言板

    • 点击留言按钮,触发 postComment 函数。
    • 实现 postComment ,获取姓名输入框和留言输入框的值,存入 comments 对象。
    • 实现添加提交的留言在留言板中,您需要注意安全问题,留言内容不完全信任,请使用 textContent 实现,以防止 xss 攻击
    • 新插入的留言应该位于留言板列表的第一条。

验证:

  • 输入姓名:<h1>黑客</h1>
  • 输入留言内容:<strong>哈哈你被攻击了!</strong>

输入以上内容, <h1>和<strong>标签不会起作用。

  1. 关闭/开启留言模式切换
    • 点击禁止留言按钮,触发 toggleComment 函数
    • 实现 toggleComment 函数,从而进行禁止留言和开启留言两种状态切换
      • 禁止留言模式:给留言按钮以及两个姓名和留言输入框添加禁用属性,并且禁止留言按钮文本变为开启留言
      • 开启留言模式:给留言按钮以及两个姓名和留言输入框删除禁用属性,并且禁止留言按钮文本变为关闭留言

attachments-2022-10-izrnV5Dh6357540f76162.gif

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

长按或扫描下方二维码,免费获取 Python公开课和大佬打包整理的几百G的学习资料,内容包含但不限于Python电子书、教程、项目接单、源码等等

attachments-2022-10-84zKVX7h635753bb40d74.jpg


0 条评论

请先 登录 后评论
小柒
小柒

1478 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章