网页是一棵树
浏览器使用window.document来操作这课树
获取元素的API
- window.idXXX 或 idXXX
- document.getElementById(‘id’)
- document.getElementsByClassName(‘red’)[0]
- document.getElementsByTagName(‘div’)[0]
- document.querySelector(‘#idXXX’): 直接写CSS选择器,选择第一个满足条件的元素
- document.querySelectorAll(‘.red’)[0]: 直接写CSS选择器,选择所有满足条件的元素,使用索引选择第几个元素;node.querySelectorAll(‘.child’): 获取节点 node 下的 classname 为 child 的所有子节点
- 工作中使用 querySelector 和 querySelectorAll
- 需要兼容IE才用getElementsBy
- 获取 html 元素: document.documentElement
- 获取 head 元素: document.head
- 获取 body 元素: document.body
- 获取窗口(窗口不是元素): window
- 获取所有标签: document.all, 这是第六个falsy值
Div的原型链
div - > HTMLDivElement -> HTMLElement -> Element -> Node -> EventTarget -> Object
节点的增删改查
- 增
// 创建一个标签节点
let div1 = document.createElement('div');
document.createElement('style');
document.createElement('script');
document.createElement('li');
// 创建一个文本节点
let text1 = document.createTextNode('Hi!');
// 在标签里插入文本
div1.appendChild(text1);
div1.innerText = 'Hi!';
div1.textContent = 'Hi!';
// 插入页面中
// 创建的标签默认处于JS线程中
// 必须把它插入 head 或 body 里才可见
document.body.appendChild(div1);
// 一个元素不能出现再两个地方,除非复制一份
// 克隆节点
var dupNode = node.cloneNode(deep);
// deep: 是否深拷贝,若为true,则所有后代节点也被拷贝,为false则只拷贝自己
- 删
// 旧方法 parentNode.removeChild(childNode)
div1.parentNode.removeChild(div1)
// 新方法 childNode.remove(); ie不支持
div2.remove()
- 改
// 改id
div1.id = 'div1';
// 改 class
div.className = 'red blue';
div.classList.add('yellow');
// 改 style
div.style = 'width: 100px; color: red;';
div.style.height = '100px';
div.style.backgroundColor = 'white' // background-color 变成 backgroundColor
// 改文本内容
div1.innerText = 'Hi!';
div1.textContent = 'Hi!';
// 改 html 内容
div.innerHTML = '<h1>标题1</h1>';
// 改标签: 先清空再加内容
div.innerHTML = '';
div.appendChild(div2);
// 改父节点
newParent.appendChild(div);
// 改事件处理函数
// div.conclick 默认为null
// 点击div,相当于调用 div.onclick.call(div, event)
// event为点击事件对象,包含了点击事件的所有信息,如坐标
div.conclick = (event) => {
console.log(this);
console.log(event);
}
- 查
// 查父节点
node.parentNode;
node.parentElement;
// 查父节点的父节点
node.parentNode.parentNode;
// 查子节点
node.childNodes; // 会获取到文本节点
node.children;
// 查同辈
// 先获取父节点的所有子节点
// 然后再遍历排除自己
node.parentNode.childNodes;
node.parentNode.child;
// 查第一个子节点
node.firstChild;
// 查最后一个子节点
node.lastChild;
// 前一个兄弟节点
node.previousSibling; // 括文本节点
node.previousElementSibling; // 不包括文本节点
// 后一个兄弟节点
node.nextSibling;
node.nextElementSibling;
// 遍历一个 div 里的所有元素
let travel = (node, fn) => {
fn(node);
if (node.children) {
for (let i = 0; i < node.children.length; i++) {
travel(node.children[i], fn)
}
}
}
travel(div1, (node) => console.log(node));
- 读标准属性
div.classList;
a.href;
div.getAttribute('class');
a.getAttribute('href');