当前位置: 代码迷 >> Web前端 >> 仿Google Suggest提醒效果
  详细解决方案

仿Google Suggest提醒效果

热度:179   发布时间:2012-11-08 08:48:11.0
仿Google Suggest提示效果

JS文件:

var arrOptions = new Array();
var arrOptions1 = new Array();
var strLastValue = "";
var theTextBox;
var currentValue = "";
var currentValueSelected = -1;
var req;

window.onload = function()
{
var elemSpan = document.createElement("span");
elemSpan.id = "spanOutPut";
elemSpan.className = "spanTextDropdown";
document.body.appendChild(elemSpan);
}

function GiveOptions()
{
var intKey = -1;
if(window.event)
{
intKey = event.keyCode;
theTextBox = event.srcElement;
}

if(theTextBox.value.length==0)
{
HideTheBox();
strLastValue = "";
return false;
}

if(intKey == 13)
{
GrabHighlighted();
theTextBox.blur();
return false;
}
else if(intKey == 38)
{
MoveHighlight(-1);
return false;
}
else if(intKey == 40)
{
MoveHighlight(1);
return false;
}

if(theTextBox.value.indexOf(strLastValue)!=0 || arrOptions.length==0 || (strLastValue.length==0&&theTextBox.value.length>0) || (theTextBox.value.length<=strLastValue.length))
{
strLastValue = theTextBox.value;
TypeAhead(theTextBox.value);
}
else
{
BuildList(theTextBox.value);
}
}

function TypeAhead(xStrText)
{
var url = "test_002.jsp";
if(window.XMLHttpRequest)
{
req = new XMLHttpRequest();
}
else if(window.ActiveXObject)
{
req = new ActiveXObject("Microsoft.XMLHTTP");
}
if(req)
{
req.open("GET",url,true);
req.onreadystatechange=callback;
req.send(null);
}
}

function callback()
{
if(req.readyState == 4)
{
if(req.status == 200)
{
parseMessage();
}
else
{
alert("Not able to retieve description" + req.statusText);
}
}
else
{
}
}

function createXml(str)
{
	if(document.all){
		var xmlDom=new ActiveXObject("Microsoft.XMLDOM");
		xmlDom.loadXML(str);
		return xmlDom;
	} else {
		return new DOMParser().parseFromString(str, "text/xml");
	}
}

function parseMessage()
{
var xmldoc;
xmldoc=createXml(req.responseText);
var node = xmldoc.getElementsByTagName("info");
var node1 = xmldoc.getElementsByTagName("info1");
arrOptions = new Array();
arrOptions1 = new Array();
for(var i=0; i<node.length; i=i+1)
{
arrOptions[i] = node[i].firstChild.nodeValue;
arrOptions1[i] = node1[i].firstChild.nodeValue;
}
BuildList(theTextBox.value);
strLastValue = theTextBox.value;
}

function BuildList(theText)
{
SetElementPosition();
var inner = "";
var theMathches = MakeMatches(theText);
for(var i=0; i<theMathches.length; i=i+1)
{
inner += theMathches[i];
}
if(theMathches.length>0)
{
document.getElementById("spanOutPut").innerHTML = inner;
document.getElementById("OptionsList_0").className = "spanHighElement";
currentValueSelected = 0;
}
else
{
HideTheBox();
}
}

function SetElementPosition()
{
var selectedPosX = 0;
var selectedPosY = 0;
var theElement = document.form1.txtUserInput;
var theTextBoxInt = document.form1.txtUserInput;
if(!theElement) return;
var theElemHeight = theElement.offsetHeight;
var theElemWidth = theElement.offsetWidth;
while(theElement != null)
{
selectedPosX += theElement.offsetLeft;
selectedPosY += theElement.offsetTop;
theElement = theElement.offsetParent;
}
var xPosElement = document.getElementById("spanOutput");
xPosElement.style.left = selectedPosX;
xPosElement.style.width = theElemWidth;
xPosElement.style.top = selectedPosY + theElemHeight;
xPosElement.style.display = "block";
}

var countForId = 0;
function MakeMatches(xCompareStr)
{
	countForId = 0;
var matchArray = new Array();
var regExp = new RegExp(xCompareStr,"ig");
for(var i=0; i<arrOptions.length; i++)
{
if((arrOptions[i].search(regExp))>-1)
{
matchArray[matchArray.length] = CreateSpanEnd(arrOptions[i],xCompareStr,i);
}
else
{
continue;
}
}
return matchArray;
}

var undeStart = "<span class='spanMatchText'>";
var undeEnd = "</span>";
var selectSpanStart = "<span style='width:100%;dispaly:block;' class='spanNormalElement' onmouseover='SetHighColor(this)'";
var selectSpanEnd = "</span>";
function CreateSpanEnd(xStr,xTextMatch,xVal)
{
var selectSpanMid = "onclick='SetText("+ xVal +")'" + "id='OptionsList_" + countForId + "'theArrayNumber='" + xVal + "'>";
countForId++;
var regExp = new RegExp(xTextMatch,"ig");
var start = xStr.search(regExp);
var matchedText = xStr.substring(start,start + xTextMatch.length);
var Replacestr = xStr.replace(regExp,undeStart+matchedText+undeEnd);
return selectSpanStart + selectSpanMid + Replacestr + selectSpanEnd;
}

function SetHighColor(theTextBox)
{
if(theTextBox)
{
currentValueSelected = theTextBox.id.slice(theTextBox.id.indexOf("_")+1,theTextBox.id.length);
}
for(var i=0; i<countForId; i=i+1)
{
document.getElementById('OptionsList_'+i).className = 'spanNormalElement';
}
document.getElementById('OptionsList_'+currentValueSelected).className = 'spanHighElement';
}

function SetText(xVal)
{
theTextBox = document.form1.txtUserInput;
theTextBox.value = arrOptions[xVal];
document.form1.txtUserInput1.value = arrOptions1[xVal];
document.getElementById("spanOutPut").style.display = "none";
currentValueSelected = -1;
}

function GrabHighlighted()
{
if(currentValueSelected >=0)
{
xVal = document.getElementById("OptionsList_" + currentValueSelected).getAttribute("theArrayNumber");
SetText(xVal);
HideTheBox();
}
}

function HideTheBox()
{
document.getElementById("spanOutPut").style.display = "none";
currentValueSelected = -1;
}

function MoveHighlight(xDir)
{
if(currentValueSelected>=0)
{
newValue=parseInt(currentValueSelected) + parseInt(xDir);
if(newValue >-1 && newValue<countForId)
{
currentVlaueSelected = newValue;
SetHighColor(null);
}
}
}

function ReDraw()
{
BuildList(document.form1.txtUserInput.value);
}

?

CSS样式文件:

span.spanTextDropdown
{
position:absolute;
top:0px;
left:0Px;
width:150px;
z-index:101px;
background-color:#C0C0C0;
border:1px solid #000000;
padding-left:2px;
overflow:visible;
display:none;
}

span.spanMatchText
{
text-decoratin:underline;
font-weight:bold;
}

span.spanNormalElement 
{
background:#C0C0C0;
}

span.spanHighElement
{
background:!000040;
color:white;
cursor:pointer;
}

?

?

jsp文件:

<%@ page contentType="text/html; charset=GBK" language="java" import="com.exp.fcl.syscfg.SystemConfig" errorPage="/framework-resources/exp-error.jsp"%>

<%@ taglib uri="/WEB-INF/lib/exp-taglib.tld" prefix="exp"%>
<exp:spage id="" path="ems.test001.listener" />
<!--页面与事件监听器类粘合页面-->
<%@ include file="/WEB-INF/include/BasePage.inc"%>
<% String contextPath = request.getContextPath(); %>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=GBK">
		<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
		<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
		<META HTTP-EQUIV="Expires" CONTENT="0">
		
		<title>新增物品</title>
		
		<link type="text/css" rel="stylesheet" href="<%=contextPath%>/framework/sys-resources/css/textdown.css">
		<script LANGUAGE="JavaScript" src="<%=contextPath%>/framework/sys-resources/js/textdown.js"></script>
		
		<jsp:include page="/WEB-INF/include/Resources.jsp">
			<jsp:param name="resourcelet" value="querypage" />
		</jsp:include>
	</head>
    <script type="text/javascript">



    function doAction(){
        form1.action = "test_001.jsp?actionName=doTest";
        form1.submit();
    }
    </script>
	<body id="main_content">
	
		<exp:message />
		<form name="form1" method="post" action="">
			
			<input type="hidden" name="backurl" value="<%=this.value("backurl")%>" />
			<input type="hidden" name="title" value="公司信息">
			<input type="hidden" name="subtitle" value="日期:<%=(new Date()).toLocaleString()%>">
			<input type="hidden" name="fields" value="COMPANYID-公司编码|COMPANYNAME-公司名称|CMP_GRADE_LABEL-公司级别|PROVIDER_NAME-供应商|ORDER_NUMBERS-订单号|PROJECT_NAME-工程项目">

			<table class="common_table">
				<tr>
					<td class="head">
						<span id="nav">测试页面</span> 
						<span id="help" onclick="return showHelp('');"></span>
					</td>
				</tr>
				<tr>
					<td class="main">
						<table width="100%">
							<tr>
								<td width="17%" height="25" align="right">物品名称:</td>
								<td width="33%">
									<input type="text" class='main_Input' name="txtUserInput" id="txtUserInput" value="" style="width:200px" onKeyup="GiveOptions();">
								    <input type="text" class='main_Input' name="txtUserInput1" id="txtUserInput1" value="" style="width:200px">
                                    <input type="text" name="txtIgnore" style="display:none" />
								    
								</td>
								<td width="17%" align="right"></td>
								<td><input type="button" name="a" value = "aaaaa" onClick="doAction()" /></td>
							</tr>
						</table>
					</td>
				</tr>
			</table>
		</form>
	</body>
</html>

?

?

JSP类文件

<%@ page contentType="text/html; charset=GBK"%>
<%@page import="com.xub.ems.test.Listener.Test001Listener"%>

<%
response.setContentType("text/xml");
response.setHeader("Cache-Control", "no-cache");

StringBuffer xml = new StringBuffer();
xml.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
xml.append("<message>\n");
xml.append("<data>\n");
    xml.append("<info>" + "one" + "</info>\n");
    xml.append("<info1>" + "1" + "</info1>\n");
    xml.append("</data>\n");
    xml.append("<data>\n");
    xml.append("<info>" + "南京华开电气设备有限公司" + "</info>\n");
    xml.append("<info1>" + "11" + "</info1>\n");
    xml.append("</data>\n");
xml.append("</message>");

//PrintWriter out = response.getWriter();
out.write(xml.toString());
 %>


?

  相关解决方案