我们在上网使用搜索引擎的时候,经常会遇到类似这样的一个问题:从 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)