欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS获取表单元素、dom树遍历增删改、操作元素内容、自定义属性、操作css、事件小结

程序员文章站 2022-03-03 21:19:49
...
  1. 实例演示如何正确优雅的获取表单元素 2. 实例演示dom树的遍历与常用属性 3. 实例演示dom元素的增删改操作 4. js操作元素内容的几个常用方法,并分析异同 5. 将留言板的实战案例进行仿写,加上一些样式 6. 实例演示 dataset对象 7. 实例演示如何获取元素的计算样式 8. 实例演示 classList 对象常用方法 9. 实例演示事件的添加与派发

1. 获取表单元素

  1. <!DOCTYPE html>
  2. <html lang="en">
  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. <style>
  11. .form {
  12. width: 20em;
  13. display: grid;
  14. grid-template-columns: 1fr;
  15. gap: 0.5em 1em;
  16. }
  17. input {
  18. text-align: center;
  19. }
  20. </style>
  21. <form class="form" id="form">
  22. <input type="text" name="user" placeholder="输入用户名" />
  23. <input type="text" name="pass" placeholder="输入密码" />
  24. <button>提交</button>
  25. <script>
  26. // 传统获取方式:上一课讲的两个API
  27. // 获取表单
  28. let form = document.querySelector(".form");
  29. // 获取用户
  30. let user = document.querySelector("input[name='user']");
  31. // 获取密码
  32. let pass = document.querySelector("input[name='pass']");
  33. console.log(form);
  34. console.log(user);
  35. console.log(pass);
  36. // 推荐方式:用document.forms属性.name属性值(或id值)
  37. user = document.forms.form.user;
  38. pass = document.forms.form.pass;
  39. user.value = "超人";
  40. pass.value = "123456789";
  41. // 前后端数据交互、
  42. form = document.forms.form;
  43. user = form.user.value;
  44. pass = form.pass.value;
  45. // 转为json
  46. let users = { user, pass };
  47. // 用函数转为json字符串
  48. let data = JSON.stringify(users);
  49. console.log(data);
  50. </script>
  51. </form>
  52. </body>
  53. </html>

2. dom树的遍历

  1. <!DOCTYPE html>
  2. <html lang="en">
  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>遍历DOM树</title>
  8. </head>
  9. <body>
  10. <ul class="list">
  11. <li class="item">项目1</li>
  12. <li class="item">项目2</li>
  13. <li class="item">项目3</li>
  14. <li class="item">项目4</li>
  15. <li class="item">项目5</li>
  16. <li class="item">项目6</li>
  17. </ul>
  18. <script>
  19. // 1. 节点类型:元素、文本、属性、注释、文档
  20. // 通常只关注元素类型
  21. let Ul = document.querySelector(".list");
  22. let items = Ul.children;
  23. // 上条获得的items类型是HTMLCollection
  24. // 获得的是类数组,不是数组,不能用数组的方法
  25. // 类数组特征:
  26. // 有从0开始递增的正整数索引
  27. // 有length属性
  28. console.log(items);
  29. // 2. 转化为真数组
  30. // 2.1 用函数转化
  31. let Li = Array.from(items);
  32. // 现在items类型是Array数组了,可以用数组的方法引用
  33. console.log(Li);
  34. // 2.2 用...rest转化
  35. let Li_items = [...items];
  36. console.log(Li_items);
  37. Li[0].style.fontSize = "3em";
  38. // 3. 用语法糖遍历
  39. // 第一个子元素
  40. Ul.firstElementChild.style.color = "red";
  41. // 下一个兄弟元素
  42. Ul.firstElementChild.nextElementSibling.style.color = "blue";
  43. // 最后一个子元素
  44. Ul.lastElementChild.style.fontSize = "2em";
  45. // 前一个兄弟元素
  46. Ul.lastElementChild.previousElementSibling.style.color = "red";
  47. </script>
  48. </body>
  49. </html>
  • 我个人觉得数组好用,老师说语法糖比较优雅

3. dom元素的增删改

  1. <!DOCTYPE html>
  2. <html lang="en">
  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>dom元素的增删改</title>
  8. </head>
  9. <body>
  10. <script>
  11. // 1. 创建元素
  12. const h3 = document.createElement("h3");
  13. // 2.添加到页面中
  14. document.body.append(h3);
  15. h3.textContent = "创建的元素";
  16. // 创建ul元素
  17. const ul = document.createElement("ul");
  18. document.body.append(ul);
  19. // 创建列表项
  20. for (i = 0; i < 6; i++) {
  21. const li = document.createElement("li");
  22. li.textContent = "项目" + (i + 1);
  23. ul.append(li);
  24. }
  25. console.log(ul);
  26. console.log(ul.outerHTML);
  27. // 3. 插入节点
  28. // 示例:在第四个节点前后插入列表项
  29. const li = document.createElement("li");
  30. // 设置列表内容和样式
  31. li.textContent = "新的项目";
  32. li.style.fontSize = "3em";
  33. // 获取第四个节点
  34. const li_four = document.querySelector("li:nth-of-type(4)");
  35. // 在节点前插入新列表项
  36. li_four.before(li);
  37. // 克隆列表,用colenNode方法,true复制后代内容,即文本
  38. const li_copy = li.cloneNode(true);
  39. // 在节点后插入
  40. li_four.after(li_copy);
  41. // 以父节点标签为插入点,进行插入元素示例
  42. // 语法:insertAdjacentElement('插入位置',元素)
  43. // 插入位置有四个:可以不分大小写
  44. // afterBegin:开始标签后的第一个子元素
  45. // beforeBegin:开始标签之前的兄弟元素
  46. // afterEnd:结束标签之后的兄弟元素
  47. // beforeEnd:结束标签之前的子元素
  48. // 例:在上面列表前插入h4
  49. const h4 = document.createElement("h4");
  50. h4.textContent = "新列表";
  51. ul.insertAdjacentElement("beforebegin", h4);
  52. // 例:在列表后插入p
  53. const p = document.createElement("p");
  54. p.textContent = "共计8个项目";
  55. ul.insertAdjacentElement("afterEnd", p);
  56. // 4. 替换节点语法: replaceChild(新节点,替换的节点)
  57. // 获取要替换的节点
  58. const li_replace = document.querySelector("li:nth-of-type(8)");
  59. // 创建要替换的元素
  60. const a = document.createElement("a");
  61. a.textContent = "php.cn";
  62. a.href = "https://php.cn";
  63. // 调用函数替换
  64. ul.replaceChild(a, li_replace);
  65. // 5. 删除节点:获取要删除的节点,使用 remove()方法
  66. document.querySelector("li:nth-of-type(7)").remove();
  67. </script>
  68. </body>
  69. </html>

4. js操作元素内容

  1. <!DOCTYPE html>
  2. <html lang="en">
  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操作元素内容</title>
  8. </head>
  9. <body>
  10. <div class="box">
  11. <style>
  12. h3 {
  13. color: crimson;
  14. }
  15. </style>
  16. <h3>聚餐通知</h3>
  17. <p>公司全体员工:</p>
  18. <p>今天晚上全体在食堂聚餐,加菜,全羊宴!</p>
  19. </div>
  20. <script>
  21. // 查看元素内容textContent、innerHtml、innerText的不同
  22. const div = document.querySelector(".box");
  23. // textContent:返回元素及后代元素中所有文本内容,包括h3样式的内容
  24. console.log(div.textContent);
  25. // innerHTML:返回文本内容包含标签字符串
  26. console.log(div.innerHTML);
  27. // innerText:只返回元素以及后代中的文本
  28. console.log(div.innerText);
  29. // outerHTML:返回当前节点的html字符串
  30. console.log(div.outerHTML);
  31. // 小结:首选textContent
  32. // 清空
  33. div.outerHTML = null;
  34. </script>
  35. </body>
  36. </html>

5. DOM实战:留言板

  1. <!DOCTYPE html>
  2. <html lang="en">
  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>DOM实战:留言板</title>
  8. </head>
  9. <body>
  10. <style>
  11. input {
  12. width: 30em;
  13. height: 1.5rem;
  14. }
  15. li {
  16. margin: 0.4em;
  17. }
  18. </style>
  19. <!-- 按下键时触发 -->
  20. <input type="text" placeholder="输入留言" onkeydown="addMsg(this)" />
  21. <hr />
  22. <p>留言:</p>
  23. <ul class="msgList"></ul>
  24. <script>
  25. // 定义触发函数,接收传递的元素
  26. function addMsg(inputText) {
  27. // 判断按下的键是否是回车,回车就记录输入的留言。
  28. // 用event对象的key值是否是“enter”判断
  29. // event对象包含当前事件的所有信息,是当前事件的对象
  30. if (event.key === "Enter") {
  31. // 判断留言是否为空。这个判断语句不完善,根据长度判断也不完善
  32. if (inputText.value === "") {
  33. alert("留言不能为空");
  34. // 重新激活输入框
  35. inputText.focus();
  36. return false;
  37. }
  38. // 获取留言列表
  39. const ul_Msg = document.querySelector(".msgList");
  40. // 添加留言,带删除按键,调用删除函数。
  41. const li = document.createElement("li");
  42. li.innerHTML = `${inputText.value}<button onclick="del(this.parentNode)">删除</button>`;
  43. // 留言添加到ul开始元素后面,这样确保最新留言在最前
  44. ul_Msg.insertAdjacentElement("afterbegin", li);
  45. // 清空留言框
  46. inputText.value = null;
  47. // 重新激留言框
  48. inputText.focus();
  49. }
  50. }
  51. // 定义删除函数,接收传递的li删除
  52. function del(li_del) {
  53. // 删除前用户确认,用函数confirm("提示信息")
  54. // 点确定返回true,点取消返回false
  55. return confirm("是否删除此留言?") ? li_del.remove() : false;
  56. }
  57. </script>
  58. </body>
  59. </html>

6. 自定义属性: dataset对象

元素属性有二类:

  • 内置的预定义属性, 如 id, class,title,style等
  • 用户自定义属性,主要用于js脚本控制, 以 “data-“”为前缀,如 data-key
    1. <!DOCTYPE html>
    2. <html lang="en">
    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. <div class="btn-group">
    12. <!-- 用data-value自定义属性存放值 -->
    13. <button data-index-value="1号" onclick="getValue(this)">按键1</button>
    14. <button data-index-value="2号" onclick="getValue(this)">按键2</button>
    15. <button data-index-value="3号" onclick="getValue(this)">按键3</button>
    16. </div>
    17. <p data-value="php.cn"></p>
    18. <script>
    19. function getValue(value) {
    20. // 自定义属性使用dataset.属性名调用
    21. // 属性名有-符号时改为驼峰写法
    22. alert(`点击的是${value.dataset.indexValue}按钮`);
    23. }
    24. // 自定义属性可读可写
    25. const p = document.querySelector("p");
    26. p.dataset.value = "";
    27. console.log(p.dataset.value);
    28. </script>
    29. </body>
    30. </html>

7. js操作css

  1. <!DOCTYPE html>
  2. <html lang="en">
  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. </head>
  9. <body>
  10. <style>
  11. div {
  12. width: 20em;
  13. }
  14. </style>
  15. <div style="font-size: 2em; color: chocolate"></div>
  16. <script>
  17. let div = document.querySelector("div");
  18. // 获取行内样式
  19. console.log(div.style.fontSize);
  20. // 计算样式:指内部style标签样式或外部css文件样式
  21. // 获取外部样式,用全局方法window.getComputedStyle(标签,伪元素)
  22. console.log(window.getComputedStyle(div).width);
  23. // 操作:宽度加100px
  24. let width = window.getComputedStyle(div).width;
  25. // 得到的宽度是字符串,用parseInt()函数提取出数字
  26. width = parseInt(width) + 100 + "px";
  27. // 在行内样式中加入样式
  28. div.style.width = width;
  29. console.log(div.style.width);
  30. </script>
  31. </body>
  32. </html>

8. js操作class属性: classList对象

  1. <!DOCTYPE html>
  2. <html lang="en">
  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. </head>
  9. <body>
  10. <h2>学习php</h2>
  11. <style>
  12. .red {
  13. color: red;
  14. }
  15. .bg-yello {
  16. background-color: yellow;
  17. }
  18. .turquoise {
  19. color: turquoise;
  20. }
  21. </style>
  22. <script>
  23. // 1. 用传统方式添加样式
  24. let h2 = document.querySelector("h2");
  25. h2.className = "red bg-yello";
  26. // 2. 用classList对象
  27. // 添加样式:add方法
  28. h2.classList.add("turquoise");
  29. // 判断样式是否存在:contains方法
  30. console.log(h2.classList.contains("red"));
  31. // 移除样式
  32. h2.classList.remove("bg-yello");
  33. // 替换样式:方法replace(要替换的样式名,替换样式)
  34. h2.classList.replace("turquoise", "red");
  35. // 切换样式:toggle方法
  36. // 如果要切换的样式已存在,则移除,否则添加
  37. // 如red样式上条语句已生效,则下面语句变为移除red样式
  38. h2.classList.toggle("red");
  39. </script>
  40. </body>
  41. </html>

9. 事件的添加与删除

  1. <!DOCTYPE html>
  2. <html lang="en">
  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. // 获取元素
  15. const btn1 = document.querySelector("button:first-of-type");
  16. // 添加点击事件
  17. btn1.onclick = () => {
  18. console.log(event);
  19. };
  20. // 删除事件
  21. btn1.onclick = null;
  22. // 事件监听器
  23. // 获取元素
  24. const btn2 = document.querySelector("button:nth-of-type(2)");
  25. // 监听事件addEventListener("监听事件",动作,false),false表示冒泡事件
  26. btn2.addEventListener("click", show, false);
  27. // 删除事件
  28. btn2.removeEventListener("click", show, false);
  29. function show() {
  30. console.log(event);
  31. }
  32. // 事件派发:事件发生时,自动触发动作
  33. btn3 = document.querySelector("button:nth-of-type(3)");
  34. // 监听事件,自调用
  35. let i = 0;
  36. btn3.addEventListener(
  37. "click",
  38. () => {
  39. console.log(`点赞${++i}个`);
  40. },
  41. false
  42. );
  43. // 创建自定义事件,通过event对象
  44. const myClick = new Event("click");
  45. // 触发3次自定义事件
  46. btn3.dispatchEvent(myClick);
  47. btn3.dispatchEvent(myClick);
  48. btn3.dispatchEvent(myClick);
  49. // 用一次性定时器触发1500毫秒
  50. setTimeout(() => {
  51. btn3.dispatchEvent(myClick);
  52. }, 1500);
  53. // 用间歇定时器触发
  54. setInterval(() => {
  55. btn3.dispatchEvent(myClick);
  56. }, 1500);
  57. </script>
  58. </body>
  59. </html>

推荐阅读