`

input输入框实现联想功能

 
阅读更多

参考网址http://www.jb51.net/article/28075.htm

 

自动完成功能是指:类似百度搜索之类的输入一个词的一部分后就自动提示,然后用户可以选择,不需要再输入剩余部分。

  实现这个功能需要服务端配合。客户端通过脚本来展示从服务端取得的数据。

  先看客户端的HTML:

复制代码代码如下:
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>搜索词自动完成</title> 
<style type="text/css"> 
#search{ 
text-align: center; 
position:relative; 

.autocomplete{ 
border: 1px solid #9ACCFB; 
background-color: white; 
text-align: left; 

.autocomplete li{ 
list-style-type: none; 

.clickable { 
cursor: default; 

.highlight { 
background-color: #9ACCFB; 

</style> 
<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript"> 
$(function(){ 
//取得div层 
var $search = $('#search'); 
//取得输入框JQuery对象 
var $searchInput = $search.find('#search-text'); 
//关闭浏览器提供给输入框的自动完成 
$searchInput.attr('autocomplete','off'); 
//创建自动完成的下拉列表,用于显示服务器返回的数据,插入在搜索按钮的后面,等显示的时候再调整位置 
var $autocomplete = $('<div class="autocomplete"></div>') 
.hide() 
.insertAfter('#submit'); 
//清空下拉列表的内容并且隐藏下拉列表区 
var clear = function(){ 
$autocomplete.empty().hide(); 
}; 
//注册事件,当输入框失去焦点的时候清空下拉列表并隐藏 
$searchInput.blur(function(){ 
setTimeout(clear,500); 
}); 
//下拉列表中高亮的项目的索引,当显示下拉列表项的时候,移动鼠标或者键盘的上下键就会移动高亮的项目,想百度搜索那样 
var selectedItem = null; 
//timeout的ID 
var timeoutid = null; 
//设置下拉项的高亮背景 
var setSelectedItem = function(item){ 
//更新索引变量 
selectedItem = item ; 
//按上下键是循环显示的,小于0就置成最大的值,大于最大值就置成0 
if(selectedItem < 0){ 
selectedItem = $autocomplete.find('li').length - 1; 

else if(selectedItem > $autocomplete.find('li').length-1 ) { 
selectedItem = 0; 

//首先移除其他列表项的高亮背景,然后再高亮当前索引的背景 
$autocomplete.find('li').removeClass('highlight') 
.eq(selectedItem).addClass('highlight'); 
}; 
var ajax_request = function(){ 
//ajax服务端通信 
$.ajax({ 
'url':'/test/index.jsp', //服务器的地址 
'data':{'search-text':$searchInput.val()}, //参数 
'dataType':'json', //返回数据类型 
'type':'POST', //请求类型 
'success':function(data){ 
if(data.length) { 
//遍历data,添加到自动完成区 
$.each(data, function(index,term) { 
//创建li标签,添加到下拉列表中 
$('<li></li>').text(term).appendTo($autocomplete) 
.addClass('clickable') 
.hover(function(){ 
//下拉列表每一项的事件,鼠标移进去的操作 
$(this).siblings().removeClass('highlight'); 
$(this).addClass('highlight'); 
selectedItem = index; 
},function(){ 
//下拉列表每一项的事件,鼠标离开的操作 
$(this).removeClass('highlight'); 
//当鼠标离开时索引置-1,当作标记 
selectedItem = -1; 
}) 
.click(function(){ 
//鼠标单击下拉列表的这一项的话,就将这一项的值添加到输入框中 
$searchInput.val(term); 
//清空并隐藏下拉列表 
$autocomplete.empty().hide(); 
}); 
});//事件注册完毕 
//设置下拉列表的位置,然后显示下拉列表 
var ypos = $searchInput.position().top; 
var xpos = $searchInput.position().left; 
$autocomplete.css('width',$searchInput.css('width')); 
$autocomplete.css({'position':'relative','left':xpos + "px",'top':ypos +"px"}); 
setSelectedItem(0); 
//显示下拉列表 
$autocomplete.show(); 


}); 
}; 
//对输入框进行事件注册 
$searchInput 
.keyup(function(event) { 
//字母数字,退格,空格 
if(event.keyCode > 40 || event.keyCode == 8 || event.keyCode ==32) { 
//首先删除下拉列表中的信息 
$autocomplete.empty().hide(); 
clearTimeout(timeoutid); 
timeoutid = setTimeout(ajax_request,100); 

else if(event.keyCode == 38){ 
//上 
//selectedItem = -1 代表鼠标离开 
if(selectedItem == -1){ 
setSelectedItem($autocomplete.find('li').length-1); 

else { 
//索引减1 
setSelectedItem(selectedItem - 1); 

event.preventDefault(); 

else if(event.keyCode == 40) { 
//下 
//selectedItem = -1 代表鼠标离开 
if(selectedItem == -1){ 
setSelectedItem(0); 

else { 
//索引加1 
setSelectedItem(selectedItem + 1); 

event.preventDefault(); 

}) 
.keypress(function(event){ 
//enter键 
if(event.keyCode == 13) { 
//列表为空或者鼠标离开导致当前没有索引值 
if($autocomplete.find('li').length == 0 || selectedItem == -1) { 
return; 

$searchInput.val($autocomplete.find('li').eq(selectedItem).text()); 
$autocomplete.empty().hide(); 
event.preventDefault(); 

}) 
.keydown(function(event){ 
//esc键 
if(event.keyCode == 27 ) { 
$autocomplete.empty().hide(); 
event.preventDefault(); 

}); 
//注册窗口大小改变的事件,重新调整下拉列表的位置 
$(window).resize(function() { 
var ypos = $searchInput.position().top; 
var xpos = $searchInput.position().left; 
$autocomplete.css('width',$searchInput.css('width')); 
$autocomplete.css({'position':'relative','left':xpos + "px",'top':ypos +"px"}); 
}); 
}); 
</script> 
</head> 
<body> 
<div id = "search"> 
<label for="search-text">请输入关键词</label><input type="text" id="search-text" name="search-text" /> 
<input type="button" id="submit" value="搜索"/> 
</div> 
</body> 
</html> 


服务端的代码,我们这里选择JSP,也可以使用PHP,服务端无所谓,关键是传送数据。 

复制代码代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 
<% 
String []words = {"amani","abc","apple","abstract","an","bike","byebye", 
"beat","be","bing","come","cup","class","calendar","china"}; 
if(request.getParameter("search-text") != null) { 
String key = request.getParameter("search-text"); 
if(key.length() != 0){ 
String json="["; 
for(int i = 0; i < words.length; i++) { 
if(words[i].startsWith(key)){ 
json += "\""+ words[i] + "\"" + ","; 


json = json.substring(0,json.length()-1>0?json.length()-1:1); 
json += "]"; 
System.out.println("json:" + json); 
out.println(json); 


%> 


整个过程思路其实挺清晰的,首先在输入框上注册keyup事件,然后在事件中通过ajax获取json对象。取得数据后,每一项数据创建一个li标签,在标签上注册click事件,这样当我们点击每一项的时候,就可以响应事件。键盘导航的关键是记录当前高亮的索引值,根据索引值来调整背景高亮。显示下拉列表的位置要根据输入框的位置来设置,当浏览器的大小改变时,随时调整下拉列表的位置。 

分享到:
评论

相关推荐

    js实现输入框搜索联想

    效果类似百度搜索中,键入关键字联想出的很多搜索热点。

    vue 联想输入框组件【smartInput】

    vue前端框架 smartInput联想输入框组件,自己亲自封装的,还是挺好用的,下载下来将文件名改成index.vue,然后在框架的/src/components目录下新建文件夹SmartInput,将index.vue放在SmartInput目录下面,然后在页面...

    Vue 实现输入框新增搜索历史记录功能

    vue实现搜索显示历史搜索记录,采用插件-good-storage 安装插件  npm install good-storage -S 在本地新建cache.js文件,该文件是关于本地存储的逻辑处理(缓存到本地的数据最大缓存15条,并且新的插入在第一位,首先...

    输入框自动联想提示

    jsonp: 'callback', //设置此参数名,将开启jsonp跨域功能(我要调淘宝数据,非跨域不可,淘宝的回调参数名就是callback),否则使用json数据结构 item: 'li', //下拉提示项目单位的选择器,默认一个li是一条提示,...

    jquery实现input输入框实时输入触发事件代码

    代码如下: //绑定商品名称联想 $(‘#productName’).bind(‘input propertychange’, function() {searchProductClassbyName();}); 代码如下: searchProductClassbyName 为触发后调用的方法; 实现效果:

    input 联想

    基于html的input筛选联想输入,方便易改。就是页面就是没有样式

    layui 可输入,可搜索,可选择

    使用原生layui select 和 input 实现可输入,可搜索,可选择,太强了,有需要的小伙子们自取

    uniapp模仿下拉框实现文字联想功能 - uniapp输入联想(官方样式-附源码)

    一般是个输入框,输入关键词,下拉一个搜索列表。 ``ElementUI``有提供``&lt;el-autocomplete&gt;``,但uniapp官网没提供这么细,特简单扩展了一下: ## 三、参数说明: |名称| 类型 | 说明 | |--|--|:--| | type | int | ...

    vue中使用iview自定义验证关键词输入框问题及解决方法

     对应配置的关键词输入框,验证要求如下:  1、总字数不能超过7000个;  2、去除配置的关键词特殊符号,得到的关键词组数不能超过300;(如:aaa&(bbb|ccc)|(!ddd|eee)),去掉特殊符号,有5组)  3、单个关键词长度...

    vue 简单自动补全的输入框的示例

    实现一个输入框,输入信息后显示由后台返回的数据,供用户选择,之前用的elm的组件,不过那个有点大。。。简单的情况下自己实现一个也能满足要求。。。应该吧。。。 主题包括一个input用于输入,一个div用于展示...

    Google Android SDK开发范例大全(第3版)part2

     11.1 HTML5 INPUT输入框控制手机输入键盘  11.2 HTML5利用CSS3排版的墙贴相册  11.3 HTML5网页离线数据库  11.4 可拨打电话的HTML连接  11.5 HTML5取回所在经纬度坐标并反查地址  附录A 如何发布程序到...

    《Google Android SDK开发范例大全(第3版)》.pdf

    11.1 html5 input输入框控制手机输入键盘 788 11.2 html5利用css3排版的墙贴相册 789 11.3 html5网页离线数据库 793 11.4 可拨打电话的html连接 797 11.5 html5取回所在经纬度坐标并反查地址 800 ...

    day020-继承加强和设计模式代码和笔记.rar

    装饰者模式指的是在不必改变原类(Input)文件和使用继承的情况下,动态地扩展一个对象的功能。 它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 实现步骤 :通过对原类文件继承,对原有...

    Google Android SDK开发范例大全(第3版) 1/5

    11.1 HTML5 INPUT输入框控制手机输入键盘 11.2 HTML5利用CSS3排版的墙贴相册 11.3 HTML5网页离线数据库 11.4 可拨打电话的HTML连接 11.5 HTML5取回所在经纬度坐标并反查地址 附录A 如何发布程序到Android Market A.1...

    Google Android SDK开发范例大全(第3版) 4/5

    11.1 HTML5 INPUT输入框控制手机输入键盘 11.2 HTML5利用CSS3排版的墙贴相册 11.3 HTML5网页离线数据库 11.4 可拨打电话的HTML连接 11.5 HTML5取回所在经纬度坐标并反查地址 附录A 如何发布程序到Android Market A.1...

    Google Android SDK开发范例大全(第3版) 3/5

    11.1 HTML5 INPUT输入框控制手机输入键盘 11.2 HTML5利用CSS3排版的墙贴相册 11.3 HTML5网页离线数据库 11.4 可拨打电话的HTML连接 11.5 HTML5取回所在经纬度坐标并反查地址 附录A 如何发布程序到Android Market A.1...

    Google Android SDK开发范例大全(第3版) 5/5

    11.1 HTML5 INPUT输入框控制手机输入键盘 11.2 HTML5利用CSS3排版的墙贴相册 11.3 HTML5网页离线数据库 11.4 可拨打电话的HTML连接 11.5 HTML5取回所在经纬度坐标并反查地址 附录A 如何发布程序到Android Market A.1...

    基于hhww改进版的传统五笔输入法(新版支持WIN7)

    HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys 五、输入法键盘定义功能,适用于非英文键盘(需要管理员权限)。 六、安装删除输入法 IME TOOL 可以安装标准格式的输入法。自行复制 ime 和 mb 文件到系统...

    基于hhww改进版的传统五笔输入法

    0x1EB60 : 00005500 00800000 00000000 分别对应“候选、重码、联想”状态的颜色,可以自行修改。 2、字符集只要GB和GBK集方法: 第一步:用eXecope.exe等工具隐藏GBK、GB18030(Unicode作为GBK) 第二步:0x...

Global site tag (gtag.js) - Google Analytics