ajax 文本框提示

该博客展示了如何使用Ajax技术结合HTML、CSS和JavaScript实现输入框的智能提示功能。在用户输入时,通过键盘上下键和回车可以选择提示内容。示例中涉及的文件包括HTML、CSS、JavaScript代码以及Struts2的配置。示例代码中,当用户在`questionTypeName`输入框输入时,会调用`getTypeName`函数,发送Ajax请求到`tcsQsAjax.do`以获取提示数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先贴效果图吧:

                                      

美化方面,不足,有目共睹哈。。。

支持鼠标移动点击、键盘上下键回车选中

先贴HTML:

<td width="50%">

    <html:text property="questionTypeName" styleId="typeName" οnkeyup="getTypeName(this,'tcsQsAjax.do');"/>

    <div id="typeNameDiv" style="position: absolute; bottom: 1in;right: 1in; top: 1in;z-index:1001;overflow-y:auto;display:none;border:#acc8ec 1px solid;"/>

</td>

再贴CSS:

.input_Type{

   background-color: #FEF0C9;

}

#ul_background{

  background-color:white;

  margin-left:-40px;

  margin-top:-1px;

  list-style-type:none;

}

再贴JS:
/**
 * ajax 动态加载题目类型名称
 */
<script>
var typeName = $('#typeName').val();
var flag = false;
var typeInput = {
	li_index : -1,
	init : function(input, url) {
		//支持firefox
		var event = window.event || arguments.callee.caller.arguments[0];
		var keyAsc = event.keyCode;
		if($("#typeName").val() != typeName)
			if($("#typeName").val() == ""){
				typeInput.li_index = -1;
			}
			var typeName = $("#typeName").val();
			typeInput.findTypesByAjax(input, url);
		} else {
			typeInput.lightMove(keyAsc);
		}
	},
	findTypesByAjax : function(input, url) {
	
		//var assistParent = input.offsetParent;
		filedName = input.name;
		var param = "str=" + input.value;//键入的值
		var json = null;
        $.ajax({
                type:'post',  
                url:url+'?method=getTypesByName',  
                data:{str:input.value},  
                dataType: 'json', 
                success: function(response) {
			json = eval(response);
			if (json != null) {
				var myDiv = document.getElementById("typeNameDiv");
				typeInput.setDivPosition(input);// 设置div的位置
				var ul = typeInput.setUl(json, input);
				if(ul == undefined){
					myDiv.innerHTML = "";
					myDiv.style.display = "none";
					return ;
				}
				myDiv.innerHTML = ul;
				myDiv.style.display = "block";
			}
		},
		error: function(){
			alert("ajax查询类型名称失败!");
		}     
            });  
	},
	lightMove : function(keyAsc) {
		var li = document.getElementById("typeNameDiv")
				.getElementsByTagName("li");
		if (keyAsc == 40) {// 下键
			if (typeInput.li_index != -1) {
				// 恢复到原来的颜色
				li[typeInput.li_index].className = "";
			}
			typeInput.li_index++;
			// 如果到了最后一个元素,则从第一个开始
			if (typeInput.li_index == li.length) {
				typeInput.li_index = 0;
			}
			// 改变样式
			li[typeInput.li_index].className = "input_Type";
		}
		if (keyAsc == 38) {// 向上
			// 不等于-1时,索引自减
			if (typeInput.li_index != -1) {
				// 恢复到原来的颜色
				li[typeInput.li_index].className = "";
				typeInput.li_index--;
			}
			// 等于-1时,将索引移动最后一位
			if (typeInput.li_index == -1) {
				typeInput.li_index = li.length - 1;
			}
			li[typeInput.li_index].className = "input_Type";
		}
		if (keyAsc == 13 && typeInput.li_index != -1) {// 回车
			// 调用设值方法
			typeInput.fillTypeInputText(filedName, li[typeInput.li_index]);
		}
	},
	//设置UL
	setUl : function(json, input) {
		if (json == undefined || json == "") {
			return;
		}
		var ul = "<ul id='ul_background' style='width:"
				+ typeNameDiv.style.width + "; left: 0px; margin-left: 0px;'>";
		for (var index in json) {
			var userObject = json[index];
			var name = userObject["name"];
			var filedValue = userObject["id"];
			if (name == undefined) {
				continue;
			} else {
				if (index == 0) {
					ul += "<li class='input_Type'";
				} else {
					ul += "<li ";
				}
				ul += " id="+ filedValue +" style='list-style-type:none;' οnmοuseοver='typeInput.changeCss(this)' οnclick='fillTypeInputText(this)'>"+ name +"</li>";
			}
		}
		ul += "</ul>";
		return ul;
	},
	//设置DIV座标
	setDivPosition : function(typeInput) {
		var assistHiddenDiv = document.getElementById("typeNameDiv");
		// 得到文本框的高度、宽度、左边距
		var offsetLeft = typeInput.getBoundingClientRect().left
				+ document.documentElement.scrollLeft;
		var offsetTop = typeInput.getBoundingClientRect().top
				+ document.documentElement.scrollTop + 10;
		var offsetWidth = typeInput.offsetWidth;
		// 设置div的属性
		assistHiddenDiv.style.width = offsetWidth;
		assistHiddenDiv.style.left = offsetLeft-2;
		assistHiddenDiv.style.top = offsetTop;
	},
	//设置文本框的值
	fillTypeInputText : function(typeInputText, obj) {
		var typeInput = document.getElementById(typeInputText);
		typeInput.value = obj.innerText;
		typeNameDiv.style.display = "none";
	},
	//鼠标 移动时改变li 的CSS
	changeCss : function(obj) {
		var assistHiddenDiv = document.getElementById("typeNameDiv")
				.getElementsByTagName("li");
		var length = assistHiddenDiv.length;
		$("#ul_background li").removeClass();
		$(obj).addClass("input_Type");
	}
}
 
function getTypeName(input, url) {
	var inputObj = new typeInput.init(input, url);
}

$(document).ready(function(){
  $("#typeName").blur(function(){
  	if(!flag){
  		$("#ul_background").remove();
	    $("#typeNameDiv").css("display","none");
	}
  });
  $("#typeNameDiv").mouseout(function(){
  		flag = false;
  		$("#typeName").focus();
  });
  $("#typeNameDiv").mouseover(function(){
  		flag = true;
  });
  $("#typeName").click(function(){
  	if($("#typeName").val()==""){
  		typeInput.findTypesByAjax(this, "tcsQsAjax.do");
  	}
  });
 
});

function fillTypeInputText(obj){
	$("#typeName").val(obj.innerText);
	$("#typeNameDiv").innerText = "";
	$("#typeNameDiv").css("display","none");
}

</script>
再贴struts-config.xml:
<action path="/qs/tcsQsAjax"
        type="com.baosight.baosteel.bsi.cs.qs.struts.action.QuestionsAjaxAction"
        scope="request" parameter="method"
        validate="false"/>

再贴Action:再贴Action:再贴Action:
public class QuestionsAjaxAction extends BaseAction{

	public ActionForward getTypesByName(BActionContext context) throws Exception {
		HttpServletRequest request = context.getRequest();
		HttpServletResponse response = context.getResponse();
		String stringValue = request.getParameter("str");
		IQuestionsBankManageService service = (IQuestionsBankManageService) context.findService(
				"questionsService", IQuestionsBankManageService.class);
		List list = service.queryQsTypesByAjax(stringValue);
		List result = null;
		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
			QuestionTypeModel type = (QuestionTypeModel) iterator.next();
			QsType obj = new QsType(type.getId(), type.getQuestionTypeName());
			if(result == null){
				result = new ArrayList();
			}
			result.add(obj);
		}
		JSONArray jsonary = JSONArray.fromObject(result);
		try {
			request.setCharacterEncoding("gbk");
			response.setContentType("text/xml;charset=gbk");
		} catch (UnsupportedEncodingException el) {
			el.printStackTrace();
		}
		PrintWriter out;
		try {
			out = response.getWriter();
			out.write(jsonary.toString());
			out.flush();
			out.close();

		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}


里面有用到jquery,所以要注意在jsp中引入它OK,完了里面有用到jquery,所以要注意在jsp中引入它

OK,完了

 


 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值