关键代码:

  1. <div class="header-search">
  2. <form id="form" action="http://m.baidu.com/s" method="get" accept-charset="utf-8" class="clearfix" autocomplete="off">
  3. <a>
  4. <span class="search-media"></span>
  5. </a>
  6. <input id="searchData" type="text" placeholder="搜索一下" name="word" @keyup="listenWords" @input="listenInput" @focus="listenInput" />
  7. <span class="del">×</span>
  8. <a @click="gotoSearch">
  9. <span class="icon-search icon-sign"></span>
  10. </a>
  11. </form>
  12. </div>
  13. <div id="pagesZone" class="clearfix">
  14. <div id="auto"></div>
  15. <span class="engi">快速搜索:</span>
  16. <img src="../../dist/images/google.png" alt="谷歌" id="googlePages" @click="gotoGoogle" >
  17. <img src="../../dist/images/bing.png" alt="必应" id="bing" @click="gotoBing" >
  18. <img src="../../dist/images/zhihu.png" alt="知乎" id="zhihu" @click="gotoZhiHu" >
  19. <img src="../../dist/images/sogou.png" alt="搜狗" id="sogo" @click="gotoSogou" >
  20. <img src="../../dist/images/jd.png" alt="京东" id="jd" @click="gotoJD" >
  21. <a @click="close" class="close">关闭</a>
  22. </div>
  1. fillUrls: function() {
  2. var that = this;
  3. var strdomin = document.getElementById("searchData").value;
  4. window.status = "请求中";
  5. this.$http.jsonp("http://suggestion.baidu.com/su", { //请求参数
  6. params: {
  7. wd: strdomin
  8. },
  9. jsonp: 'cb'
  10. }).then(function(res){
  11. window.status = "请求结束";
  12. that.autoDisplay(JSON.parse(res.body).s);
  13. },function(){
  14. console.log("error");
  15. });
  16. },
  17.  
  18. autoDisplay: function(autoStr) {
  19. var searchText = document.getElementById('searchData');
  20. var autoNode = document.getElementById('auto'); //缓存对象(弹出框)
  21. var that = this;
  22. var docWidth = document.body.clientWidth || document.documentElement.clientWidth;
  23. var pagesZone = document.getElementById('pagesZone');
  24. if (autoStr.length == 0) {
  25. console.log("false");
  26. autoNode.style.display = "none";
  27. return false;
  28. }
  29. autoNode.innerHTML = "";
  30. for (var i = 0; i < autoStr.length; i++) {
  31. //创建节点
  32. var wordNode = autoStr[i].replace(searchText.value,"<b>"+searchText.value+"</b>");
  33. var newDivNode = document.createElement('div');
  34. newDivNode.setAttribute("id",i);
  35. autoNode.appendChild(newDivNode);
  36. var wordSpanNode = document.createElement('span');
  37. wordSpanNode.setAttribute('class','suggText');
  38. wordSpanNode.innerHTML = wordNode;
  39. newDivNode.appendChild(wordSpanNode);
  40. var addNode = document.createElement('span');
  41. addNode.setAttribute('class','addText');
  42. addNode.innerHTML = '+';
  43. newDivNode.appendChild(addNode);
  44. //鼠标点击文字上屏并搜索
  45. wordSpanNode.onclick = function () {
  46. this.highlightindex = this.parentNode.getAttribute('id');
  47. var comText = autoNode.childNodes[this.highlightindex].firstChild.innerText;
  48. autoNode.style.display = "none";
  49. this.highlightindex = -1;
  50. searchText.value = comText;
  51. pagesZone.style.display = "none";
  52. that.gotoSearch();
  53. };
  54. //鼠标点击文字上屏
  55. addNode.onclick = function () {
  56. this.highlightindex = this.parentNode.getAttribute('id');
  57. var comText = autoNode.childNodes[this.highlightindex].firstChild.innerText;
  58. autoNode.style.display = "none";
  59. this.highlightindex = -1;
  60. searchText.value = comText;
  61. };
  62. //展示
  63. if (autoStr.length > 0) {
  64. autoNode.style.display = "block";
  65. } else {
  66. autoNode.style.display = "none";
  67. this.highlightindex = -1;
  68. }
  69. //针对手机竖屏时的显示条数控制
  70. if (docWidth < 500 && i > 3) {
  71. break;
  72. }
  73. }
  74. },
  75.  
  76. close: function() {
  77. document.getElementById('pagesZone').style.display = 'none';
  78. },
  79.  
  80. listenWords: function(event) {
  81. console.log("listen keyup");
  82. var that = this;
  83. var searchInput = document.getElementById("searchData");
  84. event = window.event || event;
  85. if (event.keyCode == 13) { // enter
  86. event.preventDefault();
  87. that.gotoSearch();
  88. }
  89. if (event.keyCode == 8) { // backspace
  90. console.log(searchInput.value.length);
  91. if(searchInput.value.length == 0){
  92. searchInput.blur();
  93. searchInput.focus();
  94. }
  95. }
  96. },
  97.  
  98. listenInput: function() {
  99. var that = this;
  100. var searchInput = document.getElementById("searchData");
  101. var auto = document.getElementById('auto');
  102. var pagesZone = document.getElementById('pagesZone');
  103. var del = document.getElementsByClassName('del')[0];
  104. if (searchInput.value == null || searchInput.value == "") {
  105. auto.innerHTML = "";
  106. pagesZone.style.display = "none";
  107. del.style.display = "none";
  108. auto.style.display = "none";
  109. return;
  110. }
  111. pagesZone.style.display = "block";
  112. del.style.display = "block";
  113. that.fillUrls();
  114. if (this.highlightindex != -1) {
  115. this.highlightindex = -1;
  116. }
  117. },

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

  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请求参数:

  1.  
  1. var strdomin = document.getElementById("searchData").value;
  2. window.status = "请求中";
  3. this.$http.jsonp("http://suggestion.baidu.com/su", { //请求参数
  4. params: {
  5. wd: strdomin
  6. },
  7. jsonp: 'cb'
  8. }).then(function(res){
  9. window.status = "请求结束";
  10. that.autoDisplay(JSON.parse(res.body).s);
  11. },function(){
  12. console.log("error");
  13. });

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

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

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

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

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

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

注意,

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

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

  1. listenWords: function(event) {
  2. console.log("listen keyup");
  3. var that = this;
  4. var searchInput = document.getElementById("searchData");
  5. event = window.event || event;
  6. if (event.keyCode == 13) { // enter
  7. event.preventDefault();
  8. that.gotoSearch();
  9. }
  10. if (event.keyCode == 8) { // backspace
  11. console.log(searchInput.value.length);
  12. if(searchInput.value.length == 0){
  13. searchInput.blur();
  14. searchInput.focus();
  15. }
  16. }
  17. },

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

基于vue的多引擎搜索及关键字提示的更多相关文章

  1. 基于Vue实现关键词实时搜索高亮显示关键词

    最近在做移动real-time-search于实时搜索和关键词高亮显示的功能,通过博客的方式总结一下,同时希望能够帮助到别人~~~ 如果不喜欢看文字的朋友我写了一个demo方便已经上传到了github ...

  2. Springboot+Vue实现仿百度搜索自动提示框匹配查询功能

    案例功能效果图 前端初始页面 输入搜索信息页面 点击查询结果页面 环境介绍 前端:vue 后端:springboot jdk:1.8及以上 数据库:mysql 核心代码介绍 TypeCtrler .j ...

  3. 基于Vue的npm组件库

    前言(*❦ω❦) 思维导图可能有点高糊,有点太大了,项目和导图文件放到github或giteee上,这个思维导图也是我文章的架构,思维导图是用FeHelper插件生成的,这个是一款开源chrome插件 ...

  4. 在微信框架模块中,基于Vue&Element前端的微信公众号和企业微信的用户绑定

    在一个和微信相关的业务管理系统,我们有时候需要和用户的微信账号信息进行绑定,如对公众号.企业微信等账号绑定特定的系统用户,可以进行扫码登录.微信信息发送等操作,用户的绑定主要就是记录公众号用户的ope ...

  5. Lucene5.5.4入门以及基于Lucene实现博客搜索功能

    前言 一直以来个人博客的搜索功能很蹩脚,只是自己简单用数据库的like %keyword%来实现的,所以导致经常搜不到想要找的内容,而且高亮显示.摘要截取等也不好实现,所以决定采用Lucene改写博客 ...

  6. VBox 一款基于vue开发的音乐盒 序章

    己基于vue写了一个 Mplayer, github地址:https://github.com/xiangwenhu/MPlaer, 演示地址:http://babydairy2017.cloudap ...

  7. Lucene:基于Java的全文检索引擎简介

    Lucene:基于Java的全文检索引擎简介 Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全文索引应用,而是是一个用J ...

  8. 基于vue.js的简单用户管理

    功能描述:添加.修改.搜索过滤 效果图: <!DOCTYPE html> <html lang="en"> <head> <title&g ...

  9. 基于VUE框架 与 其他框架间的基本对比

    基于VUE框架的基本描述 与 其他框架间的基本对比 2018-11-03  11:01:14 A B React React 和 Vue 有许多相似之处,它们都有: 使用 Virtual DOM 提供 ...

随机推荐

  1. MongoDB复制集环境搭建

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://suifu.blog.51cto.com/9167728/1853478 环境介绍 ...

  2. Spring classPath:用法

    http://blog.csdn.net/xing_sky/article/details/8228305 参考文章地址: http://hi.baidu.com/huahua035/item/ac8 ...

  3. WPF DataPager控件

    最近在项目中遇到远程加载数据的问题,由于服务器采用分页方式返回数据,因此客户端也相应的制作了一个分页控件.代码相对简单,算做入门级的源码. 效果如图: 初步分析,分页功能只需要3个核心变量:PageI ...

  4. js冒泡排序及计算其运行时间

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. es6笔记5^_^set、map、iterator

    一.set 1.基本用法 数据结构Set类似于数组,但是成员的值都是唯一的,没有重复的值. let s = new Set(); [2,3,5,4,5,2,2].map(x => s.add(x ...

  6. POJ2115(扩展欧几里得)

    C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23700   Accepted: 6550 Descr ...

  7. quagga源码学习--BGP协议对等体连接tcp md5签名认证选项

    bgp使用tcp连接,每个bgp实例自身是peer的一个tcp server端,同时也是peer的tcp client端. 1.在bgp_create之后都建立自己的socket服务端开始监听179端 ...

  8. jq-实战之表格筛选

    css部分 .select{background: #ccc} html部分 table width="> <thead> <th>姓名</th> ...

  9. C++源码的调用图生成

    前言 之前受知乎用户mailto1587启发,写了个C++源码的调用图生成器,可以以图示法显示C++函数的调用关系, 代码放在了github仓库里,仅供参考: CodeSnippet/python/S ...

  10. PL/SQL基本概念

    首先明确PL/SQL主要作用作用: SQL语言适合管理关系型数据库但是它无法满足更复杂的数据处理,所以产生PLSQL.PLSQL用户创建存储过程.函数.触发器.包及用户自定义的函数. 特点: PLSQ ...