
批改狀態(tài):合格
老師批語:
<!-- HTML 文檔結(jié)構(gòu) -->
<ul class="list">
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
<li>item6</li>
</ul>
querySelectorAll(選擇器):獲取滿足選擇器( CSS 選擇器 )條件的所有元素
let liList = document.querySelectorAll("li");
console.log(liList);
/** 返回元素節(jié)點(diǎn)列表(“類”數(shù)組)
* NodeList(6)
* 0: li
* 1: li
* 2: li
* 3: li
* 4: li
* 5: li
* length: 6
*/
獲取的元素節(jié)點(diǎn)列表(NodeList)不是數(shù)組,但可以使用部分的數(shù)組方法:forEach()、entries()、item()、keys()、values() 等,也擁有 length 屬性,也可以用 for of 遍歷。
// for of 遍歷
let liList = document.querySelectorAll("li");
console.log(liList);
for (let item of liList){
console.log(item);
}
// forEach() 遍歷
liList.forEach(item => console.log(item));
// forEach() 遍歷無返回值,如果需要返回值,需要將 NodeList 轉(zhuǎn)換為數(shù)組,然后用 map() 操作
// 類數(shù)組 轉(zhuǎn)換為 數(shù)組:Array.from() 或者 ...rest
let arrList = Array.from(liList); // 等同于:let arrList = [...liList];
console.log(arrList);
// 然后就可以用 map() 進(jìn)行操作了
arrList.map(item => item.style.color = 'red') // 所有列表項(xiàng)的內(nèi)容都顯示為紅色
querySelector(選擇器):獲取滿足選擇器條件的第一個(gè)元素
let firstList = document.querySelector("li");
console.log(firstList); /* <li>item1</li> */
// 也可以使用 querySelectorAll(選擇器) 加索引獲取第一個(gè)元素
let first = document.querySelectorAll("li")[0];
console.log(first.textContent); /* item1 */
過時(shí)的用法(不建議使用)
let firstList = document.getElementById('first');
let firstOne = document.getElementsByClassName('one')[0];
let firstOneByTag = document.getElementsByTagName('li')[0];
body
: document.body
,獲取元素
console.log(document.body);
// 等同于: console.log(document.querySelector('body'));
head
: document.head
,獲取元素
console.log(document.head);
// 等同于: console.log(document.querySelector('head'));
title
: document.title
,獲取<title>
元素內(nèi)部的文本
console.log(document.title);
// 等同于: console.log(document.querySelector('title').textContent);
html
: document.documentElement
,獲取元素
console.log(document.documentElement);
// 等同于: console.log(document.querySelector('html'));
doctype
: document.doctype
,獲取文檔類型:<!DOCTYPE html>
console.log(document.doctype);
url
: document.URL
,獲取當(dāng)前頁面的 url 地址
console.log(document.URL);
window
: document.defaultView
,獲取 window 對象
console.log(document.defaultView);
cookie
: document.cookie
,獲取 cookie
console.log(document.cookie);
script
: document.scripts
,獲取 script 腳本
console.log(document.scripts);
styleSheets
: document.styleSheets
,獲取樣式
console.log(document.styleSheets);
// HTML 文檔結(jié)構(gòu)
<form action="#" method="post" id="login">
<fieldset class="login" style="display: inline-grid; gap: 10px">
<legend>用戶登錄</legend>
<div>
<label for="email">郵箱:</label>
<input type="email" name="my_email" id="email" value="admin@php.cn" autofocus />
</div>
<div>
<label for="password">密碼:</label>
<input type="password" name="password" id="password" value="123456" />
</div>
<button>提交</button>
</fieldset>
</form>
表單: document.forms.id
,獲取表單元素
// 通用方法
console.log(document.querySelector('#login'));
// 快捷方法
console.log(document.forms); // 獲取的是所有表單的集合
// 以下是獲取指定的表單元素
console.log(document.forms[0]);
console.log(document.forms.item(0));
console.log(document.forms.login); // 推薦用法,簡便、高效
控件: forms.name/id
,獲取表單控件元素
// 從 document 為起點(diǎn)查找獲取
// 通過控件 name 屬性獲取
console.log(document.forms.login.my_email); // 郵箱 <input> 元素
// 通過控件 id 屬性獲取
console.log(document.forms.login.email); // 郵箱 <input> 元素
// 也可以先獲取 form 元素并賦值給變量,然后從獲取的 form 元素為起點(diǎn)查找獲取
let form = document.forms.login;
console.log(form.my_email);
console.log(form.my_email.value);
// 獲取控件的值:forms.name/id.value
console.log(form.my_email.value); /* admin@php.cn */
console.log(form.password.value); /* 123456 */
拿到 form
中用戶提交的郵箱和密碼,然后進(jìn)行封裝和解析
// 1,獲取用戶郵箱和密碼
let email = document.forms.login.my_email.value;
let passWorld = document.forms.login.password.value;
// 2,封裝成對象
let user = {email, passWorld}; // 屬性名 和 屬性值變量名 相同時(shí)可以只寫 屬性名。
// 2,對象(obj) 解析為 json 字符串
let json = JSON.stringify(user);
console.log(json); // {"email":"admin@php.cn","passWorld":"123456"}
知識(shí)點(diǎn):節(jié)點(diǎn)類型(nodeType)
document:文檔節(jié)點(diǎn),9
element:元素節(jié)點(diǎn),1
text:文本節(jié)點(diǎn),3
<!-- HTML 文檔結(jié)構(gòu) -->
<ul class="list">
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
<li>item6</li>
</ul>
children
:獲取所有元素類型子節(jié)點(diǎn)。(childNodes
:獲取所有 {各種類型的} 子節(jié)點(diǎn))
// 獲取 <ul> 元素
const list = document.querySelector('.list');
// childNodes 獲取所有子節(jié)點(diǎn)(包含 文本節(jié)點(diǎn) 和 元素節(jié)點(diǎn))
let nodeList = list.childNodes;
console.log(nodeList); /* NodeList(13) [text, li, text, li, text, li, text, li, text, li, text, li, text] */
// 只獲取所有元素類型子節(jié)點(diǎn),不要其他類型的節(jié)點(diǎn)
// 方法一:將 childNodes 獲取的所有節(jié)點(diǎn)集合,轉(zhuǎn)為數(shù)組,再用 filter() 篩選出元素節(jié)點(diǎn)
nodeList = [...nodeList].filter(item => item.nodeType == 1);
console.log(nodeList); /* [li, li, li, li, li, li] */ // 數(shù)組
// 方法二:children 直接獲取所有元素類型子節(jié)點(diǎn),推薦方法
elemList = list.children;
console.log(elemList); /* HTMLCollection(6) [li, li, li, li, li, li] */
firstElementChild
:獲取第一個(gè)元素
console.log(list.firstElementChild);
lastElementChild
:獲取最后一個(gè)元素
console.log(list.lastElementChild);
nextElementSibling
:獲取下一個(gè)兄弟元素
let first = list.firstElementChild; /* 第一個(gè) li */
console.log(first.nextElementSibling); /* 第二個(gè) li */
previousElementSibling
:獲取前一個(gè)兄弟元素
let last = list.lastElementChild; /* 最后一個(gè) li */
console.log(last.previousElementSibling); /* 倒數(shù)第二個(gè) li */
parentElement
:獲取父元素
let last = list.lastElementChild; /* 最后一個(gè) li */
console.log(last.parentElement); /* li 的父元素 ul */
contains()
:是否是后代
let last = list.lastElementChild; /* 子元素 li */
let parent = last.parentElement; /* 父元素 ul */
console.log(parent.contains(last)); /* true */
createElement()
: 創(chuàng)建新元素
document.createElement('ul');
append()
: 添加新元素,在父元素上調(diào)用,默認(rèn)添加到父元素的尾部(添加為最后的子元素)
const ul = document.createElement('ul');
document.body.append(ul);
for (let i = 0; i < 6; i++){
const li = document.createElement('li');
li.append('item-' + (i +1));
ul.append(li);
}
/**
* 頁面顯示:
* · item-1
* · item-2
* · item-3
* · item-4
* · item-5
* · item-6
*/
// 注意,每次執(zhí)行 append() 都會(huì)刷行一次頁面,會(huì)造成頁面閃爍和卡頓。
// 應(yīng)該將要添加所有元素先添加到文檔片段中,然后再 append() 將文檔片段一次性添加到文檔。
// 方法見下面的 createDocumentFragment()
createDocumentFragment()
: 創(chuàng)建文檔片斷
const ul = document.createElement('ul');
document.body.append(ul);
const frag = document.createDocumentFragment();
for (let i = 0; i < 6; i++){
const li = document.createElement('li');
li.append('item-' + (i +1));
frag.append(li);
}
ul.append(frag);
before()
: 在前面追加,兄弟元素上調(diào)用
const three = ul.querySelector(':nth-child(3)');
const li = document.createElement('li');
li.append('new item before three');
three.before(li);
/**
* · item-1
* · item-2
* · new item before three
* · item-3
* · item-4
* · item-5
* · item-6
*/
after()
: 在后面追加,兄弟元素上調(diào)用
li = document.createElement('li');
li.append('new item after three');
three.after(li);
/**
* · item-1
* · item-2
* · new item before three
* · item-3
* · new item after three
* · item-4
* · item-5
* · item-6
*/
cloneNode()
: 克隆節(jié)點(diǎn),帶參數(shù) true 表示包括子元素和文本,不帶 true 則只復(fù)制元素本身(空元素)
ul.append(li.cloneNode(true));
/**
* · item-1
* · item-2
* · new item before three
* · item-3
* · new item after three
* · item-4
* · item-5
* · item-6
* · new item after three
*/
replaceChild()
: 替換元素,兩個(gè)參數(shù),第一個(gè)是新的元素,第二個(gè)是要被替換的元素
const p = document.createElement('p');
p.textContent = 'replaced';
ul.replaceChild(p, ul.lastElementChild);
/**
* · item-1
* · item-2
* · new item before three
* · item-3
* · new item after three
* · item-4
* · item-5
* · item-6
*
* replaced
*/
remove()
: 移除元素,在當(dāng)前元素(要被刪除的)上調(diào)用
ul.lastElementChild.remove();
/**
* · item-1
* · item-2
* · new item before three
* · item-3
* · new item after three
* · item-4
* · item-5
* · item-6
*/
textContent
: 全部內(nèi)容(包括 js,css,隱藏內(nèi)容),推薦
/**
* HTML 內(nèi)容:
* <h3>php.cn<span style="display: none">hidden text</span></h3>
*/
// 獲取
let textContent = document.querySelector('h3').textContent;
console.log(textContent); /* php.cnhidden text */
// 修改
document.querySelector('h3').textContent = '<p>new text</p>'
/**
* 頁面顯示:<p>new text</p>
* <p> 標(biāo)簽也被當(dāng)做 <h3> 的文本內(nèi)容
*/
innerText
: 返回已渲染(可見)內(nèi)容
/**
* HTML 內(nèi)容:
* <h3>php.cn<span style="display: none">hidden text</span></h3>
*/
// 獲取
textContent = document.querySelector('h3').innerText;
console.log(textContent); /* php.cn */
// 只能獲取頁面顯示的內(nèi)容
// 修改
document.querySelector('h3').innerText = '<p>new text</p>'
/**
* 頁面顯示:<p>new text</p>
* <p> 標(biāo)簽也被當(dāng)做 <h3> 的文本內(nèi)容
*/
innerHTML
: 替換元素內(nèi)容(html)
/**
* HTML 內(nèi)容:
* <h3>php.cn<span style="display: none">hidden text</span></h3>
*/
// 獲取
textContent = document.querySelector('h3').innerHTML;
console.log(textContent); /* php.cn<span style="display: none">hidden text</span> */
// 修改
document.querySelector('h3').innerHTML = '<p>new text</p>'
/**
* 頁面顯示:new text
* <p> 標(biāo)簽是 <h3> 的子元素
*/
outerHTML
: 替換元素自身(html)
/**
* HTML 內(nèi)容:
* <h3>php.cn<span style="display: none">hidden text</span></h3>
*/
// 獲取
const outHtml = document.querySelector('h3').outerHTML;
console.log(outHtml); /* <h3>php.cn<span style="display: none">hidden text</span></h3> */
// 修改
document.querySelector('h3').outerHTML = '<p>Hello world!</p>';
/* 調(diào)用的元素 <h3> 自己被更改為 <p> */
document.querySelector('p').outerHTML = null;
/**
* 剛才生成的 <p> 被刪除了
* 相當(dāng)于 document.querySelector('p').remove();
*/
<!-- HTML 文檔結(jié)構(gòu) -->
<ul class="list">
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
<li>item6</li>
</ul>
beforebegin
:元素自身的前面,被調(diào)用元素起始標(biāo)簽(begin)的前面插入afterbegin
:插入元素內(nèi)部的第一個(gè)子節(jié)點(diǎn)之前,被調(diào)用元素起始標(biāo)簽(begin)的后面插入beforeend
:插入元素內(nèi)部的最后一個(gè)子節(jié)點(diǎn)之后,被調(diào)用元素結(jié)束標(biāo)簽(end)的前面插入afterend
:元素自身的后面,被調(diào)用元素結(jié)束標(biāo)簽(end)的后面插入insertAdjacentElement()
:指定位置插入元素
兩個(gè)參數(shù):第一個(gè)插入位置,第二個(gè)要插入的元素
注意:連續(xù)使用 insertAdjacentElement() 插入同一個(gè)元素,前面的插入語句會(huì)被后面的語句覆蓋(即使插入的位置不同,或者元素的內(nèi)容不同)!
const ul = document.querySelector('.list');
// 創(chuàng)建需要插入的元素
const h3beforebegin = document.createElement('h3');
h3beforebegin.textContent = 'beforebegin';
// 插入新創(chuàng)建的元素
ul.insertAdjacentElement('beforebegin', h3beforebegin); // 相當(dāng)于 ul.before(h3beforebegin);
/**
* <h3>beforebegin</h3>
* <ul class="list">
* <li>item1</li>
* ......
* <li>item6</li>
* </ul>
*/
const h3afterebegin = document.createElement('h3');
h3afterebegin.textContent = 'afterebegin';
ul.insertAdjacentElement('afterbegin', h3afterebegin);
/**
* <h3>beforebegin</h3>
* <ul class="list">
* <h3>afterebegin</h3>
* <li>item1</li>
* ......
* <li>item6</li>
* </ul>
*/
const h3beforeend = document.createElement('h3');
h3beforeend.textContent = 'beforeend';
ul.insertAdjacentElement('beforeend', h3beforeend); // 相當(dāng)于 ul.append(h3beforeend);
/**
* <h3>beforebegin</h3>
* <ul class="list">
* <h3>afterebegin</h3>
* <li>item1</li>
* ......
* <li>item6</li>
* <h3>beforeend</h3>
* </ul>
*/
const h3afterend = document.createElement('h3');
h3afterend.textContent = 'afterend';
ul.insertAdjacentElement('afterend', h3afterend); // 相當(dāng)于 ul.after(h3afterend);
/**
* <h3>beforebegin</h3>
* <ul class="list">
* <h3>afterebegin</h3>
* <li>item1</li>
* ......
* <li>item6</li>
* <h3>beforeend</h3>
* </ul>
* <h3>afterend</h3>
*/
insertAdjacentText()
: 指定位置插入文本節(jié)點(diǎn)(不常用)
const ul = document.querySelector('.list');
const textInsert = 'Hello world!';
ul.insertAdjacentText('beforebegin', textInsert);
/**
* Hello world!
* <ul class="list">
* <li>item1</li>
* ......
* <li>item6</li>
* </ul>
*/
insertAdjacentHTML()
: 指定位置插入元素節(jié)點(diǎn)(DOMString),重要
// 可以將 HTML 代碼片段,直接添加到頁面中的指定的任何位置
// 而不用先封裝成 Fragment,然后再 append() 添加
const ul = document.querySelector('.list');
ul.insertAdjacentHTML("afterend", '<button>刪除</button>');
/**
* <ul class="list">......</ul>
* <button>刪除</button>
*/
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)