博客列表 >表单元素获取,dom树的遍历与常用属性,dom元素的增删改, js操作元素内容,留言板实例,dataset对象,获取元素计算样式,classList 对象常用方法 ,事件的添加与派发

表单元素获取,dom树的遍历与常用属性,dom元素的增删改, js操作元素内容,留言板实例,dataset对象,获取元素计算样式,classList 对象常用方法 ,事件的添加与派发

赵大叔
赵大叔原创
2022年01月07日 22:26:09571浏览

获取表单元素

  • document.forms: 获取页面所有表单
  • form.id: 获取元素
  • form.id.name: 获取元素
  • form.id.name.value: 获取元素值
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>获取表单元素</title>
  8. <style>
  9. .login {
  10. width: 15em;
  11. border: 1px solid #888;
  12. border-radius: 0.5em;
  13. box-shadow: 5px 5px 5px #888;
  14. display: grid;
  15. grid-template-columns: 3em 1fr;
  16. gap: 0.5em 1em;
  17. }
  18. .login legend {
  19. padding: 0 0.5em;
  20. text-align: center;
  21. margin-bottom: 0.5em;
  22. font-weight: bolder;
  23. }
  24. .login button {
  25. grid-column: 2;
  26. }
  27. .login button:hover {
  28. cursor: pointer;
  29. background-color: lightcyan;
  30. }
  31. </style>
  32. </head>
  33. <body>
  34. <form action="login.php" method="post" id="login">
  35. <fieldset class="login">
  36. <legend>请登录</legend>
  37. <label for="email">邮箱:</label>
  38. <input type="email" name="email" id="email" value="help_10086@foxmail.com" autofocus />
  39. <label for="password">密码:</label>
  40. <input type="password" name="password" id="password" value="zh10086" />
  41. <button>提交</button>
  42. </fieldset>
  43. </form>
  44. <script>
  45. // 获取表单元素方式
  46. // console.log(document.forms[0]);
  47. // form.id
  48. // console.log(document.forms.login);
  49. // input:name,此时 name 相当于 id
  50. // console.log(document.forms.login.email);
  51. // value
  52. // console.log(document.forms.login.email.value);
  53. // 前后端数据交互, json
  54. let login = document.forms.login;
  55. let email = login.email.value;
  56. let password = login.password.value;
  57. console.log(email, password);
  58. // let user = { email: email, password: password };
  59. let user = { email, password };
  60. // 提交到服务器端/后端: json
  61. let data = JSON.stringify(user, null, 2);
  62. console.log(data);
  63. </script>
  64. </body>
  65. </html>

dom 树的遍历与常用属性

  • 节点类型:元素, 文本, 属性, 注释,文档…,通常只关注元素类型
  • 类数组: “类似”数组,像数组,但不是真正的数组,所以不能用数组上的方法
    类数组特征:
    • 具有从 0 开始递增的正整数索引
    • 具有 length 属性, 表示成员数量
  1. let list = document.querySelector(".list");
  2. // childNodes 所有类型元素
  3. console.log(list.childNodes);
  4. // children 元素类型元素
  5. console.log(list.children);
  6. // 类数组 ==> 真数组
  7. // 2.1 Array.from()
  8. console.log(Array.from(list.children));
  9. // 2.2 ...rest
  10. console.log([...list.children]);

dom 树的遍历

stt 语法 说明
1 firstElementChild 第一个
2 nextElementSibling 下一个
3 lastElementChild 最后一个
4 previousElementSibling 前一个
5 parentElment / parentNode 父节点
  1. <body>
  2. <div class="list">
  3. <div class="item">item1</div>
  4. <div class="item">item2</div>
  5. <div class="item">item3</div>
  6. <div class="item">item4</div>
  7. <div class="item">item5</div>
  8. <div class="item">item6</div>
  9. </div>
  10. </body>
  11. <script>
  12. // 1. 节点类型:元素, 文本, 属性, 注释,文档...
  13. // 通常只关注元素类型
  14. let list = document.querySelector(".list");
  15. // childNodes 所有类型元素
  16. console.log(list.childNodes);
  17. // children 元素类型元素
  18. console.log(list.children);
  19. // 2. 类数组: "类似"数组,像数组,但不是真正的数组,所以不能用数组上的方法
  20. // 类数组特征:
  21. // 1. 具有从0开始递增的正整数索引
  22. // 2. 具有length属性, 表示成员数量
  23. // 类数组 ==> 真数组
  24. // 2.1 Array.from()
  25. console.log(Array.from(list.children));
  26. // 2.2 ...rest
  27. console.log([...list.children]);
  28. // 3. 遍历
  29. //第一个, firstElementChild
  30. console.log([...list.children][0]);
  31. [...list.children][0].style.color = "blue";
  32. list.firstElementChild.style.background = "yellow";
  33. // 下一个兄弟, 第2个, nextElementSibling
  34. list.firstElementChild.nextElementSibling.style.background = "green";
  35. // 最后一个, lastElementChild
  36. list.lastElementChild.style.background = "yellow";
  37. // 前一个兄弟, previousElementSibling
  38. list.lastElementChild.previousElementSibling.style.background = "lightgreen";
  39. // 父节点/元素节点, parentElment / parentNode
  40. // ul.lastElementChild.parentElement.style.border = "4px solid";
  41. list.lastElementChild.parentNode.style.border = "4px solid red";
  42. </script>

DOM 元素的增删改操作

  • outerHTML: 元素的 html 字符串表示
  • cloneNode(true): 克隆节点, true, 复制元素后代的内容

插入元素

STT 语法 说明
1 document.createElement("ul") 创建 ul 元素
2 document.body.append(ul) 在 body 中添加 ul 元素
3 three.before(li) 在 three 元素节点前插入 li
4 three.after(cloneLi) 在 three 元素节点后插入克隆 li
5 insertAdjacentElement 在父节点的标签为插入点,进行插入元素
  • insertAdjacentElement: 在父节点的标签为插入点,进行插入元素
  • insertAdjacentElement(‘插入位置’, 元素)
  • afterBegin: 开始标签之后,第一个子元素
  • beforeBegin: 开始标签之前,是它的前一个兄弟元素
  • afterEnd: 结束标签之后,它的下一个兄弟元素
  • beforeEnd: 结束标签之前,它的最后一个子元素

替换元素:.replaceChild

  • ul.replaceChild(‘替换元素’, ‘被替换元素’);

删除元素:.remove

  • ul.lastElementChild.remove();
  1. <script>
  2. // 1. 创建元素,document 文档对象
  3. const ul = document.createElement("ul");
  4. // 2. 添加到页面中/html中: append
  5. document.body.append(ul);
  6. // 3. 为ul列表添加元素
  7. for (let i = 0; i < 5; i++) {
  8. const li = document.createElement("li");
  9. li.textContent = "item" + (i + 1);
  10. ul.append(li);
  11. }
  12. // 4.查看元素
  13. console.log(ul);
  14. // outerHTML: 元素的html字符串表示
  15. console.log(ul.outerHTML);
  16. // 5. 在节点之前插入: before
  17. const li = document.createElement("li");
  18. li.textContent = "new item";
  19. li.style.color = "red";
  20. const three = document.querySelector("ul li:nth-of-type(3)");
  21. three.before(li);
  22. // 6. 在节点之后插入 : after
  23. // cloneNode(true): 克隆节点, true, 复制元素后代的内容
  24. let cloneLi = li.cloneNode(true);
  25. three.after(cloneLi);
  26. // 7. 在父节点的标签为插入点,进行插入元素
  27. // insertAdjacentElement('插入位置', 元素)
  28. // 插入位置有四个
  29. // afterBegin: 开始标签之后,第一个子元素
  30. // beforeBegin: 开始标签之前,是它的前一个兄弟元素
  31. // afterEnd: 结束标签之后,它的下一个兄弟元素
  32. // beforeEnd: 结束标签之前,它的最后一个子元素
  33. ul.style.border = "1px solid";
  34. const h3 = document.createElement("h3");
  35. h3.textContent = "商品列表";
  36. ul.insertAdjacentElement("beforeBegin", h3);
  37. const p = document.createElement("p");
  38. p.textContent = "共计: 7 件";
  39. ul.insertAdjacentElement("afterEnd", p);
  40. // 8. 替换 replaceChild
  41. // 1. 插入点
  42. const last = document.querySelector("ul li:last-of-type");
  43. // 2. 插入的元素
  44. const a = document.createElement("a");
  45. a.href = "https://php.cn";
  46. a.textContent = "php.cn";
  47. // 3. 执行替换
  48. ul.replaceChild(a, last);
  49. // 9. 移除: remove
  50. ul.lastElementChild.remove();
  51. </script>

JS 操作元素内容的常用方法与异同

  • innerHTML: 可解析 html 字符, innerText: 不解析 html 字符
textContent 返回元素以及后代元素中的所有文本内容
innerText 返回元素以及后代中的文本
innerHTML 返回内部的 html 字符串
outerHTML 返回当前节点的自身的 html 字符串
.outerHTML = url; 替换
.outerHTML = none; 清空
  1. <script>
  2. const box = document.querySelector(".box");
  3. // textContent: 返回元素以及后代元素中的所有文本内容,包括 <style>, display:none的内容
  4. console.log(box.textContent);
  5. // innerText: 返回元素以及后代中的文本
  6. console.log(box.innerText);
  7. // innerHTML: 返回内部的html字符串
  8. console.log(box.innerHTML);
  9. // textContent, innerText ? textContent 首选, innerText,2016才成为w3c标准
  10. // innerText, innerHTML 区别?
  11. let p = document.createElement("p");
  12. let url = '<a href="https://php.cn">php.cn</a>';
  13. p.innerText = url;
  14. box.append(p);
  15. p = document.createElement("p");
  16. p.innerHTML = url;
  17. box.append(p);
  18. // innerHTML: 可解析html字符, innerText: 不解析html字符
  19. // outerHTML: 返回当前节点的自身的html字符串
  20. console.log(box.outerHTML);
  21. // 替换
  22. // box.outerHTML = url;
  23. // 清空/删除
  24. box.outerHTML = null;
  25. </script>

留言板实例

  • onkeydown: 按下键时触发
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>留言板实战</title>
  8. <style>
  9. * {
  10. margin: 0;
  11. padding: 0;
  12. box-sizing: border-box;
  13. }
  14. .content{
  15. margin: 20px 80px;
  16. display: flex;
  17. flex-direction: column;
  18. width: 460px;
  19. }
  20. .content > input{
  21. height: 38px;
  22. margin-bottom: 18px;
  23. font-size: 1.2rem;
  24. }
  25. .content > ul{
  26. margin-left: 13px;
  27. }
  28. .content > ul li{
  29. margin-right: 13px;
  30. }
  31. .content > ul > li > button{
  32. background-color: #85f0f8;
  33. margin-left: 13px;
  34. }
  35. </style>
  36. </head>
  37. <body>
  38. <div class="content">
  39. <!-- onkeydown: 按下键时触发 -->
  40. <input type="text" onkeydown="addMsg(this)" placeholder="请输入留言内容" autofocus />
  41. <ul class="list"></ul>
  42. </div>
  43. <script>
  44. function addMsg(ele) {
  45. console.log(ele);
  46. // event:保存了当前所有的事件信息,是当前事件的事件对象
  47. // event: 在事件方法中, 总是可用的
  48. console.log(event);
  49. console.log(event.key);
  50. if (event.key === "Enter") {
  51. // 1. 获取留言列表的容器
  52. const ul = document.querySelector(".list");
  53. // 2. 判断留言是否为空?
  54. if (ele.value.length === 0) {
  55. alert("留言内容不能为空");
  56. ele.focus();
  57. return false;
  58. }
  59. // 3. 添加一条新留言
  60. const li = document.createElement("li");
  61. // li.textContent = ele.value;
  62. // ul.append(li);
  63. // before
  64. // ul.firstElementChild.before(li);
  65. // 插入到起始标签的后面就永远是第一条
  66. // 添加删除留言功能
  67. li.innerHTML = ele.value + "<button onclick='del(this.parentNode)'>删除</button>";
  68. ul.insertAdjacentElement("afterBegin", li);
  69. // 4. 清空留言的输入框,为下一次做准备
  70. ele.value = null;
  71. // 5. 重置焦点到留言框中,方便用户更次输入
  72. ele.focus();
  73. }
  74. }
  75. // 删除功能
  76. function del(ele) {
  77. return confirm("是否删除?") ? ele.remove() : false;
  78. }
  79. </script>
  80. </body>
  81. </html>

dataset 对象

  • 元素属性有二类:
    1. 内置的预定义属性, 如 id, class,title,style 等
    1. 用户自定义属性,主要用于 js 脚本控制, 以 “data-“”为前缀,如 data-key
  • 自定义属性还可以将一些数据保存到标签中
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>自定义属性: dataset对象</title>
  8. </head>
  9. <body>
  10. <!--
  11. * 元素属性有二类:
  12. * 1. 内置的预定义属性, 如 id, class,title,style等
  13. * 2. 用户自定义属性,主要用于js脚本控制, 以 "data-""为前缀,如 data-key
  14. -->
  15. <div class="btn-group">
  16. <!-- onclick: 内置/预定义事件属性 -->
  17. <!-- data-index: 自定义属性 -->
  18. <button data-index="1" onclick="getIndex(this)">btn1</button>
  19. <button data-index="2" onclick="getIndex(this)">btn2</button>
  20. <button data-index="3" onclick="getIndex(this)">btn3</button>
  21. </div>
  22. <!-- 自定义属性还可以将一些数据保存到标签中 -->
  23. <!-- data-emial, data-work-unit -->
  24. <div class="user" data-email="498668472@qq.com" data-work-unit="php中文网">猪老师</div>
  25. <script>
  26. function getIndex(btn) {
  27. // 通过自定义属性data-index的值,知道我点的是哪一个?
  28. // dataset.prop, "data-"一定要省略掉
  29. console.log("点击了第 ", btn.dataset.index, " 个按钮");
  30. }
  31. const user = document.querySelector(".user");
  32. console.log(user.dataset.email);
  33. // work-unit ==> workUnit
  34. console.log(user.dataset.workUnit);
  35. // dataset 可读可写
  36. user.dataset.workUnit = "php.cn";
  37. console.log(user.dataset.workUnit);
  38. </script>
  39. </body>
  40. </html>

获取元素的计算样式

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>JS操作CSS</title>
  8. <style>
  9. div {
  10. width: 150px;
  11. height: 100px;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. <div style="color: #ff009d; background-color: #e7ebe7">Help_10086</div>
  17. <script>
  18. const div = document.querySelector("div");
  19. // 行内样式,style
  20. console.log(div.style.color);
  21. console.log(div.style.backgroundColor);
  22. // console.log(div.style.width);
  23. // console.log(div.style.height);
  24. // 计算样式: 内部<style>或外部 如 style.css
  25. console.log(window.getComputedStyle(div).width);
  26. console.log(window.getComputedStyle(div).height);
  27. console.log(window.getComputedStyle(div).backgroundColor);
  28. const width = window.getComputedStyle(div).width;
  29. console.log(width, typeof width);
  30. // 150px ===> 150
  31. console.log(typeof parseInt(width));
  32. div.style.width = parseInt(width) + 100 + "px";
  33. </script>
  34. </body>
  35. </html>

classList 对象常用方法

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>JS操作class属性: classList对象</title>
  8. <style>
  9. .red {
  10. color: red;
  11. }
  12. .bgc {
  13. background-color: yellow;
  14. }
  15. .blue {
  16. color: blue;
  17. }
  18. .bd {
  19. border: 5px solid #686464;
  20. }
  21. </style>
  22. </head>
  23. <body>
  24. <h2>Help_10086</h2>
  25. <script>
  26. // 1.传统方式
  27. const h2 = document.querySelector("h2");
  28. // h2.className = "red bgc";
  29. // 2. classList对象
  30. // add: 添加class
  31. h2.classList.add("red");
  32. h2.classList.add("bgc");
  33. // contains: 判断是否存在
  34. console.log(h2.classList.contains("bgc"));
  35. // remove: 移除class
  36. h2.classList.remove("bgc");
  37. // replace: 替换class
  38. h2.classList.replace("red", "blue");
  39. // toggle: 切换 class
  40. // 如果已存在 bd, 则执行remove 移除操作, 否则执行 add 添加操作
  41. h2.classList.toggle("bd");
  42. </script>
  43. </body>
  44. </html>

事件的添加与派发

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>事件的添加与删除</title>
  8. </head>
  9. <body>
  10. <button>元素对象</button>
  11. <button>元素事件监听器</button>
  12. <button>事件派发/点击广告赚钱</button>
  13. <script>
  14. const btn1 = document.querySelector("button:first-of-type");
  15. // 添加
  16. btn1.onclick = function () {
  17. console.log(event);
  18. };
  19. // 删除事件
  20. btn1.onclick = null;
  21. // 事件监听器
  22. const btn2 = document.querySelector("button:nth-of-type(2)");
  23. function show() {
  24. console.log(event);
  25. }
  26. // 事件回调方法不能移除,必须是命名函数才可以
  27. btn2.addEventListener("click", show, false);
  28. btn2.removeEventListener("click", show, false);
  29. // 事件派发
  30. const btn3 = document.querySelector("button:nth-of-type(3)");
  31. // 先添加一个事件,然后自动去的触发它
  32. let i = 0;
  33. btn3.addEventListener(
  34. "click",
  35. () => {
  36. console.log("恭喜你,又赚了 : " + i + "元");
  37. i += 0.8;
  38. },
  39. false
  40. );
  41. // 创建一个自定义事件
  42. const myclick = new Event("click");
  43. // btn3.dispatchEvent(myclick);
  44. // btn3.dispatchEvent(myclick);
  45. // btn3.dispatchEvent(myclick);
  46. // btn3.dispatchEvent(myclick);
  47. // btn3.dispatchEvent(myclick);
  48. // btn3.dispatchEvent(myclick);
  49. // setTimeout()一次性定时器
  50. // setTimeout(() => btn3.dispatchEvent(myclick), 2000);
  51. // setInterval: 间歇式的定时器,不停重复执行
  52. setInterval(() => btn3.dispatchEvent(myclick), 2000);
  53. </script>
  54. </body>
  55. </html>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议