title: 让 Hexo 博客支持本地站内搜索 date: 2016-05-31 13:50:19 categories: 术业专攻 tags: - Hexo - JavaScript - jQuery toc: permalink: hexo-local-search ---
No results found
``` > 搜索重置按钮使用了 [Font Awesome](http://fontawesome.io/) 图标,可按需更换 ## 功能代码 ### 基础代码 > 基础搜索函数 `(jQuery)` 来源于 HaHack 的教程,个人进行了些调整: 1.新标签中打开文章页面;2.减少截取的字符数;3.去掉部分非必要的代码 - 使用时将下边代码保存为 js 文件并在页面中的合适位置引入 ```js // A local search script with the help of [hexo-generator-search](https://github.com/PaicHyperionDev/hexo-generator-search) // Copyright (C) 2015 // Joseph Pan" + match_content +"...
" } } }) $resultContent.innerHTML = str; }) } }) } ``` ### 调用函数 - `search.xml` 使用默认路径,可以直接把下面代码放到 js 文件中 ```js var path = "/search.xml"; searchFunc(path, 'local-search-input', 'local-search-result'); ``` - 上面的函数, `search.xml` 文件会跟随页面一起加载,如果索引文件太大,可能会影响页面加载速度,可以将其调整为`激活搜索框`时再下载所需文件 ```js var inputArea = document.querySelector("#local-search-input"); var getSearchFile = function(){ var path = "/search.xml"; searchFunc(path, 'local-search-input', 'local-search-result'); } inputArea.onfocus = function(){ getSearchFile() } ``` ### 搜索重置 - 提供按钮用于清空搜索结果和重置搜索框,按钮已经绑定了点击事件,直接写函数就行 ```js var $resetButton = $("#search-form .fa-times"); var $resultArea = $("#local-search-result"); inputArea.oninput = function(){ $resetButton.show(); } resetSearch = function(){ $resultArea.html(""); document.querySelector("#search-form").reset(); $resetButton.hide(); $(".no-result").hide(); } ``` ### 屏蔽回车 - 虽然用了表单但其实并没有数据要提交,所以这里需要手动屏蔽掉回车键 ```js inputArea.onkeydown = function(){ if(event.keyCode==13) return false} ``` ### 无搜索结果 - 无搜索结果时,显示指定的提示内容。 - 原本想在基础搜索函数上改,折腾无果,只能曲线救国,通过监听搜索区内容变动来判断是否有匹配的内容 ```js $resultArea.bind("DOMNodeRemoved DOMNodeInserted", function(e) { if (!$(e.target).text()) { $(".no-result").show(200); } else { $(".no-result").hide(); } }) ``` ## CSS 样式 样式部分按自己喜好设计即可,下面是个人目前使用的样式,可参考 ```css /*搜索框*/ .search { width: 68%; height: 18px; margin-top: 1px; padding: 0; font-family: inherit; border: 2px solid transparent; border-bottom: 2px solid #d3d3d3; border-radius: 2px; opacity: 0.65; background: none; } .search:hover { border: 2px solid #d3d3d3; opacity: 1; box-shadow: 0 0 10px rgba(0,0,0,0.3); } /*搜索重置按钮*/ #search-form .fa-times { display: none; padding: 1px 0.7em; box-shadow: 0 0 3px rgba(0,0,0,0.15); cursor: pointer; color: #808080; } #search-form .fa-times:active { background: #d3d3d3; } #search-form .fa-times:hover { zoom: 1.1; padding: 1px 0.6em; border: 1px solid #d3d3d3; box-shadow: 0 0 6px rgba(0,0,0,0.25); } /*搜索结果区*/ #local-search-result { margin: auto -12% auto -6%; font-size: 0.9em; text-align: left; word-break: break-all; } #local-search-result ul.search-result-list li:hover { font-weight: normal; } /*单条搜索结果*/ #local-search-result li { margin: 0.5em auto; border-bottom: 2px solid #d3d3d3; } #local-search-result .search-result-list li:hover { background: rgba(158,188,226,0.21); box-shadow: 0 0 5px rgba(0,0,0,0.2); } /*匹配的标题*/ #local-search-result a.search-result-title { line-height: 1.2; font-weight: bold; color: #708090; } /*搜索预览段落*/ #local-search-result p.search-result { margin: 0.4em auto; line-height: 1.2em; max-height: 3.6em; overflow: hidden; font-size: 0.8em; text-align: justify; color: #808080; } /*匹配的关键词*/ #local-search-result em.search-keyword { color: #f58e90; border-bottom: 1px dashed #f58e90; font-weight: bold; font-size: 0.85em; } /*无匹配搜索结果时显示*/ p.no-result { display: none; margin: 2em 0 2em 6%; padding-bottom: 0.5em; text-align: left; color: #808080; font-family: font-serif serif; border-bottom: 2px solid #d3d3d3; } ``` ## 一些不足 > - [ ] 如果文章很多,索引文件可能很大,无论是随页面下载还是激活搜索框再下载,似乎都不理想; - [ ] 搜索结果中全部内容都转成了小写,应该有办法忽略大小写的同时,保持文本原始大小写格式; - [ ] 使用自动补全填上的内容并不能立即显示搜索结果,待改进。 ## 相关链接 1. ***jQuery-based Local Search Engine for Hexo*** by **HaHack** on2015/10/08
: 2016/05/25
: