正在加载...
欢迎订阅本站RSS,RSS地址:http://feed.css9.net。选择您使用的阅读器:Google Reader鲜果抓虾

微软在今年六月正式发布了Live搜索的继承者Bing,同时也提供了一套非常全面的API。如同Google API,通过使用Bing API,Web开发者可以在网站中集成bing搜索中的各种服务,从而丰富网站功能,并为网站带来流量。CSS9.NET在本篇文章通过一个完整的使用示例,向大家展示如何使用jQuery来调用Bing API实现简单的Web搜索引擎,并对Bing API有一个基本的了解。

首先我们来感性感受一下:在线示例

Bing API提供了三种检索结果数据类型:SOAP、XML、JSON,在示例中是通过jQuery ajax调用json数据类型接口展示数据的。下面我们来看它的实现:

准备工作:

微软通过Bing API站点向我们展示了详细的开发文档:

  1. 访问bing开发者站点:http://bing.com/developers,在这里也可以找到Bing API在MSDN上的入口
  2. 使用微软的账户登录(没有只能先注册一个啦)
  3. 填写表格,获取“APP ID”(用来调用API时用的,微软要确定你是微软的开发者)

HTML部分

页面元素很简单,主要包括检索入口、结果显示区域、结果描述、错误信息显示及翻页导航五部分,下面看HTML:

        <div class="line search-content">
            <div class="column col-threefifths">
                <h3 id="results-header"></h3>
                <p id="results-summary"></p>
<!--结果显示区域-->
                <div id="search-result">
                    <h3>搜索结果</h3>
<!-- 结果描述,例如总共多少条,但前是哪些条 -->
                    <div id="result-aggregates" class="results"></div>
                    <ul id="result-list" class="results">
                    </ul>
<!--翻页导航-->
                    <ul id="result-navigation" class="result-navigation">
                        <li id="prev">&laquo;</li>
                        <li id="next">&raquo;</li>
                    </ul>
                </div>
<!--错误信息显示-->
                <p id="error-list">
                </p>
            </div>
<!-- 搜索入口 -->
            <div class="column last-col">
                <h3>输入搜索词:</h3>
                <p>
                    <input id="txtQuery" type="text" title="Search Terms" />
                    <button id="btnSearch" type="button" title="搜索">搜索</button>
                </p>
            </div>
        </div>

通过jQuery调用Bing API部分

  1. 定义Bing API需要传入的一些参数:
        //申请的APP ID,这里换成你自己的。
        var AppId = "AppId=31F3C13DC5D41C42D4A18F9E04DE1DEA73762186";
        //通过用户输入搜索词获得检索串
        var Query = "Query="
        //指定检索来源类型,Bing提供了网页、视频、图片等所有类型,参考API
        //这里指定的是网页类型
        var Sources = "Sources=Web";
        //指定API版本
        var Version = "Version=2.0";
        //指定所在地区,如google,每个地区搜索结果是不一样的,这里指定中国
        var Market = "Market=zh-cn"; 
        //一些选项设置,这里开启搜索结果中的搜索词高亮
        var Options = "Options=EnableHighlighting";
        //每页返回条数
        var WebCount = 10;
        //当前为第几页,从0开始的
        var WebOffset = 0;
  2. 为搜索按钮绑定处理方法:

    $(function() {
        $('#btnSearch').click(function() {
    //这里调用最关键的Search方法,取数据
            Search();
        });
    });
  3. 下面来看最关键的Search部分,调用API获取结果数据:

    $(function() {
    function Search() {
     
    //获取用户输入的搜索词,并替换空格为“+”
            var searchTerms = $('#txtQuery').val().replace(" ", "+");
     
    //防止传输中文时产生乱码
            searchTerms = encodeURI(searchTerms);   
     
    //将接口需要的所有参数封装为数组
            var arr = [AppId, Query + searchTerms, Sources, Version, Market, Options, "Web.Count=" + WebCount, "Web.Offset=" + WebOffset, "JsonType=callback", "JsonCallback=?"];
     
    //将参数数组拼装成url串,最终得到bing的URL Service的请求URL
            var requestStr = "http://api.search.live.net/json.aspx?" + arr.join("&");
     
    //通过jquery ajax调用bing json数据接口
            $.ajax({
                type: "GET",
                url: requestStr,
     //指定数据类型为jsonp
                dataType: "jsonp",  
     
    //调用成功后返回数据对象,并调用处理方法
                success: function(msg) {
                    SearchCompleted(msg);
                },
                error: function(msg) {
                    alert("Something hasn't worked\n" + msg.d);
                }
            });
        }
    });

    我们看到在使用jquery ajax时,指定数据类型为jsonp,jsonp是一种可跨域访问的协议,我对其也不是非常清楚,可以在这里了解一下。另外 CSS9.NET 也计划在后面的文章中讲解json的相关知识,敬请关注。

  4. 再来看获取到数据后的UI处理,主要包括显示结果和显示错误信息两部分:

     
        function SearchCompleted(response) {
    //检查结果数据对象中的Errors对象,判断是否发生错误
            var errors = response.SearchResponse.Errors;
            if (errors != null) {
                // 发生错误的话调用错误信息显示方法
                DisplayErrors(errors);
            }
            else {
                // 没有错误的话调用结果信息显示方法
                DisplayResults(response);
            }
        }

    下面是显示结果方法,因为要改变UI,所以代码多一点,不过这里可以感受一下jquery中dom操作的灵活。

        function DisplayResults(response) {
    //清空结果列表
            $("#result-list").html("");  
     //清空翻页导航
            $("#result-navigation li").filter(".nav-page").remove();   
    // 清空结果描述信息
            $("#result-aggregates").children().remove(); 
     
    //获取结果数据对象
            var results = response.SearchResponse.Web.Results;  
     
    //描述信息部分,即总过多少条,当前是哪些条
            $('#result-aggregates').prepend("<p>检索词: " + response.SearchResponse.Query.SearchTerms + "</p>");
            $('#result-aggregates').prepend("<p id=\"result-count\">当前显示 " + StartOffset(results)
                + " 至 " + EndOffset(results)
                + "&nbsp;&nbsp;总共:" + parseInt(response.SearchResponse.Web.Total) + "</p>");
     
    //创建结果列表,把每一项要显示的内容放在一个数组中
            var link = [];  
    //因为开启了搜索词高亮选项,这里进行高亮匹配
            var regexBegin = new RegExp("\uE000", "g");    
            var regexEnd = new RegExp("\uE001", "g");     
            for (var i = 0; i < results.length; ++i) {
    //创建每一结果项的信息
                link[i] = "<li><a href=\"" + results[i].Url + "\" title=\"" + results[i].Title + "\">"
                    + results[i].Title + "</a>"
                    + "<p>" + results[i].Description + "<p>"
                    + "<p class=\"result-url\">" + results[i].Url + "</p></li>";
     
    //搜索词加粗显示
                link[i] = link[i].replace(regexBegin, "<strong>").replace(regexEnd, "</strong>");
            }
    //在页面结果区域显示结果列表    
           $("#result-list").html(link.join('')); 
     
    //处理导航区域
            CreateNavigation(response.SearchResponse.Web.Total, results.length);
        }

导航部分代码比较简单,就不在这里大块的贴了,直接下载代码看吧。

下载:示例源码

另外,在MSDN的bing api部分为开发者提供了非常多的代码实例,感兴趣的可以去看。

—————————————————————————–

有朋友留言提出检索中文的时候出现乱码。我又做了测试,如这位朋友所说,在IE中检索时有乱码情况,但是在Firefox中正常(我此前只在Firefox下做测试,故未发现)。

出现这种情况,是由于ajax传输中文检索词时产生乱码,所以传递前需编码,改正如下:

在function.js中第二十行var searchTerms = $(’#txtQuery’).val().replace(” “, “+”); 后添加下面一句:

searchTerms = encodeURI(searchTerms);   //防止传输中文时产生乱码

在线示例及下载源码已更正,感谢sundy提出问题。

延伸阅读:

  1. 实现文字高亮功能的两种解决方案(Javascript/Jquery)
  2. 实现页面不同位置间平滑滚动的两种解决方案
  3. Jquery Tools——不可错过的Jquery UI库(二)
  4. 完美显示文件树的Jquery插件(支持Ajax及多种动态脚本)
  5. 通过JQuery实现所有外部链接从新窗口打开
  6. 强大的Jquery图表绘制插件 —— jqPlot
  7. FullSize:一个新的IMG标签属性(附带JQuery实现)
  8. 使用Jquery实现禁用鼠标右键


版权声明:

本站内容受著作权法保护。个人网站、blog转载时请遵循 “署名-非商业用途-保持一致” 的创作共用协议;商业网站或媒体未授权不得复制本站内容。

友情提示:

如对本文有任何疑问,或在示例的使用中遇到问题,或有好的建议,欢迎在下面留言共同学习,有问必答。

: http://css9.net/jquery-ajax-bing-api-search/

本文相关评论 - 才 22 条评论
2009-06-28 11:05:30

哎~虽然用Bing的Webmastertools提交了sitemap,但是始终没收录~~

2009-06-28 11:59:26

在bing里面怎样查是否收录呢? site:css9.net 命令好像不管用。 我也去提交试试。。

2009-06-30 23:54:12

Bing也跟Google一样有个Webmaster Center。把Bing切换到米国之后在页面右上角有个Extra,展开就看到了。

2009-06-30 23:58:48

刚看了一下,好像改版了,里面只能提交站点,不知道怎么搞的…

2009-07-02 09:14:30

忽然发现地址改了,在这里:http://www.bing.com/webmaster/

2009-07-02 09:34:56

感谢提供,我已经提交CSS9.NET了。
需要注意的是,bing中网站信息提交后,bing需要确认提交信息者是站长本身,它提供了两种途径,一个是把它提供的一个xml文件放在网站根路径下或者在页面头部加一个它提供的meta标签。

2009-07-01 18:40:22

哈哈,我没有提交,刚才在bing里面试了下:site:css9.net 已经有文章被收录了

2009-06-30 19:47:47

有空我也来试试!

2009-07-01 14:49:33

教程写的很详细,向博主学习了。

2009-07-01 15:19:49

多提问题,互相学习。

2009-07-01 17:22:21

bing.com不是被封了吗? 而且bing收录的 好像没有google 好。

2009-07-01 18:38:28

bing.com已经解封了呀。呵呵,只是作为新兴事物研究下他。而且工作用的很多东西都是微软的,所以格外关心下。

sundy
2009-07-02 10:41:40

貌似输入汉字关键词,显示的结果是乱码。
输入英文关键词,则能显示正常的汉字结果。
啥意思?

2009-07-02 12:29:32

你提到的问题已更正,详细解释见文章最后部分。非常感谢提出问题。

2009-07-02 20:34:09

果然非常的强大

2009-07-02 21:43:08

嗯,这个真的很强大啊

shh.boy
2009-09-21 17:28:29

貌似不能只搜标题 ,这个比较郁闷

2010-01-07 17:38:25

不错

2010-04-04 15:19:11

在搜索之后翻页时,效果不明显,第了第几页也不知道,有没办法弄.

CAS
2010-04-21 18:27:05

您好!我遇到了很奇怪的问题。。

上传上去这些文件过后,网页可以正常显示,点下搜索后,我自己的机器可以显示出搜索结果,但是其他机器点下搜索后,都没有任何反应。。

我试过了换各种浏览器,还是问题如故,请大虾帮忙给点思路解决问题吧。。

2010-07-10 16:05:48

I totally love this article. I think you could write some other things to make your blog more complete.For example: ed hardy.vibram five fingers.p90x workout schedule. mbt shoes. hardy caps. vibram fivefingers kso trek. mbt chapa dawn shoes.
ghd straightener
ugg ugg boots
replica louis vuitton handbags
edhardyI thought that many people can like.

2010-07-31 09:53:56

Really trustworthy blog. Please keep updating with great posts like this one. I have booked marked your site and am about to email it to a few friends of mine that I know would enjoy reading..
Vibram Five Fingers KSO
Vibram Five Fingers Flow
Vibram Five Fingers KSO Trek
vibram shoes
cheap vibram five fingers
barefoot shoes
Christian Louboutin heels
Christian shoes
Louboutin shoes
Christian Louboutin online
Christian Louboutin Dior
Christian Dior
Louboutin Dior

 填写8 + 10的结果