用jsonp实现搜索框功能的例子

 

 在上周本来想发一篇模仿必应搜索的界面。但是在准备写文章之前突然想到前面学习了ajax技术,在这里我也让我的页面有一种不需要手动刷新就能获取到数据。但是发现用前面的方法并不能获取到我想要的效果。无奈前几天电脑换系统,把之前的源码丢了(前面有个不好的习惯就是把最近在做的东西放桌面)。今天想彻底把这个问题搞明白。

用jquery和ajax进行初步的尝试:

(本代码是参考慕课网,搜索框制作视频制作,有关具体详情请参考视频。自己之前的代码找不到了,之前最先的想法也是来自那里,所以这次直接用那里的代码)
html代码:

<div class="bg-div"> 
        <div class="search-box"> 
            <div class="logo"></div> 
            <form id="search-form"> 
                <input type="text" class="search-input-text" autocomplete="off" name="q" id="search_input" /> 
                <input type="submit" class="search-input-button" value="" id="search_submit"> 
            </form> 
        </div> 
    </div> 
      
    <div class="suggest" id="search-suggest" <!--style="display:none;"-->> 
        <ul id="search-result"> 
            <li>搜索结果1</li> 
            <li>搜索结果2</li> 
        </ul> 
</div>

css代码:

* { 
    padding: 0; 
    margin: 0; 

 
body { 
     

 
.bg-div{ 
    background-image: url('images/river.jpg'); 
    width: 1228px; 
    height: 690px; 
    margin: 0 auto; 
    position: relative; 

 
.logo { 
    background-image: url('images/logo.png'); 
    width: 107px; 
    height: 53px; 
    float: left; 
    margin: -4px 18px 0 0; 

 
form { 
    float: left; 
    background-color: #fff; 
    padding: 5px; 

 
.search-input-text { 
    border: 0; 
    float: left; 
    height: 25px; 
    line-height: 25px; 
    outline: none; 
    width: 350px; 
    font-size: 16px; 

 
.search-input-button { 
    border: 0; 
    background-image: url('images/search-button.png'); 
    width: 29px; 
    height: 29px; 
    float: left; 

 
.search-box { 
    position: absolute; 
    top: 200px; 
    left: 300px; 

 
#search-suggest { 
    width: 388px; 
    background-color: #fff; 
    border: 1px solid #999; 
    display: none; 

 
.suggest ul { 
    list-style: none; 

 
.suggest ul li { 
    padding: 3px; 
    font-size: 14px; 
    line-height: 25px; 
    cursor: pointer;/*手型*/ 
    /*这段代码去掉
    position:absolute;
    left:----px;
    top:----px;
     */

 
.suggest ul li:hover { 
    text-decoration: underline; 
    background-color: #e5e5e5; 
}

用jquery来实现效果:

在这之前,我们基本上得到了我们想要的图形效果,但是我们在搜索框内输入想要查询的内容这时候是不会有效果的(一般的搜索框效果都是在键盘输入的时候,下面会显示一部分与之关联的关键搜索信息,然后鼠标移动上去点击后会跳到相应链接)。为了一步步验证我们的思路,我们这里修改一下之前的代码,

1、将li标签中的定位去掉;2、在html中将li标签设置为隐藏。然后我们进行后面的操作。

思考一:如何在键盘输入的时候就显示相关信息(即:li标签中的内容)?

思路:我们先引入jquery,然后文档加载完后执行一个键盘事件,然后在键盘事件中改变相应的css效果

$(function() {
    //键盘事件
    $("#search_input").bind("keyup", function() {
                $("#search-suggest").show().css({
                    top : $("#search-form").offset().top + $("#search-form").height()+10,
                    left : $("#search-form").offset().left,
                    position : "absolute",
                });
    });
});

这时候,我们在搜索框中输入内容时,下面会跟着显示对应的搜索(模拟)

思考二:如何实现鼠标点击搜索按钮的时候,会搜索相应的内容?

思路:用鼠标点击事件,让鼠标点击后设置一个地址,点击后直接跳到相应地址,代码实现:

   //事件代理  --》鼠标点击事件
    $(document).delegate("li", "click", function() {        var keyword = $(this).text();
        location.href = "http://cn.bing.com/search?q=" + keyword;
 });

思考三:我们如何在搜索框输入数据时,下面会提示相关搜素信息?
思路:我们我们用jquery中的get去实现,参考代码:

var searchText = $("#search_input").val();
        $.get( "http://api.bing.com/qsonhs.aspx?q="+searchText , function(data) {
                console.log(data);
                var d = data.AS.Results[0].Suggests;
                var html = "";
                for(var i = 0; i < d.length; i++) {
                    html += "<li>"+d[i].Txt+"</li>";
                }
                $("#search-result").html(html);
            }
 , "json");

到这里,按理来说我们这里应该可以得到我们想要的结果了,但是,找了好久都没有发现哪里错了。视频里面接着描述了用JSONP来进行跨域操作,但是我也按视频中的操作,始终得不到我想要的结果,于是我埋头去看《javascript高级程序设计》,去找关于jsonp的用法

关于jsonp:

关于jsonp,《javascript高级程序设计》一书中介绍的比较少,下面是我看了之后的归纳。
    jsonp的全写是 json with padding,其出现是为了解决各主浏览器的之间的同源策略的问题,一般来说ServerA 域下面的页面是没有办法与非 ServerA 下面的资源进行沟通,而 Html 的<script>元素是个例外,利用 <script> 这个开源策略,网页可以从其他来源动态获取 json数据,而这种模式就是所谓的 JSONP,用 jsonp 抓到并不是真正意义上 的 json 而是任意的 javascript ,它是直接通过 javascript 编译器编译而不是 json 解释器。更多关于json的知

   
既然书上没有写,那就去网上搜索资源。这里截取一段和文章前面有关的信息的代码:

$.ajax({
             type: "get",
             async: false,
             url: "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998",
             dataType: "jsonp",
             jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)            
             jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据           
success: function(json){
                 alert(json.price +  json.tickets + ' 张。');
             },
             error: function(){
                 alert('fail');
             }
});

通过这段代码来修改我们自己的代码:

$.ajax({
            type: "GET",
            url: "http://api.bing.com/qsonhs.aspx?type=cb&q=" + searchText,
            dataType: "jsonp",
            jsonp: 'cb',
            success: function(data) {
                var d = data.AS.Results[0].Suggests;
                var html = "";
                for(var i = 0; i < d.length; i++) {
                    html += "<li>" + d[i].Txt + "</li>";
                }
                $("#search-result").html(html);
                $("#search-suggest").show().css({
                    top: $("#search-form").offset().top + $("#search-form").height() + 10,
                    left: $("#search-form").offset().left,
                    position: "absolute",
                });
            }
        })
更多思考:我们可以在前面增加一些判断,让我们的效果实现起来更完美

if(data == null) {
                    $("#search-suggest").hide();
                    return false;
                }
                if(data.AS == null) {
                    $("#search-suggest").hide();
                    return false;
                }
                if(data.AS.Results == null) {
                    $("#search-suggest").hide();
                    return false;
                }
                if(data.AS.Results[0] == null) {
                    $("#search-suggest").hide();
                    return false;
                }
                if(data.AS.Results[0].Suggests == null) {
                    $("#search-suggest").hide();
                    return false;
                }
经过测试前面的代码,发现还有不足,进一步修改代码:

$("#search-form").submit(function() {
        var keyword = $("#search_input").val();
        console.log("word=" + keyword);
        //if (keyword == null) {return false;} 
        location.href = "http://cn.bing.com/search?q=" + keyword;
    });

时间: 2024-10-02 03:38:13

用jsonp实现搜索框功能的例子的相关文章

jquery中用jsonp实现搜索框功能_jquery

前面的话:     在上周本来想发一篇模仿必应搜索的界面.但是在准备写文章之前突然想到前面学习了ajax技术,在这里我也让我的页面有一种不需要手动刷新就能获取到数据.但是发现用前面的方法并不能获取到我想要的效果.无奈前几天电脑换系统,把之前的源码丢了(前面有个不好的习惯就是把最近在做的东西放桌面).今天想彻底把这个问题搞明白. 用jquery和ajax进行初步的尝试: (本代码是参考慕课网,搜索框制作视频制作,有关具体详情请参考视频.自己之前的代码找不到了,之前最先的想法也是来自那里,所以这次直

《React Native移动开发实战》一一3.2 完善搜索框功能——TextInput组件

3.2 完善搜索框功能--TextInput组件 重构代码完毕后,就可以"轻装上阵",更快更好地为应用添加新功能了.按照之前首页结构的划分,先来看看搜索框.搜索框分为输入框和搜索按钮两部分,如图3.6所示. 图3.6 搜索框的结构 用户在输入框输入要搜索的关键字后,单击"搜索"按钮,即可按照输入框中的关键字进行搜索.3.2.1 搜索提示框 为了实现这样的效果,可以使用TextInput组件的onChangeText()方法.当输入框内容变化时会调用此回调函数,改变后

Angularjs material 实现搜索框功能_AngularJS

angular-material 是 AngularJS 的一个子项目,用来提供实现了 Material Design 风格的组件. Material 提供了大量的android 风格的UI组件,使用 angularjs + Material 可以很容易开发出风格接近原生 Android 5.x 的web界面.但在实际使用的过程中并不总是能满足我们的需求.开发一个组件就成了我们必须学习的内容. 下面是一个组件的实现: //前面省略若干代码 directive('mdSearchInput',[f

Windows 7开始菜单中搜索框和文件夹中搜索框功能有什么区别呢

    一样的搜索框,放到不同位置,就带上不同的搜索范围.这让才上手的用户变得不太适应,甚至有些顾客觉得windows7的搜索不好用.但是仔细查看一下,发现开始菜单中的搜索框和文件夹中的搜索框,还是有区别的.   同样的搜索框的模样,但开始菜单中的搜索框的职责并不是搜索整个硬盘,而是兼具搜索:windows文件夹.program file文件夹.path环境变量指向的文件夹.libraries.run历史里面搜索文件,甚至可以接受"控制面板命令".充当运行对话框的作用!所以说,这里的搜

针对不同搜索框小功能的优化技法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 这个高不足一厘米,长度不过十几厘米的长方形(精准数据是:谷歌为448*28,百度为356*28),叫做搜索.他像是魔术师两只手的距离,其中包容着想知道的大部分问题的答案.包容着你想要或者不想要了解的大量信息.全部在这么一个框子中. 如果我们在这个框子中键入关键词,回车,页面跳转,大批信息呈现在面前.这就是完成一个搜索过程的基本流程.这样看来,

利用jsonp跨域调用百度js实现搜索框智能提示_javascript技巧

项目中常常用到搜索,特别是导航类的网站.自己做关键字搜索不太现实,直接调用百度的是最好的选择. 使用jquery.ajax的jsonp方法可以异域调用到百度的js并拿到返回值,当然$.getScript也可以实现跨域调用js.  ok,了解了jsonp的原理和应用后,我们看看百度的智能提示是如何做的 在chrome的调试窗口下看看百度搜索发出的请求.当输入关键字"a",请求如图:  用firebug看下请求的参数,如图: 请求方式:get请求请求参数:wd明显是要搜索的关键字:cb是请

标签-仿百度搜索框只能提示上下键移动的功能效果 js+jquery

问题描述 仿百度搜索框只能提示上下键移动的功能效果 js+jquery 搜索结果不能上下移动,只能按一下,按第二下的时候结果只剩下一个了,currentSelIndex总是为0 ,currentSelIndex是记录 标签id的变量. 首先,我输入一个字符,匹配到的结果会在文本框下方显示出来.因为代码都是写在搜索框的onkeyup ()事件中的,每按一下键盘都会触发该事件,当我第一次按(下)键的时候,相应的会把选中的文本赋 给搜索框,所以按第二次的时候又会重新触发该事件,搜索条件变成了第一次按(

Javascript实现类似google搜索框输入提示功能

本文主要内容:p居中.层定位.类google输入提示示例,在线qq查询,自动刷新 类似google搜索框输入提示功能的示例代码,采用层定位,居中对齐,input 的输入改变.失去焦点.获得焦点事件......解决了onblur和onclick同时被调用的失效问题.

asp.net使用jquery实现搜索框默认提示功能

 这篇文章主要介绍了asp.net使用jquery实现搜索框默认提示功能,大家参考使用吧 文本框中创建默认文本提示   通常用户在搜索内容时,在文本框输入内容前,文本框都会给出默认提示,提示用户输入正确的内容进行搜索.   当文本框获得焦点,如果文本框内容跟提示内容一样,提示内容会自然消失.   当文本框没有任何值并失去焦点,文本框内容会重新生成默认提示.   为了实现上面的需求,代码如下:   代码如下: <%@ Page Language="C#" AutoEventWire