经过一个星期的煎熬,终于把基于Ajax的输入提示功能实现了。太痛苦了,写Javascript的感觉就跟用NotePad来写代码一样,没有智能提示、弱类型、难调试……总之是太折磨人了。
本来自己写了一个比较简单的,但是由于我的页面上需要多个输入框,还要可以动态增加输入框,要把传回来的结果set入多个输入框,由于是使用的Struts标签库,<html:text>还没有id属性,让这个问题复杂了不少。
需求是这样的:
有一个页面,需要录入货品信息,货品有id,编号,名称,单位,单价,规格等属性,每个货品信息在表格中有一行,一行中有多个输入框,用于输入货品信息。在输入货品编号的时候,应该访问后台的商品信息库,寻找以前是否有输入过该编号的货品,如果有,把编号返回。支持用鼠标点击,键盘回车等方法选择货品,选择后应该把货品信息显示到各个输入框中供用户修改。如果该货品在商品信息库中标记为敏感商品,要作出提示。一个编号可以有多个货品。
改了3天代码,终于决定破釜沉舟,删掉重做。修改了《Ajax in Action》中的代码,Ajax in Action中的代码有些地方有错误,不仔细检查一遍还真不太容易发现。书中后台使用C#,前台是使用Rico来向某个url传参数的形式进行Ajax通信。返回的response类似:
<ajax-response>
<response type='object' id='field1_updater'>
<matches>
<text>XXX</text>
<value>XXX</value>
</matches>
</response>
</ajax-response>不过我不想写JSP或者Servlet,所以用了DWR,直接用spring中的BO把结果传回来:

cargobaseService.getByNumberAndCompany(this.lastRequestString,this.company,function(ajaxResponse)
{
//
});cargobaseService是使用DWR创建的Javascript对象:
dwr.xml:
<dwr>
<allow>
<create creator="spring" javascript = "cargobaseService">
<param name="beanName" value="cargobaseService"/>
</create>
<convert match="com.gdnfha.atcs.cargobase.model.*" converter="bean"></convert>
</allow>
</dwr>

返回为下面对象的数组

var cargoModel =
{
cargoCompany: XXX,
cargoCurrency: XXX,
cargoDestination: XXX,
cargoId: XXX,
cargoImpose: XXX,
cargoName: XXX,
cargoNumber: XXX,
cargoSize: XXX,
cargoUnit: XXX,
cargoUnitPrice: XXX,
sensitive: true|false
} Javascript代码如下:
TextSuggest = Class.create();


TextSuggest.prototype =
{
//构造函数

initialize: function(anId,company, url, options)
{
this.id = anId;
this.company = company;
var browser = navigator.userAgent.toLowerCase();
this.isIE = browser.indexOf("msie") != -1;
this.isOpera = browser.indexOf("opera")!= -1;
this.textInput = $(this.id);
this.suggestions = new Array();
this.setOptions(options);
this.injectSuggestBehavior();
},
//设置参数

setOptions: function(options)
{

this.options =
{
suggestDivClassName: 'suggestDiv',
suggestionClassName: 'suggestion',
matchClassName : 'match',
matchTextWidth : true,
selectionColor : '#b1c09c',
matchAnywhere : false,
ignoreCase : false,
count : 10

}.extend(options ||
{});
},
//注入输入提示行为

injectSuggestBehavior: function()
{

if ( this.isIE )
this.textInput.autocomplete = "off";
//创建控制器
var keyEventHandler = new TextSuggestKeyHandler(this);
//主要是为了避免在按回车的时候把表单提交
new Insertion.After( this.textInput,
'<input type="text" id="'+this.id+'_preventtsubmit'+'" style="display:none"/>' );
new Insertion.After( this.textInput,
'<input type="hidden" name="'+this.id+'_hidden'+'" id="'+this.id+'_hidden'+'"/>' );
//创建div层
this.createSuggestionsDiv();
},
//处理输入信息

handleTextInput: function()
{
var previousRequest = this.lastRequestString;
this.lastRequestString = this.textInput.value;
if ( this.lastRequestString == "" )
this.hideSuggestions();

else if ( this.lastRequestString != previousRequest )
{
//访问数据源
this.sendRequestForSuggestions();
}
},
//选择框上移

moveSelectionUp: function()
{

if ( this.selectedIndex > 0 )
{
this.updateSelection(this.selectedIndex - 1);
}
},
//选择框下移

moveSelectionDown: function()
{

if ( this.selectedIndex < (this.suggestions.length - 1) )
{
this.updateSelection(this.selectedIndex + 1);
}
},
//更新当前选择信息

updateSelection: function(n)
{
var span = $( this.id + "_" + this.selectedIndex );

if ( span )
{
//消除以前的样式
span.style.backgroundColor = "";
}
this.selectedIndex = n;
var span = $( this.id + "_" + this.selectedIndex );

if ( span )
{
//更新新样式
span.style.backgroundColor = this.options.selectionColor;
}
},
//发送请求

sendRequestForSuggestions: function()
{

if ( this.handlingRequest )
{
this.pendingRequest = true;
return;
}

this.handlingRequest = true;
this.callDWRAjaxEngine();
},

//使用DWR访问后台

callDWRAjaxEngine: function()
{
//保存当前对象指针
var tempThis = this;

cargobaseService.getByNumberAndCompany(this.lastRequestString,this.company,function(ajaxResponse)
{
tempThis.suggestions = ajaxResponse;

if ( tempThis.suggestions.length == 0 )
{
tempThis.hideSuggestions();
$( tempThis.id + "_hidden" ).value = "";

}else
{
tempThis.updateSuggestionsDiv();
tempThis.showSuggestions();
tempThis.updateSelection(0);

分享到:
相关推荐
6. **兼容性**:jQuery Unobtrusive Ajax与jQuery库无缝集成,因此可以利用jQuery提供的各种便利函数和选择器。 使用jQuery Unobtrusive Ajax,开发者可以快速地构建动态、响应式的Web应用,提供更好的用户体验。...
javascript实例应用---Ajax与XMLHttpRequest.rarjavascript实例应用---Ajax与XMLHttpRequest.rarjavascript实例应用---Ajax与XMLHttpRequest.rar
`xe-ajax` 通常与 `vxe-ajax` 和 `xeajax` 标签一起出现,可能意味着它与某些基于 XE 组件库(如 VxeTable)相关的项目协同工作。这些组件库可能依赖 `xe-ajax` 来处理表格数据的加载、编辑和保存等操作,提供了一站...
总的来说,“Ajax实现输入提示”是一个涵盖了前端JavaScript交互、Ajax通信、服务器端处理和用户体验设计等多个方面的综合实践。通过熟练掌握这些知识点,开发者可以创建出更加智能、高效的Web应用。
【购物车-Ajax实现实例】是一个典型的电子商务网站功能模块,用于模拟用户在虚拟商城中添加、删除商品至购物车的过程。在这个实例中,我们主要关注的是如何利用Ajax技术实现页面无刷新更新,以及与服务器端JSP进行...
Ajax-JavaScript-AJAX-JSON.zip,基本ajax json jquery,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载网页的情况...
Vxe-AJAX 或许是 Xe-AJAX 的一个扩展或优化版本,提供了更多特性和更好的与Vue集成。 在"cdn-mock-demo"这个项目实例中,我们可以预期它包含以下部分: 1. **项目结构**:通常会有一个`src`目录,包含`components`...
【标题】"jboss-ajax4jsf-1.1.1-src" 是一个开源项目,主要涉及Ajax4jsf框架的源代码版本,版本号为1.1.1。Ajax4jsf是针对JavaServer Faces (JSF) 技术的一个扩展,它允许开发者在JSF应用中无缝集成Ajax功能,提升...
包含的“dynatrace-AJAX-edition-4.2.0.1528.msi”是Windows Installer文件,用于在Windows操作系统上安装Dynatrace AJAX Edition。安装过程通常包括接受许可协议、选择安装路径、配置初始设置等步骤。安装完成后,...
Ajax-ember-ajax.zip,在ember应用程序中发出ajax请求的服务,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载网页的...
在这个名为"struts-ajax.zip"的压缩包中,我们可以推测它包含了使用Struts框架与Ajax技术(通过JavaScript实现)进行开发的一些实例和资源。 Struts是一个开源的Java MVC(Model-View-Controller)框架,主要用于...
`xe-ajax3.0.9.js`是一个独立且开源的JavaScript库,专注于提供高效、易用和可扩展的Ajax请求功能。这个库不依赖任何特定的前端框架,如jQuery或Vue,使得它在各种开发环境中都能灵活运用。`xe-ajax`的设计理念是...
【标题】"源代码-AJAX+ASP实现输入框提示.zip"揭示了这个压缩包包含了一个使用AJAX(异步JavaScript和XML)技术与ASP(Active Server Pages)结合的源代码示例,其目的是实现输入框的智能提示功能。这种功能在网页...
在这个项目中,“ssm_ajaxsubmit-ajax提交-模态对话框-ajax上传文件”涉及了几个关键的技术点,主要包括:Ajax异步提交、模态对话框以及文件上传。下面将详细解析这些知识点。 1. **Ajax异步提交** Ajax...
Ajax-magento2-ajax-cart-quick.zip,magento 2 ajax购物车扩展插件提供舒适的购物体验。客户可以很容易地选择可配置的选项并在弹出窗口中编辑项目,而不会浪费重新加载页面的时间。,ajax代表异步javascript和xml。它...
"menu-accordeon-ajax" 是一个专门设计的交互式菜单系统,它结合了美观与实用性,为用户提供了一种高效且吸引人的导航体验。在网页设计中,这种类型的菜单通常被称为折叠式或手风琴菜单,因为它能以紧凑的形式显示多...
在`django-ajax-selects`中,Ajax被用来实现在用户输入时实时查询和填充下拉选择框。 **django-ajax-selects** `django-ajax-selects` 是一个Django应用,它扩展了Django的表单字段,提供了与后端数据库交互的实时...
总结一下,xe-ajax 的 Mock 虚拟服务允许我们在前端开发中快速创建和使用模拟 API,通过配置 JSON 文件定义响应数据,结合 JavaScript 逻辑实现动态数据生成。通过这种方式,我们可以独立于后端进行前端开发和测试,...
本示例项目"一个ExJS-AJAX-MYSQL实现的登录示例"旨在展示如何使用这些技术来创建一个用户登录系统。以下是对这些关键技术的详细说明: **ExtJS** ExtJS是一个基于JavaScript的前端框架,用于构建富互联网应用(RIA...
- **AJAX入门--概述XMLHttpRequest-AJAX编程教程.txt**:初级级别的教程,适合初学者了解AJAX和XMLHttpRequest的入门知识。 - **TestInTeaching**:可能是一个教学测试项目,用于实践和检验学习成果。 通过这些...