• 基于vue的多引擎搜索及关键字提示


    关键代码:

    <div class="header-search">
                <form id="form" action="http://m.baidu.com/s" method="get" accept-charset="utf-8" class="clearfix" autocomplete="off">
                    <a>
                        <span class="search-media"></span>
                    </a>
                    <input id="searchData" type="text" placeholder="搜索一下" name="word" @keyup="listenWords" @input="listenInput" @focus="listenInput" />
                    <span class="del">×</span>
                    <a @click="gotoSearch">
                        <span class="icon-search icon-sign"></span>
                    </a>
                </form>
            </div>
            <div id="pagesZone" class="clearfix">
                <div id="auto"></div>
                <span class="engi">快速搜索:</span>
                <img src="../../dist/images/google.png" alt="谷歌" id="googlePages" @click="gotoGoogle" >
                <img src="../../dist/images/bing.png" alt="必应" id="bing" @click="gotoBing" >
                <img src="../../dist/images/zhihu.png" alt="知乎" id="zhihu" @click="gotoZhiHu" >
                <img src="../../dist/images/sogou.png" alt="搜狗" id="sogo" @click="gotoSogou" >
                <img src="../../dist/images/jd.png" alt="京东" id="jd" @click="gotoJD" >
                <a @click="close" class="close">关闭</a>
            </div>
    fillUrls: function() {
                    var that = this;
                    var strdomin = document.getElementById("searchData").value;
                    window.status = "请求中";
                    this.$http.jsonp("http://suggestion.baidu.com/su", {    //请求参数
                        params: {
                          wd: strdomin
                        },
                        jsonp: 'cb'
                    }).then(function(res){
                        window.status = "请求结束";
                        that.autoDisplay(JSON.parse(res.body).s);
                    },function(){
                        console.log("error");
                    });
                },
    
                autoDisplay: function(autoStr) {
                    var searchText = document.getElementById('searchData');
                    var autoNode = document.getElementById('auto');  //缓存对象(弹出框)
                    var that = this;
                    var docWidth = document.body.clientWidth || document.documentElement.clientWidth;
                    var pagesZone = document.getElementById('pagesZone');
                    if (autoStr.length == 0) {
                        console.log("false");
                        autoNode.style.display = "none";
                        return false;
                    }
                    autoNode.innerHTML = "";
                    for (var i = 0; i < autoStr.length; i++) {
                        //创建节点
                        var wordNode = autoStr[i].replace(searchText.value,"<b>"+searchText.value+"</b>");
                        var newDivNode = document.createElement('div');
                        newDivNode.setAttribute("id",i);
                        autoNode.appendChild(newDivNode);
                        var wordSpanNode = document.createElement('span');
                        wordSpanNode.setAttribute('class','suggText');
                        wordSpanNode.innerHTML = wordNode;
                        newDivNode.appendChild(wordSpanNode);
                        var addNode = document.createElement('span');
                        addNode.setAttribute('class','addText');
                        addNode.innerHTML = '+';
                        newDivNode.appendChild(addNode);
                        //鼠标点击文字上屏并搜索
                        wordSpanNode.onclick = function () {
                            this.highlightindex = this.parentNode.getAttribute('id');
                            var comText = autoNode.childNodes[this.highlightindex].firstChild.innerText;
                            autoNode.style.display = "none";
                            this.highlightindex = -1;
                            searchText.value = comText;
                            pagesZone.style.display = "none";
                            that.gotoSearch();
                        };
                        //鼠标点击文字上屏
                        addNode.onclick = function () {
                            this.highlightindex = this.parentNode.getAttribute('id');
                            var comText = autoNode.childNodes[this.highlightindex].firstChild.innerText;
                            autoNode.style.display = "none";
                            this.highlightindex = -1;
                            searchText.value = comText;
                        };
                        //展示
                        if (autoStr.length > 0) {
                            autoNode.style.display = "block";
                        } else {
                            autoNode.style.display = "none";
                            this.highlightindex = -1;
                        }
                        //针对手机竖屏时的显示条数控制
                        if (docWidth < 500 && i > 3) {
                            break;
                        }
                    }
                },
    
                close: function() {
                    document.getElementById('pagesZone').style.display = 'none';
                },
    
                listenWords: function(event) {
                    console.log("listen keyup");
                    var that = this;
                    var searchInput = document.getElementById("searchData");
                    event = window.event || event;
                    if (event.keyCode == 13) {     // enter
                        event.preventDefault();
                        that.gotoSearch();
                    }
                    if (event.keyCode == 8) {     // backspace
                        console.log(searchInput.value.length);
                        if(searchInput.value.length == 0){
                            searchInput.blur();
                            searchInput.focus();
                        }
                    }
                },
    
                listenInput: function() {
                    var that = this;
                    var searchInput = document.getElementById("searchData");
                    var auto = document.getElementById('auto');
                    var pagesZone = document.getElementById('pagesZone');
                    var del = document.getElementsByClassName('del')[0];
                    if (searchInput.value == null || searchInput.value == "") {
                        auto.innerHTML = "";
                        pagesZone.style.display = "none";
                        del.style.display = "none";
                        auto.style.display = "none";
                        return;
                    }
                    pagesZone.style.display = "block";
                    del.style.display = "block";
                    that.fillUrls();
                    if (this.highlightindex != -1) {
                        this.highlightindex = -1;
                    }
                },

    多引擎搜索很简单,匹配对应参数就好:

    window.location.href = "https://m.zhihu.com/search?q=" + document.getElementById("searchData").value;

    百度:https://m.baidu.com/s?word=

    谷歌:https://www.google.com/search?q=

    必应:https://cn.bing.com/search?q=

    知乎:https://m.zhihu.com/search?q=

    搜狗:http://wap.sogou.com/web/searchList.jsp?keyword=

    京东:http://so.m.jd.com/ware/search.action?keyword=

    关键字提示,先通过jsonp请求参数:

    
    
    var strdomin = document.getElementById("searchData").value;
                    window.status = "请求中";
                    this.$http.jsonp("http://suggestion.baidu.com/su", {    //请求参数
                        params: {
                          wd: strdomin
                        },
                        jsonp: 'cb'
                    }).then(function(res){
                        window.status = "请求结束";
                        that.autoDisplay(JSON.parse(res.body).s);
                    },function(){
                        console.log("error");
                    });

    输入框中有文字的时候触发。

    其中JSON.parse用于从一个字符串中解析出json对象。s是suggest words。这里传到autoDisplay的参数即关键字提示。

    另外将input元素的autocomplete属性设置为off可以关闭自动提示:

    <input type="text" name="name" autocomplete="off">

    如果所有表单元素都不想使用自动提示功能,只需在表单form上设置autocomplete=off。

    最后将获取到的关键字提示放到input下面的节点中即可。

    注意,

    <input id="searchData" type="text" placeholder="搜索一下" name="word" @keyup="listenWords" @input="listenInput" @focus="listenInput" />

    这里因兼容问题绑定了3个事件,其中listenWords专门针对手机键盘的回车键和回退键:

    listenWords: function(event) {
                    console.log("listen keyup");
                    var that = this;
                    var searchInput = document.getElementById("searchData");
                    event = window.event || event;
                    if (event.keyCode == 13) {     // enter
                        event.preventDefault();
                        that.gotoSearch();
                    }
                    if (event.keyCode == 8) {     // backspace
                        console.log(searchInput.value.length);
                        if(searchInput.value.length == 0){
                            searchInput.blur();
                            searchInput.focus();
                        }
                    }
                },

    如有更好的方式欢迎讨论。

  • 相关阅读:
    log4j2配置详解
    【数据库性能相关知识汇总】
    【Java并发知识点汇总】
    Spring实践系列-入门篇(一)
    分布式实践之概念解析
    平时工作需要注意总结面试中必然会问到的问题
    DataX支持mysql8.X
    springboot集成shiro
    ELK 6.2.4搭建
    DataX-MysqlWriter 插件文档
  • 原文地址:https://www.cnblogs.com/xulei1992/p/6526417.html
Copyright © 2020-2023  润新知