Vue 百度搜索

使用Vue和JSONP获取百度的搜索结果

任务:
1. 输入结果,立刻返回百度搜索结果,并展示
2. 键盘上下键可以选中结果列表,增加样式
3. 选中后按回车,跳转到百度搜索页面

效果图:
这里写图片描述

html:

<div id="app">
    <input class="search" type="text" value="按钮" v-model="search" @keyup="get($event)" @keydown.down="changeDown()" @keydown.up.prevent="changeUp()">
    <ul class="item-wrap">
        <li v-for="(value, $index) in myData" :class="{gray:$index == now}">
            {{value}}
        </li>
    </ul>
    <p class="msg" v-show="myData.length == 0">暂无数据...</p>
</div>

数据结构为:

data:{
    myData: [],
    search: '',
    now: -1
}

1. 搜索

v-model="search" 数据双向绑定和@keyup="get($event)"键盘事件,使搜索立即响应
以下为get函数:
jsonp使用的是vue-resource的$http.jsonp

get:function (e) {
    this.$http.jsonp('https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su',{
        params:{
            wd: this.search // 传入的参数
        },
        jsonp:'cb' // callback
    }).then(function (res) { // 成功
        this.myData = res.data.s;
    },function (res) { // 错误
        console.log(res);
    });
}

百度路径如下
百度搜索:https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=vue&cb=show
返回的结果为:
show({q:"vue",p:false,s:["vue.js","vue.js 教程","vue.js 视频教程","vuex","vue-router","vue cli","vue computed","vue ui","vue2","vue watch"]});
可以使用res.data.s获取数组里的数据。

2. 键盘控制:

2.1结果列表的样式改变
<li v-for="(value, $index) in myData" :class="{gray:$index == now}">
    {{value}}
</li>

当键盘上下键事件改变变量now,与下标相等时,添加grayclass,达到改变样式的目的

2.2上下键事件

@keydown.down="changeDown()" @keydown.up.prevent="changeUp()"
使用键盘事件的简写@和.down、.up,还有阻止默认事件.prevent

changeDown:function () {
    this.now ++;
    if (this.now == this.myData.length) {
        this.now = -1;
    }
    this.search = this.myData[this.now];
},
changeUp:function () {
    this.now --;
    if (this.now == -2) {
        this.now = this.myData.length-1;
    }
    this.search = this.myData[this.now];
}

上下键绑定了input输入框的数据

3. 回车搜索

get函数中增加键盘事件
取消了上下键事件,否则上下键事件使之重复搜索
当点击回车时,打开新窗口,显式搜索结果页面

if (e.keyCode == 38 || e.keyCode == 40) {
   return;
}
if (e.keyCode == 13) {
   window.open('https://www.baidu.com/s?wd=' + this.search);
   this.search = '';
}

完整js代码:

 window.onload = function () {
    var app = new Vue({
        el: '#app',
        data:{
            myData: [],
            search: '',
            now: -1
        },
        methods:{
            get:function (e) {
                if (e.keyCode == 38 || e.keyCode == 40) {
                    return;
                }
                if (e.keyCode == 13) {
                    window.open('https://www.baidu.com/s?wd=' + this.search);
                    this.search = '';
                }
                this.$http.jsonp('https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su',{
                    params:{
                        wd: this.search
                    },
                    jsonp:'cb'
                }).then(function (res) { // 成功
                    this.myData = res.data.s;
                },function (res) { // 错误
                    console.log(res);
                });
            },
            changeDown:function () {
                this.now ++;
                if (this.now == this.myData.length) {
                    this.now = -1;
                }
                this.search = this.myData[this.now];
            },
            changeUp:function () {
                this.now --;
                if (this.now == -2) {
                    this.now = this.myData.length-1;
                }
                this.search = this.myData[this.now];
            }
        }
    });
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值