需求
有一个树形(N级)侧边栏, 其中包含了很多菜单项, 当我们使用浏览器自带搜索功能进行搜索时, 如果搜索到了菜单项, 则自动展开层级, 显示出搜索到的菜单项
分析
- 如何监听浏览器自带的搜索功能?
- 如何得知搜索命中了哪些菜单项?
关于浏览器自带的搜索功能, 查阅资料发现有一个可能被废弃的 API: window.find, 但实现不了我们的需求.
其他相关的 API 有
多少沾点边, 但都实现不了我们的需求, 真没想到这么麻烦.
偶遇 <details>
元素
就在我一筹莫展的时候, 边搜索边翻看着某个网站的文档, 突然我发现搜索的时候, 页面上搜索命中的内容竟然自动展开了!
真是踏破铁鞋无觅处, 得来全不费工夫啊!
我立马观察了一下页面上的实现, 发现只是使用了 <details>
元素, 难道搜索时 <details>
自带神奇的自动展开特性?
验证 <details>
的隐藏特性
于是我写了一个 demo 一探究竟!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>搜索时 details 神奇的自动展开特性</title>
<style>
/**
* 以下样式只是为了让多级结构更好看一些, 不是必须要设置这些样式
*/
details > details {
margin-left: 18px;
}
details > div {
margin-left: 18px;
}
</style>
</head>
<body>
<h1>搜索时 details 神奇的自动展开特性</h1>
<details>
<summary>单级</summary>
<div>内容</div>
</details>
<details>
<summary>多级</summary>
<details>
<summary>1</summary>
<details>
<summary>1.1</summary>
<div>内容</div>
</details>
</details>
</details>
</body>
</html>
原来这一切就是浏览器自带的默认行为, 搜索的时候, 如果命中了 <details>
元素包含的内容, <details>
元素就会自动展开!
就这么简单! 打完收工!