设为首页 收藏本站
查看: 1848|回复: 0

[经验分享] Github搭建的博客实现JS搜索功能

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-7-4 21:25:59 | 显示全部楼层 |阅读模式
search.jpg






在github上搭建博客时候,唯一使用一点算是后端的环境就是jekyll,但是这个东西设计就是用来生成静态页面的。 并没有设计数据库什么的,更不要提搜索功能了,那怎么来实现搜索功能呢?
我的解决思路

全部代码

Search.prototype = {
    constructor: SearchBlog,
//    异步获取数据内容后的处理函数调用
    init: function (xml) {
        searchBlogObj.xmlToObjectArray(xml)
        searchBlogObj.formTableSubmit()
    },
//    异步获取整个站点文章
    getXmlHttpResponse: function () {
        var fn = searchBlogObj.init
        $.ajax({
                url: this.url,
                dataType: "xml",
                success: function (xml) {
                    fn(xml)
                }
            }
        )
    },
//    将xml转换为对象的数组
    xmlToObjectArray: function (xml) {
        var json = []
        $(xml).find("*:first").children().each(function (i) {
            var obj = {title: $(this).find("title").text(), content: $(this).find("content").text(), url: $(this).find("url").text(),time:$(this).find("time").text()}
            json.push(obj)
        })
        searchBlogObj.json = json
    },
//    全站搜索
    fullTextSearch: function (keyword) {
        var reg = new RegExp(keyword)
        var regArray = []
        $.each(searchBlogObj.json, function (n, v) {
            if (reg.test(this.title) || reg.test(this.content)) {
                regArray.push(this)
            }
        })
        return regArray
    },
//   搜索成功后重新渲染页面
    review: function (regArray) {
        $.each(regArray,function(){
        })
        html
        $("#show_post").html(html)
    },
//    绑定搜索输入框获取输入框内容
    formTableSubmit: function () {
        var thisObj = this
        $("#search_form").submit(function (e) {
            e.preventDefault();
            var regArray = searchBlogObj.fullTextSearch($("#search_input").val())
            if (regArray.length === 0) {
                alert("没有搜到任何东西")
                return
            }
            thisObj.review(regArray);
        })
    }
}

数据来源
思路

我们知道jekyll不但能生成html,也能生成XML(比如生成站点地图),为什么不利用这点将网站所有的文章做个XML, 作为检索用的原始数据,
实现

下面是jekyll实现代码

<?xml version="1.0" encoding="UTF-8"?>
<blogs>
{ % for post in site.posts % }
<blog>
  <title>{ {post.title | xml_escape} }</title>
  <content>{ {post.content | xml_escape} }</content>
  <url>http://www.yourUrl.com{ {post.url} }</url>
  <time>{ { post.date | date: "%Y-%m-%d"} }</time>
</blog>
  { % endfor % }
</blogs>

上面代码将整个站点的搜索文章全部打印了出来,这里要注意一下因为是生成XML,jekyll使用的是Liquid,在生成XML时候如果不使用 XML_escape,逃避一些格式,就会造成jekyll出现错误。
数据处理

理论上jquery应该有更好的XML处理办法,只是我没有找到,于是自己写了JS代码,将异步读取的XML转化为对象的数组

xmlToObjectArray: function (xml) {
    var json = []
    $(xml).find("*:first").children().each(function (i) {
        var obj = {title: $(this).find("title").text(), content: $(this).find("content").text(), url: $(this).find("url").text(),time:$(this).find("time").text()}
        json.push(obj)
    })
    searchBlogObj.json = json
},

内容搜索

我已经拿到转换成对象数组的整站数据,现在就是我们搜索过程,我的搜索过程比较简单,一旦正則匹配出有关键字 就将这个对象放在匹配成功的数组里面,实现代码如下

    fullTextSearch: function (keyword) {
        var reg = new RegExp(keyword)
        var regArray = []
        $.each(searchBlogObj.json, function (n, v) {
            if (reg.test(this.title) || reg.test(this.content)) {
                regArray.push(this)
            }
        })
        return regArray
    }

前端实现

上面我们看到的基本就是整个代码"后台"部分,现在我们要为用户制作一个输入关键字form表单,这个表单不能真正被提交,而是当点击 提交事件时候,更改点击后的操作处理方法为获取关键字,

重新渲染页面,通过JS生成HTML

formTableSubmit: function () {
        var thisObj = this
        $("#search_form").submit(function (e) {
            e.preventDefault();
            var regArray = searchBlogObj.fullTextSearch($("#search_input").val())
            if (regArray.length === 0) {
                alert("没有搜到任何东西")
                return
            }
            thisObj.review(regArray);
        })
    }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-21652-1-1.html 上篇帖子: [Linux]Centos git报错fatal: HTTP request failed 下篇帖子: Linux下git安装配置 博客
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表