0%

dom API

1. Element.checkVisibility()

检测元素是否真正可见(包括CSS遮挡、滚动隐藏、透明度为0等场景)

1
2
3
4
5
6
7
//检测元素是否对用户可见(支持现代浏览器)
const isVisible =element.checkVisibility({
checkOpacity:true, // 检测透明度是否为0
checkVisibilitycss:true, // 检测visibility:hidden
checkOverflow:true // 检测父容器滚动隐藏
});
console.log('元素是否可见:'isVisible);

适用场景:表单验证可见性、广告曝光统计、动态内容懒加载检查

2. TreeWalker API

高性能遍历DOM树的「迭代器模式」

1
2
3
4
5
6
7
8
9
10
11
//遍历页面所有<h2>标签
const treeWalker =document.createTreeWalker(
document.body,
NodeFilter.SHOW ELEMENT,
{ acceptNode: node => node.tagName === 'H2’? NOdeFiIter.FILTER ACCEPT : NOdeFiIter.FILTER REJECT }
const h2List =[];
let currentNode;
while(currentNode =treeWalker.nextNode()){
h2List.push(currentNode);
}
console.log('所有H2标题:',h2List);

优势:比 querySelectorAll 更节省内存,尤其适合超大型DOM树遍历

3. Node.compareDocumentPosition()

精确判断两个节点的位置关系

1
2
3
4
5
6
// 判断元素A是否在元素B之后
const position = nodeA.compareDocumentPosition(nodeB);

if(position & Node.DOCUMENT_POSITION_FOLLOWING){
console.log('A在B之后');
}

位掩码常量:

  • DOCUMENT_POSITION_PRECEDING : 节点A在B之前
  • DOCUMENT_POSITION_FOLLOWING : 节点A在B之后
  • DOCUMENT_POSITION_CONTAINS : A是B的祖先

4. scrollIntoViewIfNeeded()

智能滚动(元素不在视口时自动滚动到可视区域)

1
2
3
4
5
// 平滑滚动到元素(非标准但广泛支持)
element.scrollIntoViewIfNeeded(
behavior:'smooth',
block:'nearest
});

对比传统方案:比scrollIntoView()更智能,避免过度滚动

5. insertAdjacentElement()

精准控制插入位置的增强版 appendChild

1
2
3
4
5
6
7
8
9
10
11
<!--原始元素 -->
<div id="target">Hello</div>

<script>
// 在target元素之后插入新元素
const newElement =document.createElement('span');
newElement.textContent=' World!';

document.getElementById('target').
insertAdjacentElement('afterend',newElement);
</script>

位置参数:

  • beforebegin : 元素前插入
  • afterbegin : 元素内部开头
  • beforeend : 元素内部末尾
  • afterend : 元素后插入

6. Range.surroundContents()

选区操作神器:包裹文本选区

1
2
3
4
5
6
// 选中文本并包裹高亮效果
const selection =window.getselection();
const range = selection.getRangeAt(0);

const highlight = document.createElement('mark');
range.surroundcontents(highlight); //自动处理边界拆分

应用场景: 富文本编辑器、文本高亮批注功能。

7. Node.isEqualNode()

深度比较两个节点是否「结构相同」

1
2
3
4
5
6
7
8
// 检测两个元素是否结构完全相同
const div1 =document.createElement('div');
div1.className ='box';

const div2 = document.createElement('div');
div2.className ='box';

console.log('节点是否相同:',div1.isEqualNode(div2));// true

注意:只比较结构和属性,不比较内容变化(如动态绑定的点击事件)

8. document.createExpression()

XPath 表达式预编译(性能优化利器)

1
2
3
4
5
6
7
8
//预编译XPath表达式(重复使用性能提升10倍+)
const xpathExpr = document.createExpression("//div[contains(@class,'card')]");
const result=xpathExpr.evaluate(
document,
XPathReSult.ORDERED_NODE_SNAPSHOT_TYPE
);

console.log('所有卡片元素:result.snapshotItem(0));

适用场景:大数据量表格的快速筛选查询。

注意

  • 部分API(如checkVisibility)需Chrome 106+支持

  • 生产环境使用前请检查浏览器兼容性

  • 冷门API的合理使用能让代码更优雅,但切忌过度炫技

-------------本文结束感谢您的阅读-------------