Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Typecho 无插件实现即时搜索

Typecho 无插件实现即时搜索

作者头像
泽泽社长
发布于 2023-04-17 07:48:22
发布于 2023-04-17 07:48:22
80400
代码可运行
举报
文章被收录于专栏:泽泽社泽泽社
运行总次数:0
代码可运行

functions.php最后面添加以下,通过每次访问判断文件间隔时间来达到更新缓存的目的。上方js里的search_a路径需要填写完整路径+/caches/cache.json

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 静态缓存类
 */
class cacheFile
{
    private $_dir;
    const EXT = '.json';
    public function __construct()
    {
        $this->_dir = dirname(__FILE__).'/caches/';
    }
    public function cacheData($key, $value = '', $path = '')
    {
        $filePath = $this->_dir.$path.$key.self::EXT;
        if ($value !== '') {
            // 如果设置为 null,则删除缓存文件
            if (is_null($value)) {
                return unlink($filePath);
            }
            $dir = dirname($filePath);
            if (!is_dir($dir)) {
                mkdir($dir, 0777);
            }
            // 该函数将返回写入到文件内数据的字节数,失败时返回FALSE 
            return file_put_contents($filePath, $value);
        }
        // 如果已经存在该文件,直接返回文件里面的内容
        if (!is_file($filePath)) {
            return false;
        } else {
            echo $filePath;
            // The function returns the read data 或者在失败时返回 FALSE. 
            return json_decode(file_get_contents($filePath), true);
        }
    }
}
if(!file_exists($flag)) {
touch($flag);
$TheFile = dirname(__FILE__).'/caches/cache.json';
$cacheFile = new cacheFile();
$vowels = array("[", "{","]","}","<",">","\r\n", "\r", "\n","-","'",'"','`'," ",":",";",'\\',"    ");
Typecho_Widget::widget('Widget_Contents_Post_Recent','pageSize=10000')->to($archives);
    while($archives->next()):
    $output .= '{"this":"post","link":"'.$archives->permalink.'","title":"'.$archives->title.'","comments":"'.$archives->commentsNum0.'","text":"'.str_replace($vowels, "",$archives->text).'"},';
    endwhile;
Typecho_Widget::widget('Widget_Contents_Page_List')->to($pages);
    while($pages->next()):
    $output .= '{"this":"page","link":"'.$pages->permalink.'","title":"'.$pages->title.'","comments":"'.$pages->commentsNum0.'","text":"'.str_replace($vowels, "",$pages->text).'"},';
    endwhile;
Typecho_Widget::widget('Widget_Metas_Tag_Cloud','ignoreZeroCount=1&limit=10000')->to($tags); 
    while ($tags->next()):
    $output .= '{"this":"tag","link":"'.$tags->permalink.'","title":"'.$tags->name.'","comments":"0","text":"'.str_replace($vowels, "",$tags->description).'"},';
    endwhile;
Typecho_Widget::widget('Widget_Metas_Category_List')->to($category); 
    while ($category->next()):
    $output .= '{"this":"category","link":"'.$category->permalink.'","title":"'.$category->name.'","comments":"0","text":"'.str_replace($vowels, "",$category->description).'"},';
    endwhile;
    $output = substr($output,0,strlen($output)-1);
$data = '['.$output.']';
if (file_exists($TheFile)) {
    if ( time() - filemtime( $TheFile) > 1800){
    $cacheFile->cacheData('cache', $data);
    }; //5分钟300秒,时间可以自己调整
} else {
    $cacheFile->cacheData('cache', $data);
};
}

HTML结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="ins-search" id="search">
    <div class="ins-search-mask">
    </div>
    <div class="ins-search-container">
        <div class="ins-input-wrapper">
            <form id="search-form" method="post" action="./" role="search">
                <input id="search-input" type="text" name="s" class="ins-search-input" placeholder="想要查找什么...">
            </form>
            <span id="close" class="ins-close ins-selectable">×</span>
        </div>
        <div class="ins-section-wrapper">
            <a id="Ty" href="#"></a>
            <div class="ins-section-container" id="PostlistBox">
                <section class="ins-section"><header class="ins-section-header">文章</header>
                <div class="ins-selectable ins-search-item" data-url="/">
                    <header>测试</header>
                    <p class="ins-search-preview">
及时搜索结果
                    </p>
                </div>
                </section><section class="ins-section"><header class="ins-section-header">页面</header>
                <div class="ins-selectable ins-search-item" data-url="/">
                    <header>测试</header>
                </div>
                </section><section class="ins-section"><header class="ins-section-header">分类</header>
                <div class="ins-selectable ins-search-item" data-url="/">
                    <header>测试<span class="ins-slug">测试</span></header>
                </div>
                </section><section class="ins-section"><header class="ins-section-header">标签</header>
                <div class="ins-selectable ins-search-item" data-url="/">
                    <header>测试<span class="ins-slug">测试</span></header>
                </div>
                </section>
            </div>
        </div>
    </div>
</div>

CSS

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.ins-search{display:none;z-index:999}
.ins-search a{-webkit-transition:none;transition:none}
.ins-search header{position:unset;width:auto}
.ins-selectable{cursor:pointer}
.ins-search-container,.ins-search-mask{position:fixed}
.ins-search-mask{top:0;left:0;width:100%;height:100%;z-index:100;background:rgba(0,0,0,.85)}
.ins-input-wrapper{position:relative}
.ins-search-input{width:100%;border:none;outline:0;font-size:16px;-webkit-box-shadow:none;box-shadow:none;font-weight:200;border-radius:0;background:#fff;line-height:20px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:12px 40px 12px 20px;border-bottom:1px solid #e2e2e2}
.ins-close{top:50%;right:10px;width:20px;height:20px;font-size:16px;margin-top:-15px;position:absolute;text-align:center;display:inline-block;font:22px/30px Arial,Helvetica Neue,Helvetica,sans-serif;color:#888;font-weight:300}
.ins-close:hover{color:#000}
.ins-search-container{left:50%;top:100px;z-index:101;bottom:100px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:540px;margin-left:-270px;border:1px solid #ccc;border-radius:.28571429rem;background:#fff;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08)}
@media screen and (max-width:559px),screen and (max-height:479px){.ins-search-container{top:0;left:0;margin:0;width:100%;height:100%;background:#f7f7f7}
}
.ins-section-wrapper{left:0;right:0;top:45px;bottom:0;overflow-y:auto;position:absolute}
.ins-section-container{position:relative;background:#f7f7f7}
.ins-section{font-size:14px;line-height:16px}
.ins-section .ins-search-item,.ins-section .ins-section-header{padding:8px 15px}
.ins-section .ins-section-header{color:#9a9a9a;border-bottom:1px solid #e2e2e2}
.ins-section .ins-slug{margin-left:5px;color:#9a9a9a}
.ins-section .ins-slug:before{content:'('}
.ins-section .ins-slug:after{content:')'}
.ins-section .ins-search-item .ins-search-preview,.ins-section .ins-search-item header{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#616161}
.ins-section .ins-search-item header i{margin-right:8px}
.ins-section .ins-search-item .ins-search-preview{height:15px;font-size:12px;color:#9a9a9a;margin:5px 0 0 20px}
.ins-section .ins-search-item.active,.ins-section .ins-search-item:hover{color:#fff;background:#006bde}
.ins-section .ins-search-item.active .ins-search-preview,.ins-section .ins-search-item.active .ins-slug,.ins-section .ins-search-item:hover .ins-search-preview,.ins-section .ins-search-item:hover .ins-slug,.ins-section .ins-search-item:hover header{color:#fff}

JS:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var QueryStorage = [];
search_a("这里填写生成的json链接");
var otxt = document.getElementById("search-input"),
    list = document.getElementById("PostlistBox"),
    Record = list.innerHTML;
document.all ? otxt.onpropertychange = function() {
    query(QueryStorage, otxt.value, Record)
} : otxt.oninput = function() {
    query(QueryStorage, otxt.value, Record)
};

function search_a(val) {
    var _xhr = new XMLHttpRequest();
    _xhr.open("GET", val, true);
    _xhr.setRequestHeader("Content-Type", "application/json");
    _xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    _xhr.send(val);
    _xhr.onreadystatechange = function() {
        if (_xhr.readyState == 4 && _xhr.status == 200) {
            json = _xhr.responseText;
            if (json != "") {
                QueryStorage = JSON.parse(json)
            }
        }
    }
}
if (!Object.values) Object.values = function(obj) {
    if (obj !== Object(obj)) throw new TypeError('Object.values called on a non-object');
    var val = [],
        key;
    for (key in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, key)) {
            val.push(obj[key])
        }
    }
    return val
}
function a(a) {
    document.getElementById("Ty").href = a.getAttribute("href"), document.getElementById("Ty").click()
}
function query(a, b, c) {
    var n, o, p, q, d = "",
        e = "",
        f = "",
        g = "",
        h = "",
        i = '<div class="ins-selectable ins-search-item" onclick="a(this)" href="',
        j = '<section class="ins-section"><header class="ins-section-header">',
        k = "</header>",
        l = "</section>",
        m = Cx(a, b);
    for (n = 0; n < Object.keys(m).length; n++) switch (o = m[n].this) {
    case "post":
        e = e + i + m[n].link + '"><header>' + m[n].title + '</header><p class="ins-search-preview">' + m[n].comments + m[n].text + "</p></div>";
        break;
    case "tag":
        f = f + i + m[n].link + '"><header>' + m[n].title + '<span class="ins-slug">' + m[n].text + "</span></header></div>";
        break;
    case "category":
        g = g + i + m[n].link + '"><header>' + m[n].title + '<span class="ins-slug">' + m[n].text + "</span></header></div>";
        break;
    case "page":
        h = h + i + m[n].link + '"><header>' + m[n].title + '</header><p class="ins-search-preview">' + m[n].comments + m[n].text + "</p></div>"
    }
    e && (d = d + j + "文章" + k + e + l), h && (d = d + j + "页面" + k + h + l), g && (d = d + j + "分类" + k + g + l), f && (d = d + j + "标签" + k + f + l), p = document.getElementById("PostlistBox"), q = document.getElementById("search-input"), p.innerHTML = "" == q.value ? c : d
}
function Cx(arr, q) {
    i = arr.filter(v = > Object.values(v).some(v = > new RegExp(q + '').test(v)));
    return I
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《重塑认知:Django MVT架构的多维剖析与实践》
MVT,即Model - View - Template,是Django框架独特的架构模式。它看似简单的三个字母,实则蕴含着深刻的设计哲学,如同古老智慧的密码,解开了Web应用开发的复杂谜题。
程序员阿伟
2025/05/27
890
《重塑认知:Django MVT架构的多维剖析与实践》
Django框架:优缺点、实用场景及与Flask、FastAPI的对比
Django是一个使用Python语言编写的高级Web框架,它提供了快速开发、可重用和可维护的Web应用程序所需的一切组件。在本文中,我们将探讨Django的get和post请求、优缺点、实用场景以及与Flask、FastAPI的对比。
江一铭
2023/06/04
2.6K0
Django框架完全指南:从入门到高级应用
Django是一个高效、功能强大的Python Web框架,它被广泛用于构建各种规模的Web应用程序。无论是初学者还是有经验的开发人员,都可以从入门到掌握Django的高级技巧。在本指南中,我们将带你逐步了解Django的核心概念和高级功能,通过代码实例和解析来详细说明。
一键难忘
2024/03/14
4.3K0
框架介绍
  此外,Django还有一个URL分发器。它的作用是将一个个URL的页面请求分别发给不同的Views处理,Views再调用相应的Model和Template。
全栈程序员站长
2022/07/21
6250
框架介绍
认识Flask框架
Python Web框架里比较有名当属Django,Django功能全面,它提供一站式解决方案,集成了MVT(Model-View-Template)和ORM,以及后台管理。但是缺点也很明显,它偏重。就像是一个装潢好的房子,它提供好了你要用的东西,直接拿来用就可以。
Devops海洋的渔夫
2019/10/24
9420
认识Flask框架
2020最值得学习的12款python-web开发框架大盘点
最近JETBRAINS发布了目前最受欢迎的python-web开发框架,可以看到最受欢迎的还是Django和Flask,那么本文就对上榜的12个框架进行分类整理,一起来看看吧!
刘早起
2020/04/22
2.3K0
2020最值得学习的12款python-web开发框架大盘点
Django简单博客系统项目开发总结
Django注重组件的重用性和可插拔性,敏捷开发和DRY法则(Don't Repeat Yourself)
好派笔记
2021/09/13
7420
后端框架有哪些?8个流行的后端框架推荐
在选择要使用的后端框架时,有许多选项可用。虽然每个后端框架都有自己的优点和缺点,但在做出最终决定之前,还有一些其他因素需要考虑。在本指南中,我们将仔细研究经过尝试的框架,以确定哪个是最适合您的后端框架。
全栈程序员站长
2022/06/28
8.5K0
后端框架有哪些?8个流行的后端框架推荐
Python测试开发django1.简介
Django是一种基于Python开发的开源的高级Web应用框架,使用Django,使你能够以最小的代价构建和维护高质量的Web应用。Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能,Python 加 Django 是快速开发、设计、部署网站的最佳组合。
王大力测试进阶之路
2020/09/07
1.3K0
Python测试开发django1.简介
Django如何开发网页
Django作为一款广泛应用于Web开发的框架,其在实际项目中的表现至关重要。掌握Django的开发技巧和最佳实践,不仅可以提高开发者的编程水平,还可以为企业节省开发成本,提高项目竞争力。此外,Django框架在我国的应用也日益广泛,对我国互联网产业的发展产生了积极推动作用。因此,对Django进行深入研究具有重要的实践意义和理论价值。
七条猫
2024/09/21
2540
Django如何开发网页
使用 Django 构建简单 Web 应用
当我们在使用Django构建Web应用时,通常将会涉及到多个步骤,从创建项目到编写视图、模板、模型,再到配置URL路由和静态文件,最后部署到服务器上。所以说如果有一个环节出了问题,都是非常棘手的,下面就是我们经常遇到的问题可以看看。
华科云商小徐
2024/04/01
1790
Django:用于轻松安全 Web 开发的高级 Python Web 框架
Django是一种高级 Python Web 框架,近年来在开发人员中广受欢迎。Django 专注于简单性、安全性和可扩展性,使开发人员可以轻松构建和部署强大的 Web 应用程序。在这份综合指南中,我们将仔细研究是什么让 Django 成为 Web 开发的绝佳选择,并详细探讨其主要特性和功能。
海拥
2023/02/27
6500
二挡起步——pythonweb开发Django框架,前端原生+Django后端框架002(附带小案例)
Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛手Django Reinhardt来命名的。Django是高水准的Python编程语言驱动的一个开源模型.视图,控制器风格的Web应用程序框架,它起源于开源社区。使用这种架构,程序员可以方便、快捷地创建高品质、易维护、数据库驱动的应用程序。这也正是OpenStack的Horizon组件采用这种架构进行设计的主要原因。另外,在Dj ango框架中,还包含许多功能强大的第三方插件,使得Django具有较强的可扩展性 [2] 。Django 项目源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来。
淼学派对
2023/10/14
4210
二挡起步——pythonweb开发Django框架,前端原生+Django后端框架002(附带小案例)
【玩转全栈】----Django基本配置和介绍
Django是一个开源的、基于Python的高级Web框架,旨在以快速、简洁的方式构建高质量的Web应用程序。它由经验丰富的开发者设计,遵循“Don’t Repeat Yourself”(不要重复自己)和“Convention over Configuration”(约定优于配置)的原则,大大提高了开发效率和代码可维护性。Django内置了强大的功能,例如URL路由、ORM(对象关系映射)、模板引擎、表单处理和用户认证等,帮助开发者轻松实现从简单的网站到复杂的企业级应用。它还提供了一个直观的管理后台,让开发者可以快速管理数据模型和内容。此外,Django具有高度的安全性,内置防护如SQL注入、跨站脚本攻击(XSS)和跨站请求伪造(CSRF)。凭借其丰富的文档和强大的社区支持,Django成为开发者快速构建Web应用的首选框架之一,非常适合注重开发速度、代码质量和安全性的项目。
用户11404404
2025/01/02
2340
【玩转全栈】----Django基本配置和介绍
解锁Python Django框架的无限可能:构建现代化、高效的Web应用
在当今数字化时代,Web应用的需求不断增长,而Python的Django框架已经成为许多开发者的首选工具之一。Django以其简洁、高效、可扩展的特性,为开发者提供了强大的工具,帮助他们构建现代化、功能丰富的Web应用程序。
海拥
2023/12/13
3200
众多Python Web框架比较,哪个适合你,你就用哪个!
Python程序员有很多很好的选择来创建Web应用程序和API;Django,Weppy,Bottle和Flask引领潮流。
一墨编程学习
2018/12/06
5.1K0
Python: 10大Web框架简介
在这篇文章中了解一些可供您使用的最佳 Python Web 框架,您可以考虑将它们用于创建 Web 应用程序。Python 是可用于 Web 应用程序开发的最佳框架之一。尽管存在其他框架,但Python是最有前途的,它提供了开发超现代 Web 应用程序所需的各种功能。如果您正在寻找一个框架来启动一个专业的基于 Web 的应用程序,那么 Python 将是正确的选择。本文专门介绍 Python Web 框架,在这里我们试图涵盖所有相关方面。Web 开发过程中最重要和必要的部分是开发最终用户将用于实现其目的的实际网站或 Web 应用程序。什么样的平台都没有关系。无论是使用 Android 还是 iOS、Windows 还是 Mac OS X 等。它应该以最适合最终用户要求的方式进行开发,并且应该为他们提供他们在其网站/Web 应用程序上寻找的所有功能。Python Web 框架用于开发超现代的 Web 应用程序,这已成为任何企业或组织通过向全球客户和客户提供最佳服务来扩展业务的首要要求。
Freedom123
2024/03/29
2K0
Python: 10大Web框架简介
Python四大主流网络编程框架,你知道么?
Tornado 是使用 Python 编写的一个强大的可扩展的 Web 服务器。它在处理高网络流量时表现得足够强健,却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中。Tornado 作为 FriendFeed 网站的基础框架,于2009年9月10日发布,目前已经获得了很多社区的支持,并且在一系列不同的场合中得到应用。除 FriendFeed 和 Facebook 外,还有很多公司在生产上转向Tornado,包括 Quora、Turntable.fm、Bit.ly、Hipmunk 及 MyYearbook 等。
小小科
2020/05/27
2.5K0
Python 四大主流 Web 编程框架
本文内容摘录自《Python高效开发实战——Django、Tornado、Flask、Twisted》一书。
程序员小猿
2021/01/19
1.9K0
Python 四大主流 Web 编程框架
django或flask:哪一个是最好的python web框架?
Web框架使Web开发人员的开发尽可能简单。然而,Python是最流行的编程语言之一,它在后端开发中的应用得到了许多贡献。
gglx
2021/09/17
2.4K0
推荐阅读
相关推荐
《重塑认知:Django MVT架构的多维剖析与实践》
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验