`
jiangnan2112
  • 浏览: 122220 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

dwr实现搜索自动补全功能(键盘鼠标均可,类似百度)

阅读更多
上段时间想做一个百度等搜索自动提示补全的功能。于是从网上弄了点资料实现了第一个版本,但光标事件没有实现。于是又从网上弄了点资料,这个版本的作者我记不清楚了,对他说声对不起,由于这个版本的数据是在页面上写的死数据,所以个人把这个地方改成用DWR从后台取的数据,数据封装形式为List<javaBean>。修改后完成鼠标,方向键,ESC键以及失去焦点后所有的功能。程序中你也可以把AutoComplete类修改成两个参数的类,我这里还是沿用三个参数,初始化时只是随便给了一条数据,真正的数据是从后台刷出来的。当然也可以把取数据的改成AJAX等其他方式。效果图如下:

以下是代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
	<script type='text/javascript' src="<c:url value='/dwr/interface/SearchAuto.js'/>"></script>  
	<script type='text/javascript' src="<c:url value='/dwr/engine.js'/>"></script>
	<script type='text/javascript' src="<c:url value='/dwr/util.js'/>"></script>	
	<style>
.auto_hidden {
    width:204px;border-top: 1px solid #333;
    border-bottom: 1px solid #333;
    border-left: 1px solid #333;
    border-right: 1px solid #333;
    position:absolute;
    display:none;
}
.auto_show {
    width:204px;
    border-top: 1px solid #333;
    border-bottom: 1px solid #333;
    border-left: 1px solid #333;
    border-right: 1px solid #333;
    position:absolute;
    z-index:9999; /* 设置对象的层叠顺序 */
    display:block;
}
.auto_onmouseover{
    color:#ffffff;
    background-color:highlight;
    width:100%;
}
.auto_onmouseout{
    color:#000000;
    width:100%;
    background-color:#ffffff;
}
</style>
<script type="text/javascript">
	//验证	
	function validate(){
	   var key = document.getElementById("key").value;
	   if(key ==""){
	      alert("请输入检索内容!");
	      return false;
	   }
	   return true;	   
	}
</script>

<script language="javascript">
	<!--
	/*
	通用: 自动补全(仿百度搜索框)
	*/
	var get$ = function (id) {
	    return "string" == typeof id ? document.getElementById(id) : id;
	}
	var Bind = function(object, fun) {
	    return function() {
	        return fun.apply(object, arguments);
	    }
	}
	function AutoComplete(obj,autoObj,arr){
	    this.obj=get$(obj);        //输入框
	    this.autoObj=get$(autoObj);//DIV的根节点
	    this.value_arr=arr;        //不要包含重复值
	    this.index=-1;          //当前选中的DIV的索引
	    this.search_value="";   //保存当前搜索的字符
	}
	AutoComplete.prototype={
    //初始化DIV的位置
    init: function(){
        this.autoObj.style.left = this.obj.offsetLeft+"px" ;
        this.autoObj.style.top  = this.obj.offsetTop + this.obj.offsetHeight + "px";
        this.autoObj.style.width= this.obj.offsetWidth - 2 + "px";//减去边框的长度2px   
    },
    //删除自动完成需要的所有DIV
    deleteDIV: function(){
        while(this.autoObj.hasChildNodes()){
            this.autoObj.removeChild(this.autoObj.firstChild);
        }
        this.autoObj.className="auto_hidden";
    },
    //设置值
    setValue: function(_this){
        return function(){
            _this.obj.value=this.seq;
            _this.autoObj.className="auto_hidden";
        }       
    },
    //模拟鼠标移动至DIV时,DIV高亮
    autoOnmouseover: function(_this,_div_index){
        return function(){
            _this.index=_div_index;
            var length = _this.autoObj.children.length;
            for(var j=0;j<length;j++){
                if(j!=_this.index ){       
                    _this.autoObj.childNodes[j].className='auto_onmouseout';
                }else{
                    _this.autoObj.childNodes[j].className='auto_onmouseover';
                }
            }
        }
    },
    //更改classname
    changeClassname: function(length){
        for(var i=0;i<length;i++){
            if(i!=this.index ){       
                this.autoObj.childNodes[i].className='auto_onmouseout';
            }else{
                this.autoObj.childNodes[i].className='auto_onmouseover';
                this.obj.value=this.autoObj.childNodes[i].seq;
            }
        }
    }
    ,
    //响应键盘
    pressKey: function(event){
        var length = this.autoObj.children.length;   
        //ESC键  
        if(event.keyCode == 27){
           document.getElementById("auto").className="auto_hidden";
        }
        //光标键"↓"
        if(event.keyCode==40){
            ++this.index;
            if(this.index>length){
                this.index=0;
            }else if(this.index==length){
                this.obj.value=this.search_value;
            }

            this.changeClassname(length);
        }
        //光标键"↑"
        else if(event.keyCode==38){
            this.index--;
            if(this.index<-1){
                this.index=length - 1;
            }else if(this.index==-1){
                this.obj.value=this.search_value;
            }                      
            this.changeClassname(length);
            
        }
        //回车键
        else if(event.keyCode==13){
            this.autoObj.className="auto_hidden";
            this.index=-1;
        }else{
            this.index=-1;
        }
    },
    //程序入口
    start: function(event){
    
           //取数据
	 	   var data = new Array() ;
		   var key = document.getElementById('key').value;
		   if(key != null && key.trim() !=""){
			   DWREngine.setAsync(false);
		       SearchAuto.getResourcesInfoByDwr(key,{
		       		callback:function callback(msg){
		       		   //调用单独的回调函数
					   for(var i = 0 ;i<msg.length;i++){
					      data.push(msg[i].erinName);
					   }
		       		},
		            errorHandler:function errors(){
		              //do nothing
		            }
		       });    
		       DWREngine.setAsync(true);
	       }
           this.value_arr=data;        //数据变化时重新赋值
		       
		//键盘        
        if(event.keyCode!=13&&event.keyCode!=38&&event.keyCode!=40){
            this.init();
            this.deleteDIV();
            this.search_value=this.obj.value;
            var valueArr=this.value_arr;
            valueArr.sort();
            if(this.obj.value.replace(/(^\s*)|(\s*$)/g,'')==""){ return; }//值为空,退出
            try{ var reg = new RegExp("(" + this.obj.value + ")","i");}
            catch (e){ return; }
            var div_index=0;//记录创建的DIV的索引
            for(var i=0;i<valueArr.length;i++){
                if(reg.test(valueArr[i])){
                    var div = document.createElement("div");
                    div.className="auto_onmouseout";
                    div.seq=valueArr[i];
                    div.onclick=this.setValue(this);
                    div.onmouseover=this.autoOnmouseover(this,div_index);
                    div.innerHTML=valueArr[i].replace(reg,"<strong>$1</strong>");//搜索到的字符粗体显示
                    this.autoObj.appendChild(div);
                    this.autoObj.className="auto_show";
                    div_index++;
                }
            }
        }
        this.pressKey(event);
        window.onresize=Bind(this,function(){this.init();});
    }
}

      //失去焦点时关闭提示框
	  document.onclick = function(e)
	  {
	    var event = window.event || e;
	    var ele = event.srcElement || event.target;
	    if(ele.id != "autoComplete" && ele.id !="key"){
	        document.getElementById("auto").className="auto_hidden";
	    }
	  }

//-->
</SCRIPT>
<form id="form1" name="form1" method="post" action="search/hibernateSearch.htm?action=searchAllResources" onsubmit="return validate();">    
   <div class="searchtop">
	  <input type="radio" name="type" value="0" />全部
	     <input type="radio" name="type" value="1" />作者
	     <input type="radio" name="type" value="2" checked="checked"/>书名
	</div>
	<div class="searchmain bugc">
	     <input type="text" name="key" id="key" value="${key }" class="inputa"  onkeyup="autoComplete.start(event);" autocomplete="off"/>
	     <input type="submit" name="Submit" value="" class="btna"/>
	     <div id="auto" class="auto_hidden" ></div>
    <a href="search/hibernateSearch.htm?action=advancedSearchForward" title="高级检索">高级检索</a></div>
<script>
   var autoComplete = new AutoComplete('key','auto',['1','11']); 
</SCRIPT>
</form>


  • 大小: 15.3 KB
  • 大小: 15.3 KB
1
1
分享到:
评论

相关推荐

    Ajax dwr框架实现自动补全功能

    在本文中,我们将深入探讨如何使用Ajax、Direct Web Remoting (DWR) 框架以及Hibernate ORM工具来实现一个自动补全功能。这个功能类似于百度搜索引擎中的输入提示,能够根据用户输入的字符动态地提供可能的搜索建议...

    Ajax的DWR框架的自动补全功能完美实现

    在本教程中,我们将深入探讨如何利用DWR框架来实现自动补全功能,结合Servlet和JDBC,为用户提供流畅的数据检索体验。 自动补全功能在现代Web应用中非常常见,例如搜索引擎、输入框建议等。它能够根据用户在输入框...

    DWR实现自动补全功能

    DWR自动补全 1111111111111111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222

    ssh_dwr_jQuery自动补全

    jQuery 自动补全功能是一种常见的用户体验提升技术,它在用户输入时提供预填充选项,通常应用于搜索框或表单字段。这种功能可以通过监听用户输入并发送 AJAX 请求到服务器来获取匹配数据,然后将结果展示给用户。在...

    ssh+dwr自动补全

    根据提供的文件信息,我们可以深入探讨如何使用SSH(Struts2 + Spring + Hibernate)框架结合DWR(Direct Web Remoting)实现自动补全功能。自动补全是现代Web应用中常见的交互特性之一,它不仅可以提高用户体验,还...

    ajax(DWR框架)实现简单的内容自动补全

    在IT领域,特别是Web开发中,Ajax(Asynchronous JavaScript and XML)技术和DWR(Direct Web Remoting)框架的结合被广泛应用于实现动态网页效果,尤其是内容自动补全功能,这在用户界面交互设计中极为常见。...

    基于JQuery和DWR的自动补全

    【基于JQuery和DWR的自动补全】是一种在Web应用中实现动态数据输入提示的技术。JQuery是一款广泛使用的JavaScript库,它简化了HTML文档遍历、事件处理、动画以及Ajax交互。DWR(Direct Web Remoting)则是一个Java...

    Java - Ajax自动补全

    在这个项目中,我们将聚焦于如何利用Direct Web Remoting (DWR) 框架来实现Ajax的自动补全功能。 DWR是一种轻量级的Java库,它允许JavaScript和Java之间进行安全的、动态的远程方法调用(RMI)。DWR简化了Ajax应用的...

    DWR实例(模仿百度的搜索功能)自动补全

    自己dwr做的实例,具体如下: 数据库中有五条记录:1 12 123 1234 12345 输入 1 输出:1 12 123 1234 12345(以1开头的全部记录) 输入 12 输出: 12 123 1234 12345(以12..) 输入 123输出: 123 1234 12345(以123..) ...

    dwr自动补全

    DWR的自动补全功能是通过其内置的JavaScript引擎实现的,它会根据服务器端暴露的Java对象和方法自动生成对应的JavaScript代码,这样在使用这些对象和方法时,开发工具(如IDE)可以提供实时的补全建议。此外,DWR还...

    DWR实现Google自动提示功能

    在这个实例中,“DWR实现Google自动提示功能”是利用DWR框架来构建一个类似于Google搜索框的自动提示功能,用户在输入框中输入时,后台会实时地根据输入内容提供相关的建议,无需页面刷新。 一、DWR框架详解: DWR...

    dwr补全查询实例

    在本实例"**dwr补全查询**"中,我们关注的是如何利用DWR实现类似百度搜索那样的自动补全功能。这种功能通常用于提高用户输入效率,当用户在输入框中键入字符时,系统会根据已输入的字符实时查询数据库,并通过Ajax...

    类似google搜索内容补全

    标题中的“类似google搜索内容补全”指的是在网页搜索框中输入关键词时,系统能够根据已输入的部分文字预测并提供可能的完整搜索词,这种功能通常被称为自动补全或自动建议。Google搜索的自动补全功能是通过分析大量...

    dwr ajax 下拉框自动搜索

    在这个特定的项目中,"dwr ajax 下拉框自动搜索"是指利用DWR框架和AJAX技术来创建一个功能,用户在输入框中输入关键词时,下拉框会自动填充匹配的建议,类似百度搜索的体验。当用户选择某个选项或点击搜索按钮,系统...

    dwr实现web类似web桌面功能!

    【标题】"DWR实现Web类似Web桌面功能"揭示了一个技术应用场景,即使用Direct Web Remoting (DWR)框架在Web应用中实现类似桌面应用的交互体验。DWR是一种JavaScript库,它允许JavaScript代码直接调用服务器端的Java...

    dwr实现ajax功能ajax+dwr

    通过DWR,我们可以使用JavaScript直接调用服务器端的Java方法,实现Ajax(Asynchronous JavaScript and XML)的功能,即在后台与服务器交互数据并局部更新网页。 **Ajax**的核心是利用JavaScript进行异步数据请求,...

    ajax自动补全源码

    根据提供的文件信息,我们可以分析出该段代码涉及的是一个基于Ajax技术实现的用户输入自动补全功能。下面将从以下几个方面进行深入解析: ### 一、理解Ajax自动补全的基本概念 Ajax(Asynchronous JavaScript and ...

    dwr实现的分页功能

    DWR(Direct Web Remoting)是一个开源的Java库,它允许JavaScript在客户端与服务器端的Java对象进行直接交互,从而实现在Web应用中的Ajax(Asynchronous JavaScript and XML)功能。在本示例中,我们将深入探讨如何...

    dwr3实现推送功能

    本篇文章将详细讲解如何利用DWR 3实现推送功能。 1. **DWR 3 的基本概念** DWR 3 提供了一种安全、高效的机制,使得JavaScript可以调用Java方法,并将结果返回到页面上。这种机制是基于HTTP的异步请求,因此无需...

    dwr实现局部刷新

    4. **AutoComplete**:DWR提供了自动完成功能,用于在客户端输入框中动态提示可能的匹配项,例如在搜索框中输入内容时显示建议列表。 5. **Echo**:DWR的Echo功能允许在后台执行长时间的任务,同时保持与客户端的...

Global site tag (gtag.js) - Google Analytics