很有意思的小功能,类似于百度或者Google搜索的时候都会有提示,Z-Blog的搜索也可以做成有提示的,但受限于性能的限制,搜索提示的数据来自于文章的Tag。

效果如图:

一段JS代码,你需要把它保存为common.js并且放到你的主题目录中去,然后在每一个有搜索框的模板上引入这段代码:
[code=java]
//Parse Timeout
function pasIntTimeOut(){
if (isNaN(intAjaxTimeOut) || intAjaxTimeOut==""){intAjaxTimeOut=6000;}
if (parseInt(intAjaxTimeOut)<2000){intAjaxTimeOut=2000;}
}

//Search Function
var findHintTimer=0;
function startFindHint(sWords,event){
var ev = null;
var n = -1;
var i = 0;
if (window.event){ev = window.event;}else{ev = event;}
var $obj = $("#searchHint>ul>li").each(function(){
if ($(this).attr("class")=="hint-sel"){
n = i;
}
i++;
});
if(ev !=null){
switch(ev.keyCode){
case 13: //enter
if ($("#searchHint>ul>li.hint-sel").size()>0){
window.location.href=$("#searchHint>ul>li.hint-sel").children("a").attr("href");
return false;
}
break;
case 38: //up
$("#searchHint>ul>li").eq(n).removeAttr("class");
n=n-1;
if (n<=-1){n=i-1;}
if (n>=0){$("#searchHint>ul>li").eq(n).attr("class","hint-sel");}
return false;
break;
case 40: //down
$("#searchHint>ul>li").eq(n).removeAttr("class");
n++;
if (n>=i){n=0;}
if (n<=i){$("#searchHint>ul>li").eq(n).attr("class","hint-sel");}
return false;
break;
default :
cancleFindHint();
findHintTimer=setTimeout(function(){findHint(sWords);},400);
break;
}
}

}
function cancleFindHint(){
clearTimeout(findHintTimer);
findHintTimer=0;
}
function hideHint(){
setTimeout(function(){$("#searchHint").hide();},200);
}
function findHint(sWords){
var $objContent = $("#searchHint");
if (sWords==""){
setTimeout(function(){$objContent.hide();},200);
}else{
pasIntTimeOut();
$.ajax({
type: 'POST', dataType: 'html', timeout: parseInt(intAjaxTimeOut/4), data:"inpWords="+sWords.replace(" ","%20"),
url: str00+"themes/"+strThemeName+"/plugin/hint.asp",
success: function(data){
$objContent.html(data);
if (data!==""){
$objContent.show();
}else{
$objContent.hide();
}
}
});
}
}
$(document).ready(function(){
$("input.keyword").attr("autocomplete","off");
//因为有时候这个输入框输入的搜索内容多了,本身会有一个提示功能,所以让这个autocomplete的属性off掉。
});[/code]

下面是一段asp代码,你要把它保存为hint.asp并放在主题的plugin目录中:
[code=java]<%@ LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
'///////////////////////////////////////////////////////////////////////////////
'// 插件应用: Z-Blog 1.8 +
'// 插件制作: HP esloy.com
'// 备 注: 这段代码来自于HP的情侣主题
'// 最后修改:
'// 最后版本:
'///////////////////////////////////////////////////////////////////////////////
%>
<% Option Explicit %>
<% On Error Resume Next %>
<% Response.Charset="UTF-8" %>
<% Response.Buffer=True %>








<%
Call System_Initialize()

'检查是否启用
If Not LCase(ZC_BLOG_THEME)=LCase("illacrimo2") Then Call ShowError(48)
//上面这行可以去掉,判断当前主题的。

Dim strReferer
strReferer=CStr(Request.ServerVariables("HTTP_REFERER"))
If Instr(strReferer,ZC_BLOG_HOST)=0 Then
ShowError(5)
End If

Dim strWords : strWords=Request.Form("inpWords")
Call CheckParameter(strWords,"sql",-1)
strWords=FilterSQL(strWords)

Dim Tag
Dim objRS
Dim strOutPut

If strWords<>"-1" Then

Set objRS=objConn.Execute("SELECT TOP 15 [tag_ID] FROM [blog_Tag] WHERE [tag_Name] LIKE '%" & strWords & "%' ORDER BY [tag_Count] DESC")
If (Not objRS.bof) And (Not objRS.eof) Then
strOutPut = strOutPut & "

"
End If
objRS.Close
Set objRS=Nothing

End If


Response.Write strOutPut

Call System_Terminate()

If Err.Number<>0 then
Call ShowError(0)
End If
%>[/code]

最后一步,加上触发代码:
[code=html]

[/code]
实际上是修改你的搜索框,主要加上的是onblur、onkeyup这两个属性,还有下面的id为searchhint的div。

连续几篇都是在剥离高手的主题插件,实际上Z-Blog自身有很多优秀的主题插件,只不过作者都比较喜欢说自己的主题好,从来不说主题插件好…

  14 Responses to “Z-blog技巧之搜索自动提示”

  1. 兄弟、辛苦了。这么好的东西只有在你这里才能找得到。

  2. 这个好早我跟HP大哥提过,他说会加大系统的负载.[GRAVATAR=http://www.birdol.com/]acb31bc1883ad280a90d8044f61b3009[/GRAVATAR]

    nobird 于 2011-6-14 21:39:14 回复

    1、使用的是tag,搜索量不大
    2、应该没有谁无聊到一直在那鼠标点来点去的搜索吧….exclaim

  3. 如上贴,不太懂这些技术问题,一见代码就嫌麻烦

  4. 代码,有木有,有木有·····

  5. 这个非常不错,有利于用户的搜索体验。

    不过对于搜索功能被使用几率很小的ZB站点,这么好的功能可能已经无所谓了。

  6. 不错的功能,记录一下

  7. 膜拜楼主!
    不过这个站为什么360提示危险?

  8. 测试不成功呢

  9. <div id="searchHint"></div> 这个你教程里没提及 研究3小时了。。。
    教程严重不完整啊 重新研究原版的程序 分离试试[GRAVATAR=http://www.birdol.com/]acb31bc1883ad280a90d8044f61b3009[/GRAVATAR]

    nobird 于 2011-6-16 21:35:17 回复

    嘿嘿现在看到代码肯去实打实测试的不多了…我也不例外…欢迎继续反馈信息~

  10. 教程里有很多被提示无效字符的东西 你装的啥编码替换?[GRAVATAR=http://www.birdol.com/]acb31bc1883ad280a90d8044f61b3009[/GRAVATAR]

    nobird 于 2011-6-16 21:40:56 回复

    不会吧…代码高亮是chili的着色引擎。所有文件建议保存为utf-8. 无效对象可能是我教程漏掉的哦…嘿嘿…

  11. 依然不行
    你试试自己把你文章里的asp复制粘贴到dw里,生成个asp运行试试
    会提示无效字符的 无效字符就是代码间的空格

    http://zblog.qiusongsong.net/search.asp 严格按教程第二次测试后 无效[GRAVATAR=http://www.birdol.com/]acb31bc1883ad280a90d8044f61b3009[/GRAVATAR]

    nobird 于 2011-6-18 18:26:51 回复

    本站就是个很好的演示~ 空格的问题我这直接复制到记事本,没发现异常~ 你怎么复制的?

  12. http://zblog.qiusongsong.net/themes/moonlab/plugin/hint.asp 直接访问 出错 我发现你的也出错 但你的功能实现了

    我又跑去官方的看了看 他的会显示内容出来[GRAVATAR=http://www.birdol.com/]acb31bc1883ad280a90d8044f61b3009[/GRAVATAR]

    nobird 于 2011-6-18 17:21:58 回复

    当然直接访问出错,hint.asp里检查着referer呢,直接访问肯定出错。

  13. 呵呵,大部分的看不懂啊。

  14. 给个直接可用的文件压缩包吧 我再试试[GRAVATAR=http://www.birdol.com/]acb31bc1883ad280a90d8044f61b3009[/GRAVATAR]

    nobird 于 2011-6-20 20:13:33 回复

    复制和压缩包应该没区别的。
    1、不会是本站代码编码的问题,因为之前的文章有人复制去试用过,而且成功了。
    2、不保证这篇文章里我没忘记什么,因为这个功能在我这个站点上实现起码2年了,记忆力再佳也不靠谱。

    当然,核心就是这两个文件。

Sorry, the comment form is closed at this time.

   
© 2011 鸟儿博客 Suffusion theme by Sayontan Sinha