JS jquery自动补全
程序员文章站
2022-06-01 12:55:59
...
思路:
1 输入字符串,keyup事件,通过输入的字符串去后台取数据
2 Controoler层跳到jsp页面,返回null,拼装自己想要的任何数据,xml,html都可以
3 异步成功方法获取数据,用jquery的方法进行设置
4 形成div在input下进行显示
5 第二次的keyup事件,如果第一次的没有请求完,取消第一次,进行第二次的keyup事件
1 页面
2 js文件
3 java代码
4 中间页面 ajaxResponseHTMLBetween.jsp
1 输入字符串,keyup事件,通过输入的字符串去后台取数据
2 Controoler层跳到jsp页面,返回null,拼装自己想要的任何数据,xml,html都可以
3 异步成功方法获取数据,用jquery的方法进行设置
4 形成div在input下进行显示
5 第二次的keyup事件,如果第一次的没有请求完,取消第一次,进行第二次的keyup事件
1 页面
<html:text property="testDTO.tmpText01" styleId="tmpText01" styleClass="must" />
<div id="autodpt" style="position:absolute; top:25px; left:50px; padding:4px; display:none; z-index:100;OVERFLOW-Y:auto;SCROLLBAR-FACE-COLOR:#ffffff;FONT-SIZE:11pt;PADDING-BOTTOM:0px;SCROLLBAR-HIGHLIGHT-COLOR:#ffffff;OVERFLOW:auto;LETTER-SPACING:1pt;HEIGHT:200px;TEXT-ALIGN:left"></div>
2 js文件
var wordInput = $("#tmpText01");
var wordInputOffset = wordInput.offset();
//隐藏自动补全框并通过CSS设置补全框的位置大小及样式
$("#autodpt").hide()
.css("position","absolute")
.css("border","1px black solid")
.css("top",wordInputOffset.top + wordInput.height() + 5 + "px")
.css("left",wordInputOffset.left + "px")
.width(wordInput.width() + 2);
var IfrRef1 = document.getElementById('DivDpt');
IfrRef1.style.display = "none";
/添加键盘按下并弹起的事件
wordInput.keyup(function(event){
//处理文本框中的键盘事件
var myEvent = event||window.event;
var keyCode = myEvent.keyCode;
//如果输入的是字母,退格,delete,空格或者数字键,应该将文本框中的最新信息发送给服务器,其中,空格键和数字键的加入使得输入中文也能支持~~
if((keyCode >= 65 && keyCode<=90) || (keyCode >= 48 && keyCode <= 57) ||(keyCode>=96 && keyCode<=105) || keyCode == 46 || keyCode == 8 || keyCode == 32){
//获取文本框的内容
var wordText = $("#tmpText01").val();
var autoNode = $("#autodpt");
if(wordText!=""){ //
//将文本框中的内容发送到服务器端
//对上次未完成的延时操作进行取消
clearTimeout(timeoutIdDpt);
//对于服务器端进行交互延迟500ms,避免快速打字造成的频繁请求
timeoutIdDpt = setTimeout(function(){
$.post("*.do?method=initInfoList",{word:wordText},function(data){
//将dom对象data转换成JQuery的对象
var jqueryObj = $(data);
//先找到所有的word节点
var wordNodes = jqueryObj.find("word");
//遍历所有的word节点,取出单词内容将单词内容添加到弹出框中
autoNode.html('');
wordNodes.each(function(i){
//获取单词内容
var wordNode = $(this);
//新建div节点将单词内容加入到新建的节点中,将新建的节点加入到弹出框的节点中
var newDivNode = $("<div>").attr("id",i)
.attr("attr1",wordNode.attr("attr1"))
.attr("attr2",wordNode.attr("attr2"))
// autoNode.attr("dd",i+"a");
newDivNode.html(wordNode.text()).appendTo(autoNode);
//增加鼠标进入事件,高亮节点;
newDivNode.mouseover(function(){
if(highlightindexDpt != -1){
$("#autodpt").children("div").eq(highlightindexDpt).css("background-color","white");
}
highlightindexDpt = $(this).attr("id");
$(this).css("background-color","yellow");
});
//增加鼠标移出事件,取消当前高亮节点
newDivNode.mouseout(function(){
$(this).css("background-color","white");
});
//增加鼠标点击事件,可以进行补全
newDivNode.click(function(){
var comText = $(this).text();
$("#autodpt").hide();
var IfrRef1 = document.getElementById('DivDpt');
IfrRef1.style.display = "none";
highlightindexDpt=-1;
$("#tmpText01").val(comText);
$("#node").attr("value",$(this).attr("attr1"));
});
});
//如果服务器端有数据返回,则显示弹出框
if(wordNodes.length>0){
autoNode.show();
var DivRef = document.getElementById('autodpt');
var IfrRef = document.getElementById('DivDpt');
IfrRef.style.width = DivRef.offsetWidth;
IfrRef.style.height = DivRef.offsetHeight;
IfrRef.style.top = DivRef.style.top;
IfrRef.style.left = DivRef.style.left;
IfrRef.style.zIndex = DivRef.style.zIndex - 1;
IfrRef.style.display = "block";
}else {
autoNode.hide();
var IfrRef1 = document.getElementById('DivDpt');
IfrRef1.style.display = "none";
highlightindexDpt=-1;
}
},"xml");
},1500);
}else{
var IfrRef1 = document.getElementById('DivDpt');
IfrRef1.style.display = "none";
highlightindexDpt=-1;
autoNode.hide();
highlightindexDpt=-1;
}
} else if(keyCode == 38 || keyCode==40){
//如果输入的是向上38向下40按键
if(keyCode == 38){
//up
var autoNodes = $("#autodpt").children("div");
if(highlightindexDpt !=-1)
{
autoNodes.eq(highlightindexDpt).css("background-color","white");
highlightindexDpt--;
}else{
highlightindexDpt = autoNodes.length -1;
}
if(highlightindexDpt == -1){
//如果修改索引值以后index变成-1,则将索引中指向最后一个元素
highlightindexDpt = autoNodes.length -1;
}
//让现在被高亮的内容变成黄色
autoNodes.eq(highlightindexDpt).css("background-color","yellow");
}
if(keyCode == 40){
//down
var autoNodes = $("#autodpt").children("div");
if(highlightindexDpt !=-1)
{
autoNodes.eq(highlightindexDpt).css("background-color","white");
}
highlightindexDpt++;
if(highlightindexDpt == -1){
//如果修改索引值以后index变成-1,则将索引中指向最后一个元素
highlightindexDpt = 0;
}
//让现在被高亮的内容变成黄色
autoNodes.eq(highlightindexDpt).css("background-color","yellow");
}
}else if(keyCode == 13){
//如果按下的是回车
//下拉框有高亮的内容
if(highlightindexDpt !=-1)
{
var comText = $("#autodpt").hide().children("div").eq(highlightindexDpt).text();
var IfrRef1 = document.getElementById('DivDpt');
IfrRef1.style.display = "none";
highlightindexDpt=-1;
$("#DivDpt").val(comText); //将文本框内容改成选中项
// $("form:first").submit(); //提交form。若没有这句话,按下回车后,仅仅只改变了文本框里的内容,但是由于form本身就监控了回车按键默认为submit,提交的是文本框改变之前的内容,解决这个问题最简单的方式就是在文本框内容改变以后强制提交form的内容,此时,提交的内容就是选中项。
}
//下拉框没有高亮的内容
else{
$("#autodpt").hide();
var IfrRef1 = document.getElementById('DivDpt');
IfrRef1.style.display = "none";
//让文本框失去焦点
$("#tmpText01").get(0).blur();
}
}
});
3 java代码
public ActionForward initAjaxForXML(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
try {
log.info("Ajax返回XML 异步请求开始!");
request.setAttribute("attr",new ArrayList());
//根据c_code 判断页面的显示情况
response.setCharacterEncoding("UTF-8");
response.setHeader("Cache-Control", "no-cache,must-revalidate");
response.setHeader("Pragma", "no-cache"); // HTTP 1.0
response.setDateHeader("Expires", 0); // prevents cachin
request.getRequestDispatcher("/ajaxResponseHTMLBetween.jsp").forward(request, response);
log.info("Ajax返回XML 异步请求结束!");
return null;
} catch (Exception e) {
log.error("Ajax返回XML 异常!");
return null;
}
4 中间页面 ajaxResponseHTMLBetween.jsp
<%@ page language="java" contentType="text/xml; charset=utf-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<words>
<c:forEach var="word" items="${attr}">
<word attr1="${word.attr1}" attr2="${word.attr2}" attr3="${word.atrr3}" >${word.attr1} ${word.attr2}</word>
</c:forEach>
</words>
上一篇: Apache Reference Manual (8)_PHP教程
下一篇: 开发拾遗
推荐阅读
-
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
-
js小技巧--自动隐藏红叉叉_图象特效
-
js实现每日自动换一张图片的方法_javascript技巧
-
JS和JQuery对操作DOM的方法
-
JS+jQuery编写简单选项卡的示例
-
jquery ajax对特殊字符进行转义防止js注入使用示例
-
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
-
jquery.validate.js 多个相同name的处理方式
-
js或者jquery判断图片是否加载完成实现代码_javascript技巧
-
js自动闭合html标签(自动补全html标记)_javascript技巧