DOM 操作与插入标记
如何动态加载脚本与样式?
const script = document.createElement("script");
script.src = "foo.js";
document.body.appendChild(script);
const link = document.createElement("link");
link.rel = "stylesheet";
link.href = "styles.css";
document.head.appendChild(link);
- 特点: 动态插入的资源由 DOM 控制, 不阻塞初始解析, 但会影响加载时机;
实时集合为什么容易写出死循环?
- 原因:
getElementsByTagName等返回的NodeList/HTMLCollection实时反映 DOM, 循环条件随之变化;
const divs = document.getElementsByTagName("div");
for (let i = 0; i < divs.length; ++i) {
document.body.appendChild(document.createElement("div")); // 每轮 length 都增大
}
- 规避: 先取静态快照 (
[...divs]或querySelectorAll), 或先记录初始长度;
插入标记有哪几种方式?
| 方式 | 行为 |
|---|---|
element.innerHTML = html | 读写所有后代元素的 HTML 字符串 |
element.outerHTML = html | 读写元素自身及其后代的 HTML 字符串 |
element.insertAdjacentHTML(position, html) | 在指定位置插入 HTML 字符串 |
element.insertAdjacentText(position, text) | 在指定位置插入纯文本 |
- position 取值:
"beforebegin"、"afterbegin"、"beforeend"、"afterend"; - 安全性:
innerHTML会执行插入的 HTML 中的脚本, 用户输入未转义时导致 XSS; - 文本替代: 插入纯文本用
textContent或insertAdjacentText, 不解析标签;
如何管理焦点与滚动?
- 焦点:
document.activeElement指向当前焦点元素,document.hasFocus()判断文档是否获得焦点,element.focus()/blur()切换焦点;
button.focus();
document.activeElement === button; // true
- 滚动到可见:
element.scrollIntoView({ behavior: "smooth", block: "start" });