JavaScript DOM 基本操作:元素获取、遍历以及修改

编辑: admin 分类: 电脑知识 发布时间: 2023-06-14 来源:互联网
DOM 基本操作(1)获取 DOM 元素1,通用方式
  1. <!-- HTML 文档结构 -->
  2. <ul class="list">
  3. <li>item1</li>
  4. <li>item2</li>
  5. <li>item3</li>
  6. <li>item4</li>
  7. <li>item5</li>
  8. <li>item6</li>
  9. </ul>
  1. querySelectorAll(选择器):获取满足选择器( CSS 选择器 )条件的所有元素

    1. let liList = document.querySelectorAll("li");
    2. console.log(liList);
    3. /** 返回元素节点列表(“类”数组)
    4. * NodeList(6)
    5. * 0: li
    6. * 1: li
    7. * 2: li
    8. * 3: li
    9. * 4: li
    10. * 5: li
    11. * length: 6
    12. */

    获取的元素节点列表(NodeList)不是数组,但可以使用部分的数组方法:forEach()、entries()、item()、keys()、values() 等,也拥有 length 属性,也可以用 for of 遍历。

    1. // for of 遍历
    2. let liList = document.querySelectorAll("li");
    3. console.log(liList);
    4. for (let item of liList){
    5. console.log(item);
    6. }
    7. // forEach() 遍历
    8. liList.forEach(item => console.log(item));
    9. // forEach() 遍历无返回值,如果需要返回值,需要将 NodeList 转换为数组,然后用 map() 操作
    10. // 类数组 转换为 数组:Array.from() 或者 ...rest
    11. let arrList = Array.from(liList); // 等同于:let arrList = [...liList];
    12. console.log(arrList);
    13. // 然后就可以用 map() 进行操作了
    14. arrList.map(item => item.style.color = 'red') // 所有列表项的内容都显示为红色
  2. querySelector(选择器):获取满足选择器条件的第一个元素

    1. let firstList = document.querySelector("li");
    2. console.log(firstList); /* <li>item1</li> */
    3. // 也可以使用 querySelectorAll(选择器) 加索引获取第一个元素
    4. let first = document.querySelectorAll("li")[0];
    5. console.log(first.textContent); /* item1 */
  3. 过时的用法(不建议使用)

    1. let firstList = document.getElementById('first');
    2. let firstOne = document.getElementsByClassName('one')[0];
    3. let firstOneByTag = document.getElementsByTagName('li')[0];
2,快捷获取页面主要元素/信息
  1. body : document.body,获取元素

    1. console.log(document.body);
    2. // 等同于: console.log(document.querySelector('body'));
  2. head : document.head,获取元素

    1. console.log(document.head);
    2. // 等同于: console.log(document.querySelector('head'));
  3. title : document.title,获取<title>元素内部的文本

    1. console.log(document.title);
    2. // 等同于: console.log(document.querySelector('title').textContent);
  4. html : document.documentElement,获取元素

    1. console.log(document.documentElement);
    2. // 等同于: console.log(document.querySelector('html'));
  5. doctype : document.doctype,获取文档类型:<!DOCTYPE html>

    1. console.log(document.doctype);
  6. url : document.URL,获取当前页面的 url 地址

    1. console.log(document.URL);
  7. window : document.defaultView,获取 window 对象

    1. console.log(document.defaultView);
  8. cookie : document.cookie,获取 cookie

    1. console.log(document.cookie);
  9. script : document.scripts,获取 script 脚本

    1. console.log(document.scripts);
  10. styleSheets: document.styleSheets,获取样式

    1. console.log(document.styleSheets);
3,获取表单数据
  1. // HTML 文档结构
  2. <form action="#" method="post" id="login">
  3. <fieldset class="login" style="display: inline-grid; gap: 10px">
  4. <legend>用户登录</legend>
  5. <div>
  6. <label for="email">邮箱:</label>
  7. <input type="email" name="my_email" id="email" value="admin@php.cn" autofocus />
  8. </div>
  9. <div>
  10. <label for="password">密码:</label>
  11. <input type="password" name="password" id="password" value="123456" />
  12. </div>
  13. <button>提交</button>
  14. </fieldset>
  15. </form>
  1. 表单: document.forms.id,获取表单元素

    1. // 通用方法
    2. console.log(document.querySelector('#login'));
    3. // 快捷方法
    4. console.log(document.forms); // 获取的是所有表单的集合
    5. // 以下是获取指定的表单元素
    6. console.log(document.forms[0]);
    7. console.log(document.forms.item(0));
    8. console.log(document.forms.login); // 推荐用法,简便、高效
  2. 控件: forms.name/id,获取表单控件元素

    1. // 从 document 为起点查找获取
    2. // 通过控件 name 属性获取
    3. console.log(document.forms.login.my_email); // 邮箱 <input> 元素
    4. // 通过控件 id 属性获取
    5. console.log(document.forms.login.email); // 邮箱 <input> 元素
    6. // 也可以先获取 form 元素并赋值给变量,然后从获取的 form 元素为起点查找获取
    7. let form = document.forms.login;
    8. console.log(form.my_email);
    9. console.log(form.my_email.value);
    10. // 获取控件的值:forms.name/id.value
    11. console.log(form.my_email.value); /* admin@php.cn */
    12. console.log(form.password.value); /* 123456 */
  3. 拿到 form 中用户提交的邮箱和密码,然后进行封装和解析

    1. // 1,获取用户邮箱和密码
    2. let email = document.forms.login.my_email.value;
    3. let passWorld = document.forms.login.password.value;
    4. // 2,封装成对象
    5. let user = {email, passWorld}; // 属性名 和 属性值变量名 相同时可以只写 属性名。
    6. // 2,对象(obj) 解析为 json 字符串
    7. let json = JSON.stringify(user);
    8. console.log(json); // {"email":"admin@php.cn","passWorld":"123456"}
4,遍历 DOM

知识点:节点类型(nodeType)

document:文档节点,9

element:元素节点,1

text:文本节点,3

  1. <!-- HTML 文档结构 -->
  2. <ul class="list">
  3. <li>item1</li>
  4. <li>item2</li>
  5. <li>item3</li>
  6. <li>item4</li>
  7. <li>item5</li>
  8. <li>item6</li>
  9. </ul>
  1. children:获取所有元素类型子节点。(childNodes:获取所有 {各种类型的} 子节点)

    1. // 获取 <ul> 元素
    2. const list = document.querySelector('.list');
    3. // childNodes 获取所有子节点(包含 文本节点 和 元素节点)
    4. let nodeList = list.childNodes;
    5. console.log(nodeList); /* NodeList(13) [text, li, text, li, text, li, text, li, text, li, text, li, text] */
    6. // 只获取所有元素类型子节点,不要其他类型的节点
    7. // 方法一:将 childNodes 获取的所有节点集合,转为数组,再用 filter() 筛选出元素节点
    8. nodeList = [...nodeList].filter(item => item.nodeType == 1);
    9. console.log(nodeList); /* [li, li, li, li, li, li] */ // 数组
    10. // 方法二:children 直接获取所有元素类型子节点,推荐方法
    11. elemList = list.children;
    12. console.log(elemList); /* HTMLCollection(6) [li, li, li, li, li, li] */
  2. firstElementChild:获取第一个元素

    1. console.log(list.firstElementChild);
  3. lastElementChild:获取最后一个元素

    1. console.log(list.lastElementChild);
  4. nextElementSibling:获取下一个兄弟元素

    1. let first = list.firstElementChild; /* 第一个 li */
    2. console.log(first.nextElementSibling); /* 第二个 li */
  5. previousElementSibling:获取前一个兄弟元素

    1. let last = list.lastElementChild; /* 最后一个 li */
    2. console.log(last.previousElementSibling); /* 倒数第二个 li */
  6. parentElement:获取父元素

    1. let last = list.lastElementChild; /* 最后一个 li */
    2. console.log(last.parentElement); /* li 的父元素 ul */
  7. contains():是否是后代

    1. let last = list.lastElementChild; /* 子元素 li */
    2. let parent = last.parentElement; /* 父元素 ul */
    3. console.log(parent.contains(last)); /* true */
(2)修改 DOM 元素1,增删改 DOM 元素(写操作)
  1. createElement(): 创建新元素

    1. document.createElement('ul');
  2. append(): 添加新元素,在父元素上调用,默认添加到父元素的尾部(添加为最后的子元素)

    1. const ul = document.createElement('ul');
    2. document.body.append(ul);
    3. for (let i = 0; i < 6; i++){
    4. const li = document.createElement('li');
    5. li.append('item-' + (i +1));
    6. ul.append(li);
    7. }
    8. /**
    9. * 页面显示:
    10. * · item-1
    11. * · item-2
    12. * · item-3
    13. * · item-4
    14. * · item-5
    15. * · item-6
    16. */
    17. // 注意,每次执行 append() 都会刷行一次页面,会造成页面闪烁和卡顿。
    18. // 应该将要添加所有元素先添加到文档片段中,然后再 append() 将文档片段一次性添加到文档。
    19. // 方法见下面的 createDocumentFragment()
  3. createDocumentFragment(): 创建文档片断

    1. const ul = document.createElement('ul');
    2. document.body.append(ul);
    3. const frag = document.createDocumentFragment();
    4. for (let i = 0; i < 6; i++){
    5. const li = document.createElement('li');
    6. li.append('item-' + (i +1));
    7. frag.append(li);
    8. }
    9. ul.append(frag);
  4. before(): 在前面追加,兄弟元素上调用

    1. const three = ul.querySelector(':nth-child(3)');
    2. const li = document.createElement('li');
    3. li.append('new item before three');
    4. three.before(li);
    5. /**
    6. * · item-1
    7. * · item-2
    8. * · new item before three
    9. * · item-3
    10. * · item-4
    11. * · item-5
    12. * · item-6
    13. */
  5. after(): 在后面追加,兄弟元素上调用

    1. li = document.createElement('li');
    2. li.append('new item after three');
    3. three.after(li);
    4. /**
    5. * · item-1
    6. * · item-2
    7. * · new item before three
    8. * · item-3
    9. * · new item after three
    10. * · item-4
    11. * · item-5
    12. * · item-6
    13. */
  6. cloneNode(): 克隆节点,带参数 true 表示包括子元素和文本,不带 true 则只复制元素本身(空元素)

    1. ul.append(li.cloneNode(true));
    2. /**
    3. * · item-1
    4. * · item-2
    5. * · new item before three
    6. * · item-3
    7. * · new item after three
    8. * · item-4
    9. * · item-5
    10. * · item-6
    11. * · new item after three
    12. */
  7. replaceChild(): 替换元素,两个参数,第一个是新的元素,第二个是要被替换的元素

    1. const p = document.createElement('p');
    2. p.textContent = 'replaced';
    3. ul.replaceChild(p, ul.lastElementChild);
    4. /**
    5. * · item-1
    6. * · item-2
    7. * · new item before three
    8. * · item-3
    9. * · new item after three
    10. * · item-4
    11. * · item-5
    12. * · item-6
    13. *
    14. * replaced
    15. */
  8. remove(): 移除元素,在当前元素(要被删除的)上调用

    1. ul.lastElementChild.remove();
    2. /**
    3. * · item-1
    4. * · item-2
    5. * · new item before three
    6. * · item-3
    7. * · new item after three
    8. * · item-4
    9. * · item-5
    10. * · item-6
    11. */
2,元素内容的获取与修改
  1. textContent: 全部内容(包括 js,css,隐藏内容),推荐

    1. /**
    2. * HTML 内容:
    3. * <h3>php.cn<span style="display: none">hidden text</span></h3>
    4. */
    5. // 获取
    6. let textContent = document.querySelector('h3').textContent;
    7. console.log(textContent); /* php.cnhidden text */
    8. // 修改
    9. document.querySelector('h3').textContent = '<p>new text</p>'
    10. /**
    11. * 页面显示:<p>new text</p>
    12. * <p> 标签也被当做 <h3> 的文本内容
    13. */
  2. innerText: 返回已渲染(可见)内容

    1. /**
    2. * HTML 内容:
    3. * <h3>php.cn<span style="display: none">hidden text</span></h3>
    4. */
    5. // 获取
    6. textContent = document.querySelector('h3').innerText;
    7. console.log(textContent); /* php.cn */
    8. // 只能获取页面显示的内容
    9. // 修改
    10. document.querySelector('h3').innerText = '<p>new text</p>'
    11. /**
    12. * 页面显示:<p>new text</p>
    13. * <p> 标签也被当做 <h3> 的文本内容
    14. */
  3. innerHTML: 替换元素内容(html)

    1. /**
    2. * HTML 内容:
    3. * <h3>php.cn<span style="display: none">hidden text</span></h3>
    4. */
    5. // 获取
    6. textContent = document.querySelector('h3').innerHTML;
    7. console.log(textContent); /* php.cn<span style="display: none">hidden text</span> */
    8. // 修改
    9. document.querySelector('h3').innerHTML = '<p>new text</p>'
    10. /**
    11. * 页面显示:new text
    12. * <p> 标签是 <h3> 的子元素
    13. */
  4. outerHTML: 替换元素自身(html)

    1. /**
    2. * HTML 内容:
    3. * <h3>php.cn<span style="display: none">hidden text</span></h3>
    4. */
    5. // 获取
    6. const outHtml = document.querySelector('h3').outerHTML;
    7. console.log(outHtml); /* <h3>php.cn<span style="display: none">hidden text</span></h3> */
    8. // 修改
    9. document.querySelector('h3').outerHTML = '<p>Hello world!</p>';
    10. /* 调用的元素 <h3> 自己被更改为 <p> */
    11. document.querySelector('p').outerHTML = null;
    12. /**
    13. * 刚才生成的 <p> 被删除了
    14. * 相当于 document.querySelector('p').remove();
    15. */
3,指定位置插入
  1. <!-- HTML 文档结构 -->
  2. <ul class="list">
  3. <li>item1</li>
  4. <li>item2</li>
  5. <li>item3</li>
  6. <li>item4</li>
  7. <li>item5</li>
  8. <li>item6</li>
  9. </ul>
(1)插入位置
  1. beforebegin:元素自身的前面,被调用元素起始标签(begin)的前面插入
  2. afterbegin:插入元素内部的第一个子节点之前,被调用元素起始标签(begin)的后面插入
  3. beforeend:插入元素内部的最后一个子节点之后,被调用元素结束标签(end)的前面插入
  4. afterend:元素自身的后面,被调用元素结束标签(end)的后面插入
(2)插入方法(API 方法)
  1. insertAdjacentElement():指定位置插入元素

    两个参数:第一个插入位置,第二个要插入的元素

    注意:连续使用 insertAdjacentElement() 插入同一个元素,前面的插入语句会被后面的语句覆盖(即使插入的位置不同,或者元素的内容不同)!

    1. const ul = document.querySelector('.list');
    2. // 创建需要插入的元素
    3. const h3beforebegin = document.createElement('h3');
    4. h3beforebegin.textContent = 'beforebegin';
    5. // 插入新创建的元素
    6. ul.insertAdjacentElement('beforebegin', h3beforebegin); // 相当于 ul.before(h3beforebegin);
    7. /**
    8. * <h3>beforebegin</h3>
    9. * <ul class="list">
    10. * <li>item1</li>
    11. * ......
    12. * <li>item6</li>
    13. * </ul>
    14. */
    15. const h3afterebegin = document.createElement('h3');
    16. h3afterebegin.textContent = 'afterebegin';
    17. ul.insertAdjacentElement('afterbegin', h3afterebegin);
    18. /**
    19. * <h3>beforebegin</h3>
    20. * <ul class="list">
    21. * <h3>afterebegin</h3>
    22. * <li>item1</li>
    23. * ......
    24. * <li>item6</li>
    25. * </ul>
    26. */
    27. const h3beforeend = document.createElement('h3');
    28. h3beforeend.textContent = 'beforeend';
    29. ul.insertAdjacentElement('beforeend', h3beforeend); // 相当于 ul.append(h3beforeend);
    30. /**
    31. * <h3>beforebegin</h3>
    32. * <ul class="list">
    33. * <h3>afterebegin</h3>
    34. * <li>item1</li>
    35. * ......
    36. * <li>item6</li>
    37. * <h3>beforeend</h3>
    38. * </ul>
    39. */
    40. const h3afterend = document.createElement('h3');
    41. h3afterend.textContent = 'afterend';
    42. ul.insertAdjacentElement('afterend', h3afterend); // 相当于 ul.after(h3afterend);
    43. /**
    44. * <h3>beforebegin</h3>
    45. * <ul class="list">
    46. * <h3>afterebegin</h3>
    47. * <li>item1</li>
    48. * ......
    49. * <li>item6</li>
    50. * <h3>beforeend</h3>
    51. * </ul>
    52. * <h3>afterend</h3>
    53. */
  2. insertAdjacentText(): 指定位置插入文本节点(不常用)

    1. const ul = document.querySelector('.list');
    2. const textInsert = 'Hello world!';
    3. ul.insertAdjacentText('beforebegin', textInsert);
    4. /**
    5. * Hello world!
    6. * <ul class="list">
    7. * <li>item1</li>
    8. * ......
    9. * <li>item6</li>
    10. * </ul>
    11. */
  3. insertAdjacentHTML(): 指定位置插入元素节点(DOMString),重要

    1. // 可以将 HTML 代码片段,直接添加到页面中的指定的任何位置
    2. // 而不用先封装成 Fragment,然后再 append() 添加
    3. const ul = document.querySelector('.list');
    4. ul.insertAdjacentHTML("afterend", '<button>删除</button>');
    5. /**
    6. * <ul class="list">......</ul>
    7. * <button>删除</button>
    8. */
【转自:武汉网站开发 http://www.1234xp.com/wuhan.html 网络转载请说明出处】