日期:2014-05-16 浏览次数:20368 次
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Type Ahead</title> <%@ include file="/views/js/importjs.jsp" %> <script type="text/javascript"> window.onload = function(){ var elemSpan = document.createElement("span"); elemSpan.id = "spanOutput"; elemSpan.className = "spanTextDropdown"; document.body.appendChild(elemSpan); /* 用来给文本框设置属性,用定制的对象给这个属性赋值,这样就能够在整个脚本中引用它来获取值,而不是使用全局变量来获取值 */ document.getElementById('txtUserInput').obj = SetProperties(document.getElementById('txtUserInput'), $('txtUserValue'), 'TypeAheadAction-getContent.action', true, true, true, true, "No matching Data", false, null); }; /** * 将属性分配给对象 * @param {Object} xElem 要分配输入前提示功能的文本框 * @param {Object} xHidden 用来保存值的hidden元素 * @param {Object} xserverCode 服务器端URL * @param {Object} xignoreCase 搜索过程中忽略大小写? * @param {Object} xmatchAnywhere 字符串中匹配任意位置的文本? * @param {Object} xmatchTextBoxWidth 匹配文本框宽度? * @param {Object} xshowNoMatchMessage 显示无匹配消息? * @param {Object} xnoMatchingDataMessage 用于显示的消息 * @param {Object} xuseTimeout 选项显示一段时间后是否隐藏? * @param {Object} xtheVisibleTime span保持打开的时间 */ function SetProperties(xElem, xHidden, xserverCode, xignoreCase, xmatchAnywhere, xmatchTextBoxWidth, xshowNoMatchMessage, xnoMatchingDataMessage, xuseTimeout, xtheVisibleTime){ /** * 对于xignoreCase,xmatchAnywhere的处理,没有在属性中保持布尔值,而是保存了等价的正则表达式 * 在正则表达式中使用i来忽略大小写,使用^来匹配字符串的开始位置 * 在这里设置正则表达式参数,而不是在每次调用函数时使用if语句,对我们来说更加容易些 */ var props = { elem: xElem, hidden: xHidden, serverCode: xserverCode, regExFlags: ((xignoreCase) ? "i" : ""), regExAny: ((xmatchAnywhere) ? "" : "^"), matchAnywhere: xmatchAnywhere, matchTextBoxWidth: xmatchTextBoxWidth, theVisibleTime: xtheVisibleTime, showNoMatchMessage: xshowNoMatchMessage, noMatchingDataMessage: xnoMatchingDataMessage, useTimeout: xuseTimeout }; /* 将事件处理函数分配给文本框 */ AddHandler(xElem); return props; } /** * 附加事件处理函数,监听用户的输入、是否离开了文本框 */ function AddHandler(objText){ /* 键盘按键释放 */ objText.onkeyup = GiveOptions; objText.onblur = function(){ if (this.obj.useTimeout) StartTimeout(); } /* Opera浏览器出发onkeyup事件处理函数的方式与其他浏览器不同。 * 当触发onkeyup事件时,Opera不会再包括当前按键的文本框中显示值 * 我们为Opera添加onkeypress事件处理函数纠正了这个问题 */ if (Browser.isOpera) { objText.onkeypress = GiveOptions; } } var arrOptions = new Array();/* 从服务器查询中获取的所有可用选项 */ var strLastValue = "";/* 文本框中包含的最后的字符串 */ var bMadeRequest;/* 请求是否已经发送到服务器,而不必持续发送附加的请求,该标志正对快速打字员,这样我们就不必操心使用像Google那样的超时设置了 */ var theTextBox;/* 保存对拥有焦点的文本框的引用 */ var objLastActive;/* 最后激活的文本框 ,如果用户切换了文本框,这个变量将用来确定数据集是否需要重新刷新。在一个拥有多个文本框的窗口中实现这个解决方案,就需要知道哪一个文本框拥有焦点 */ var currentValueSelected = -1;/* 作用于选择列表的selectedIndex类似,-1表示没有选项被选中 */ var bNoResults = false;/* 是否有结果?这样我们就不必费心去试图找到任何结果了 */ var isTi