利用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 相关文章推荐
在IE下:float属性会影响offsetTop的取值
Dec 22 Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
Mar 03 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
Sep 30 Javascript
JavaScript中的字符串操作详解
Nov 12 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
May 11 Javascript
JavaScript中Cookies的相关使用教程
Jun 04 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
Jun 02 Javascript
老生常谈Javascript中的原型和this指针
Oct 09 Javascript
Vue2.0如何发布项目实战
Jul 27 Javascript
解决ie img标签内存泄漏的问题
Oct 13 Javascript
layui点击按钮页面会自动刷新的解决方案
Oct 25 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
Apr 26 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
虹吸式咖啡探讨–研磨
2021/03/03 冲泡冲煮
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
Laravel中GraphQL接口请求频率实战记录
2020/09/01 PHP
javascript数组去掉重复
2011/05/12 Javascript
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
js时间比较示例分享(日期比较)
2014/03/05 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
JS显示下拉列表框内全部元素的方法
2015/03/31 Javascript
bootstrap读书笔记之CSS组件(上)
2016/10/17 Javascript
JavaScript 完成注册页面表单校验的实例
2017/08/19 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
JS字符串与二进制的相互转化实例代码详解
2019/06/28 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
python获取图片颜色信息的方法
2015/03/18 Python
Python验证码识别处理实例
2015/12/28 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
2018/05/25 Python
python控制nao机器人身体动作实例详解
2019/04/29 Python
详解Python3序列赋值、序列解包
2019/05/14 Python
button在IE6/7下的黑边去除方案
2012/12/24 HTML / CSS
英国Amara家居法国网站:家居装饰,现代装饰和豪华礼品
2016/12/15 全球购物
美国农场鲜花速递:The Bouqs
2018/07/13 全球购物
缓解脚、腿和背部疼痛:Z-CoiL鞋
2019/03/12 全球购物
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
两只小狮子教学反思
2014/02/05 职场文书
初级会计求职信范文
2014/02/15 职场文书
出生公证委托书
2014/04/03 职场文书
大学生优秀班干部事迹材料
2014/05/26 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
合作意向书怎么写
2019/06/24 职场文书