<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml xml:lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/vnd.wap.wml; charset=utf-8"/>
<meta http-equiv="Cache-Control" content="no-cache"/></head>
<card title="OpenSearch 初探 - Gracecode.com">
<p>很多现代的浏览器在地址栏的右边有个搜索框，默认的安装有 Google 搜索等。如下图所示</p>

<p><img src="http://www.gracecode.com/upload/2008_06_17/1213670001.png" alt="http://www.gracecode.com/upload/2008_06_17/1213670001.png" title="http://www.gracecode.com/upload/2008_06_17/1213670001.png" /></p>

<p>其实这是 <a href="http://www.opensearch.org/" title="http://www.opensearch.org/">OpenSearch</a> 的一个应用，只要编写相应的微格式的 xml 文件，就可以制定相应的搜索框。</p>

<p>参考 <a href="http://www.opensearch.org/Specifications/OpenSearch/1.1" title="http://www.opensearch.org/Specifications/OpenSearch/1.1">OpenSearch 的定义文档</a>，可以基本获得基本的 xml 格式。比如某个典型的的搜索 xml 文件可以这样指定。</p>

<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;OpenSearchDescription xmlns=&quot;http://a9.com/-/spec/opensearch/1.1/&quot;&gt;
    &lt;InputEncoding&gt;utf-8&lt;/InputEncoding&gt;
    &lt;ShortName&gt;ShortName&lt;/ShortName&gt;
    &lt;Description&gt;Description&lt;/Description&gt;
    &lt;Image type=&quot;image/vnd.microsoft.icon&quot;&gt;favicon&lt;/Image&gt;
    &lt;Url type=&quot;text/html&quot; template=&quot;http://who.am.i/search?word={searchTerms}&quot;/&gt;  
&lt;/OpenSearchDescription&gt;</pre><p>上面的 xml 文件很容易理解，除了固定的 xml 根以外，其他的定义从字面上就可以理解：</p>

<ul>
    <li>InputEncoding 指定搜索的编码，根据网站的实际情况而定</li>
    <li>ShortName 这个是搜索的短名称，比如“Google 搜索”</li>
    <li>Description 针对这个搜索框的描述，比如“淘宝购物搜索 - 只有你想不到，没有你淘不到”</li>
    <li>Image 类似网页的 favicon ，用于标识搜索</li>
    <li>Url 这个是最重要的参数，指定搜索的链接。它有很多参数，一般使用 {searchTerms} 参数指定搜索词即可。参数  type="text/html" 注明返回的是页面（浏览器会跳转到这个页面），如果是其他格式就会使用相应默认程序打开（比如 type="application/rss+xml" 就会使用 RSS 阅读器打开）。</li>
</ul>

<p>编写 OpenSearch 的 xml 格式就完成了，详细信息可以参阅其 <a href="http://www.opensearch.org/Specifications/OpenSearch/1.1" title="http://www.opensearch.org/Specifications/OpenSearch/1.1">OpenSearch 定义文档</a>。</p>

<p>下面要在页面中加入这个搜索，基本上可以分为两种方式。分别是页面的在 head 中加入 link 标记（类似 RSS），以及使用 Javascript 方式添加（比如定义某个按钮触发）。</p>

<p>加入 link 标记非常简单，格式如下</p>

<pre>&lt;link rel=&quot;search&quot; type=&quot;application/opensearchdescription+xml&quot; 
            href=&quot;http://who.am.i/search.xml&quot; title=&quot;ShortName&quot; /&gt;</pre><p>与 RSS 相似，rel 和 type 是固定的，我们主要指定 href （上述 xml 的 url 路径，保险起见使用绝对路径，即 http:// 开头）以及 title （也就是搜索的短标题）即可。</p>

<p>就这样，在 Explorer 以及 Firefox 中打开这个页面就可以看见相应的菜单了，如图所示</p>

<p><img src="http://www.gracecode.com/upload/2008_06_17/1213670018.png" alt="http://www.gracecode.com/upload/2008_06_17/1213670018.png" title="http://www.gracecode.com/upload/2008_06_17/1213670018.png" /></p>

<p>使用 Javascript 添加比较麻烦（或许现在的情况会很好多）。我们主要会使用浏览器的扩展功能，在 Explorer 有个 window.external.AddSearchProvider 参数（<a href="http://msdn.microsoft.com/en-us/library/aa744112.aspx" title="http://msdn.microsoft.com/en-us/library/aa744112.aspx">详细文档</a>）。</p>

<p>典型的调用方法如下</p>

<pre>window.external.AddSearchProvider('http://who.am.i/search.xml');</pre><p>参数中的链接就是上述 link 中的内容。在 Firefox 下可以使用</p>

<pre>window.sidebar.addSearchEngine(
    &quot;http://who.am.i/search.xml&quot;,  /* engine URL */
    &quot;favicon.ico&quot;,  /* icon URL */
    &quot;ShortName&quot;, /* engine name */
    &quot;Description&quot; );            /* category name */</pre><p>参数和例子如示例代码中所述（<a href="http://www.mozilla.org/projects/search/technical.html" title="http://www.mozilla.org/projects/search/technical.html">官方文档</a>）。值得注意的是在 Firefox2 版本以后已经“兼容” Explorer 的 window.external.AddSearchProvider 调用方法（<a href="http://developer.mozilla.org/en/docs/Adding_search_engines_from_web_pages" title="http://developer.mozilla.org/en/docs/Adding_search_engines_from_web_pages">详细信息</a>）。</p>

<p>那么我们对应的 Javascript 代码就可以这样编写（为了兼容 Firefox2 之前的版本，加入 else if 判断）</p>

<pre>function addEngine()
{
    if (window.external || window.external.AddSearchProvider) {
        window.external.AddSearchProvider('http://who.am.i/search.xml');
    } else if (window.sidebar &amp;&amp; window.sidebar.addSearchEngine) {
                window.sidebar.addSearchEngine(
                    &quot;http://who.am.i/search.xml&quot;,
                    &quot;favicon.ico&quot;,  /* icon URL */
                    &quot;ShortName&quot;, /* engine name */
                    &quot;Description&quot; ); /* category name */
    }
}</pre><p>这样，就可以将这个函数注册到某个链接或者按钮的点击事件中，就会跳出个确认框，如图</p>

<p><img src="http://www.gracecode.com/upload/2008_06_17/1213670034.png" alt="http://www.gracecode.com/upload/2008_06_17/1213670034.png" title="http://www.gracecode.com/upload/2008_06_17/1213670034.png" /></p>

<p>用户点击确认以后，就加入到浏览器搜索框中了。</p>

<p><tt>--EOF--</tt></p>

<p><a href="http://www.spreadfirefox.com/zh-CN/worldrecord" title="http://www.spreadfirefox.com/zh-CN/worldrecord">Firefox3 即将发布</a>，<a href="http://www.alipay.com" title="http://www.alipay.com">支付宝</a> 的兄弟们正在完善对于 Firefox 的支持，在这里表示关注和支持。</p>


<p>
<a href="http://www.gracecode.com/wap/">Gracecode.com</a> |
<a href="http://www.gracecode.com/wap/d/1876 ">Permalink</a>(<a href="http://www.gracecode.com/Archive/Display/1876 ">xHTML</a>) |
<a href="http://www.gracecode.com/Trackback/Recieve/1876/j7enaq">Trackback</a> |
<a href="http://rss.gracecode.com">Rss</a>
</p>
</card>
</wml>