支持百度的搜索引擎来源的关键字加亮

衣明志 发表于 , 阅读 (15556)

我们在上网使用搜索引擎的时候,经常会遇到类似这样的一个问题:从Google上搜索到了一个包含了“税收”的文章,但是打开对应的网站页面时发现这篇文章很长,很难确定税务在文章中的位置,即使使用浏览器的查找功能,也并不爽。那么如何改进信息类网站在此需求上的用户体验呢?一个国外的朋友做了件好事情:http://www.kryogenix.org/code/browser/searchhi/,他在这个页面上提供了一个js,可以很方便的实现我们的需求。但是这个脚本对baidu没有什么效果为什么呢?首先我们看看他的部分代码:

……
if (qsip[0] == 'q' || qsip[0] == 'p') { // q= for Google, p= for Yahoo
    words = unescape(qsip[1].replace(/\+/g,' ')).split(/\s+/);
    for (w=0;whighlightWord(document.getElementsByTagName("body")[0],words[w]);
    }
}
……

上述代码获取来源地址中q或p的值,q对应的是google的搜索关键字,p是Yahoo的搜索关键字,而且这两个关键字是utf-8编码的,使用js自然可以很方便的处理,但是百度搜索的则有较大不同:搜索关键字的对应的地址参数是wd,且编码为GB2312。如何解决这个问题呢?我这里使用了js结合vbs的办法来解决该问题。

首先我们使用vbs写一个函数解决编码问题:

Function DeCodeAnsi(s)
Dim i, sTmp, sResult, sTmp1
sResult = ""
For i=1 To Len(s)
If Mid(s,i,1)="%" Then
sTmp = "&H" & Mid(s,i+1,2)
If isNumeric(sTmp) Then
If CInt(sTmp)=0 Then
i = i + 2
ElseIf CInt(sTmp)>0 And CInt(sTmp)<128 Then
sResult = sResult & Chr(sTmp)
i = i + 2
Else
If Mid(s,i+3,1)="%" Then
sTmp1 = "&H" & Mid(s,i+4,2)
If isNumeric(sTmp1) Then
sResult = sResult & Chr(CInt(sTmp)*16*16 + CInt(sTmp1))
i = i + 5
End If
Else
sResult = sResult & Chr(sTmp)
i = i + 2
End If
End If
Else
sResult = sResult & Mid(s,i,1)
End If
Else
sResult = sResult & Mid(s,i,1)
End If
Next
DeCodeAnsi = sResult
End Function

然后在js中调用这个vbs的函数:

if (qsip[0] == 'wd') { // wd= for baidu
    if(qsip[1]=='') continue;
    execScript('wd = DeCodeAnsi("'+qsip[1]+'")','vbscript');
    words = decodeURI(wd.replace(/\+/g,' ')).split(/\s+/);
    for (w=0;whighlightWord(document.getElementsByTagName("body")[0],words[w]);
    }
}

ok问题解决了。

使用的时候在网页中加上以下两行就好了:
searchhi.js (2.23 KB)
searchhi.vbs (.93 KB)

2 条评论
thw
thw 2006-10-17 09:15
看起来很有用,但是不清楚具体什么意思?是不是就是关键字高亮?
phenge
phenge 2006-10-20 06:05
如果q或p的值为空的话,就会进入死循环。ie会死掉!