利用JQuery为搜索栏增加tag提示


Posted in Javascript onJune 22, 2009

很简单的一个功能,就是当用户在搜索栏输入搜索字符时候,利用JQuery的功能把一些预设好的关键字浮现出来,除了让用户意外一下,还有就是让用户简化输入。比如象下图的样子:

利用JQuery为搜索栏增加tag提示

实现的方法很简单,首先是要在你的网站上加载JQuery,然后再加载下面的JS文件,下载之

(function($){var globalTags=[];window.setGlobalTags=function(tags){globalTags=getTags(tags);};function getTags(tags){var tag,i,goodTags=[];for(i=0;i<tags.length;i++){tag=tags[i];if(typeof tags[i]=='object'){tag=tags[i].tag;} 
goodTags.push(tag.toLowerCase());} 
return goodTags;} 
$.fn.tagSuggest=function(options){var defaults={'matchClass':'tagMatches','tagContainer':'span','tagWrap':'span','sort':true,'tags':null,'url':null,'delay':0,'separator':' '};var i,tag,userTags=[],settings=$.extend({},defaults,options);if(settings.tags){userTags=getTags(settings.tags);}else{userTags=globalTags;} 
return this.each(function(){var tagsElm=$(this);var elm=this;var matches,fromTab=false;var suggestionsShow=false;var workingTags=[];var currentTag={"position":0,tag:""};var tagMatches=document.createElement(settings.tagContainer);function showSuggestionsDelayed(el,key){if(settings.delay){if(elm.timer)clearTimeout(elm.timer);elm.timer=setTimeout(function(){showSuggestions(el,key);},settings.delay);}else{showSuggestions(el,key);}} 
function showSuggestions(el,key){workingTags=el.value.split(settings.separator);matches=[];var i,html='',chosenTags={},tagSelected=false;currentTag={position:currentTags.length-1,tag:''};for(i=0;i<currentTags.length&&i<workingTags.length;i++){if(!tagSelected&¤tTags[i].toLowerCase()!=workingTags[i].toLowerCase()){currentTag={position:i,tag:workingTags[i].toLowerCase()};tagSelected=true;} 
chosenTags[currentTags[i].toLowerCase()]=true;} 
if(currentTag.tag){if(settings.url){$.ajax({'url':settings.url,'dataType':'json','data':{'tag':currentTag.tag},'async':false,'success':function(m){matches=m;}});}else{for(i=0;i<userTags.length;i++){if(userTags[i].indexOf(currentTag.tag)===0){matches.push(userTags[i]);}}} 
matches=$.grep(matches,function(v,i){return!chosenTags[v.toLowerCase()];});if(settings.sort){matches=matches.sort();} 
for(i=0;i<matches.length;i++){html+='<'+settings.tagWrap+' class="_tag_suggestion">'+matches[i]+'</'+settings.tagWrap+'>';} 
tagMatches.html(html);suggestionsShow=!!(matches.length);}else{hideSuggestions();}} 
function hideSuggestions(){tagMatches.empty();matches=[];suggestionsShow=false;} 
function setSelection(){var v=tagsElm.val();if(v==tagsElm.attr('title')&&tagsElm.is('.hint'))v='';currentTags=v.split(settings.separator);hideSuggestions();} 
function chooseTag(tag){var i,index;for(i=0;i<currentTags.length;i++){if(currentTags[i].toLowerCase()!=workingTags[i].toLowerCase()){index=i;break;}} 
if(index==workingTags.length-1)tag=tag+settings.separator;workingTags[i]=tag;tagsElm.val(workingTags.join(settings.separator));tagsElm.blur().focus();setSelection();} 
function handleKeys(ev){fromTab=false;var type=ev.type;var resetSelection=false;switch(ev.keyCode){case 37:case 38:case 39:case 40:{hideSuggestions();return true;} 
case 224:case 17:case 16:case 18:{return true;} 
case 8:{if(this.value==''){hideSuggestions();setSelection();return true;}else{type='keyup';resetSelection=true;showSuggestionsDelayed(this);} 
break;} 
case 9:case 13:{if(suggestionsShow){chooseTag(matches[0]);fromTab=true;return false;}else{return true;}} 
case 27:{hideSuggestions();setSelection();return true;} 
case 32:{setSelection();return true;}} 
if(type=='keyup'){switch(ev.charCode){case 9:case 13:{return true;}} 
if(resetSelection){setSelection();} 
showSuggestionsDelayed(this,ev.charCode);}} 
tagsElm.after(tagMatches).keypress(handleKeys).keyup(handleKeys).blur(function(){if(fromTab==true||suggestionsShow){fromTab=false;tagsElm.focus();}});tagMatches=$(tagMatches).click(function(ev){if(ev.target.nodeName==settings.tagWrap.toUpperCase()&&$(ev.target).is('._tag_suggestion')){chooseTag(ev.target.innerHTML);}}).addClass(settings.matchClass);setSelection();});};})(jQuery);

接着就是编辑你自己的关键字。这里的做法是你自己自行编辑,还有很多方法是直接查询WordPress的数据库的。但那样做就显得很专业的样子。对于我自己来说,本来站内的搜索功能就不是很受用,为了那没多被使用过几次的搜索而复杂这个提示功能显然不值,所以还是自己来编辑一些重要的关键字好了。下面的代码也要整合到网站的JS文件中:
<script type="text/javascript"> 
$(document).ready(function() { 
$('#tags').tagSuggest({ 
tags: ["WordPress","WordPress 主题","WordPress 插件","生活","巴黎","设计","法国","照片","朋友","技巧","下载","JQuery","JQuery 教程","JQuery 例子","twitter","Google","seo","firefox","firefox 扩展","css","ajax","theme","theme 教程","theme 技巧","Js-O3","Js-Paper","blackberry","blackberry 8900"] 
}); 
}); 
</script>

能看出上面的关键字编辑了吧。
然后最后一步就是需要指定相应的搜索栏,如上面代码中的"#tags"就是决定这个东西。修改搜索栏的ID,让其适应则可。也就是说为搜索栏的input内添加一个id="tags"则可。或者你也可以修改上面的代码内的ID,让其适应你原有的搜索栏内input的ID。
当然还有对关键字的样式设定,这个就随大家爱好了,我这里不列出。
tag.js 打包下载
Javascript 相关文章推荐
经常用的图片在容器中的水平垂直居中实例
Jun 10 Javascript
Javascript实现页面跳转的几种方式分享
Oct 26 Javascript
js脚本获取webform服务器控件的方法
May 16 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
Dec 18 Javascript
js中利用cookie实现记住密码功能
Aug 20 Javascript
ES6中Class类的静态方法实例小结
Oct 28 Javascript
vue+iview写个弹框的示例代码
Dec 05 Javascript
微信小程序上传图片功能(附后端代码)
Jun 19 Javascript
微信小程序模板template简单用法示例
Dec 04 Javascript
js实现小球在页面规定的区域运动
Jun 16 Javascript
微信小程序换肤功能实现代码(思路详解)
Aug 25 Javascript
javascript实现左右缓动动画函数
Nov 25 Javascript
web 页面分页打印的实现
Jun 22 #Javascript
利用WebBrowser彻底解决Web打印问题(包括后台打印)
Jun 22 #Javascript
实现超用户体验 table排序javascript实现代码
Jun 22 #Javascript
js 单引号 传递方法
Jun 22 #Javascript
使弱类型的语言JavaScript变强势
Jun 22 #Javascript
Javascript 代码也可以变得优美的实现方法
Jun 22 #Javascript
PNG背景在不同浏览器下的应用
Jun 22 #Javascript
You might like
PHP session常见问题集锦及解决办法总结
2007/03/18 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
PHP模板解析类实例
2015/07/09 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
js window.event对象详尽解析
2009/02/17 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
JQuery最佳实践之精妙的自定义事件
2010/08/11 Javascript
js修改原型的属性使用介绍
2014/01/26 Javascript
node+express+jade制作简单网站指南
2014/11/26 Javascript
Javascript的闭包详解
2014/12/26 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
HTML Table 空白单元格补全的简单实现
2016/10/13 Javascript
WEB前端实现裁剪上传图片功能
2016/10/17 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
seajs下require书写约定实例分析
2018/05/16 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
js实现前面自动补全位数的方法
2018/10/10 Javascript
js中调用微信的扫描二维码功能的实现代码
2020/04/11 Javascript
vue 使用原生组件上传图片的实例
2020/09/08 Javascript
在antd Table中插入可编辑的单元格实例
2020/10/28 Javascript
python 从远程服务器下载日志文件的程序
2013/02/10 Python
浅谈flask源码之请求过程
2018/07/26 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
基于python 微信小程序之获取已存在模板消息列表
2019/08/05 Python
Python List列表对象内置方法实例详解
2019/10/22 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
Python基础之函数基本用法与进阶详解
2020/01/02 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
奥地利手表、香水、化妆品和珠宝购物网站:Brasty.at
2021/01/17 全球购物
J2EE相关知识面试题
2013/08/26 面试题
药学专业毕业生求职信
2013/10/20 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
法院执行局工作总结
2015/08/11 职场文书
交互式可视化js库gojs使用介绍及技巧
2022/02/18 Javascript