js在操作dom的场景中,有时候会有类似的场景需求。
js用前缀名查找class节点
// 参数dom为html dom节点
// 参数key为需模糊查询的名称字段
function queryClassNode(dom, key) {
let collectArray = [];
for (var i = 0; i < dom.childNodes.length; i++) {
// 核心点
if (dom.childNodes[i].attributes && dom.childNodes[i].attributes["class"] && dom.childNodes[i].className.indexOf(key) !== -1) {
collectArray.push(dom.childNodes[i]);
}
if (dom.childNodes[i].childNodes.length > 0) {
let res = queryClassNode(dom.childNodes[i], key);
for (var k = 0; k < res.length; k++) {
collectArray.push(res[k]);
}
}
}
return collectArray;
}
js用前缀名查找Id节点
// 参数dom为html dom节点
// 参数key为需查询的前缀名
function queryIdNode(dom, key) {
let collectArray = [];
for (var i = 0; i < dom.childNodes.length; i++) {
// 核心点
if (dom.childNodes[i].attributes && dom.childNodes[i].attributes["id"] && dom.childNodes[i].id.indexOf(key) !== -1) {
collectArray.push(dom.childNodes[i]);
}
if (dom.childNodes[i].childNodes.length > 0) {
let res = queryIdNode(dom.childNodes[i], key);
for (var k = 0; k < res.length; k++) {
collectArray.push(res[k]);
}
}
}
return collectArray;
}
效果
<html>
<body>
<div>
<div></div>
<div>
<span id="test1">
233
<span class="demo1">666</span>
</span>
<span id="test2">
<span id="test3">666</span>
<span class="demo1">888</span>
<span class="demo2">999</span>
</span>
</div>
</div>
</body>
<script>
...
...
...
console.log(queryIdNode(document.body, 'test')); // [span#test1, span#test2, span#test3]
console.log(queryClassNode(document.body, 'demo')); // [span.demo1, span.demo1, span.demo2]
</script>
</html>
补充点:
确实可以直接用 querySelectorAll 吧,配合属性选择器,反而更方便。上面的js实现方法,就留着不删了
document.querySelectorAll('[id^=test]')
document.querySelectorAll('[class^=demo]')
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。