`
richardeee
  • 浏览: 18353 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Javascript噩梦-Ajax实现输入提示的调整与配置

阅读更多
经过一个星期的煎熬,终于把基于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);
分享到:
评论

相关推荐

    jquery.unobtrusive-ajax.rar

    6. **兼容性**:jQuery Unobtrusive Ajax与jQuery库无缝集成,因此可以利用jQuery提供的各种便利函数和选择器。 使用jQuery Unobtrusive Ajax,开发者可以快速地构建动态、响应式的Web应用,提供更好的用户体验。...

    xe-ajax3.4.13.js 封装 fetch 异步请求 javascript 库

    `xe-ajax` 通常与 `vxe-ajax` 和 `xeajax` 标签一起出现,可能意味着它与某些基于 XE 组件库(如 VxeTable)相关的项目协同工作。这些组件库可能依赖 `xe-ajax` 来处理表格数据的加载、编辑和保存等操作,提供了一站...

    数据操作后,页面alert提示例子2-ajax实现

    总结来说,"数据操作后,页面alert提示例子2-ajax实现"是关于利用Ajax进行后台数据操作,并通过JavaScript处理服务器响应,以`alert()`显示操作结果的实例。通过理解和应用这样的技术,开发者可以提高网站的用户体验...

    动态菜单-Ajax实现

    在“动态菜单-Ajax实现”这个实例中,主要涉及以下技术: 1. **Ajax**:Ajax的核心是XMLHttpRequest对象,它负责在后台与服务器进行通信。在这个例子中,当页面加载或特定事件触发时,Ajax请求会发送到服务器,请求...

    ajax实现输入提示(支持中文)

    本文将深入探讨如何使用Ajax实现输入提示功能,尤其关注支持中文的情况。 一、Ajax基础 Ajax的核心是JavaScript对象XMLHttpRequest,它允许在不刷新整个页面的情况下与服务器进行通信。通过创建XMLHttpRequest对象...

    JS正则表达式详解-JavaScript-AJAX

    JS正则表达式详解-JavaScript-AJAX

    vue+vue-router+resquirejs+xe-ajax+mock 项目例子

    Vxe-AJAX 或许是 Xe-AJAX 的一个扩展或优化版本,提供了更多特性和更好的与Vue集成。 在"cdn-mock-demo"这个项目实例中,我们可以预期它包含以下部分: 1. **项目结构**:通常会有一个`src`目录,包含`components`...

    无限级联动菜单-AJAX版&JavaScript版

    在这个"无限级联动菜单-AJAX版&JavaScript版"中,我们将深入探讨如何使用AJAX和JavaScript技术实现这种功能。 AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的...

    JQUERY插件--ajax搜索

    jQuery 插件利用 Ajax(异步 JavaScript 和 XML)技术,可以实现在用户输入时动态搜索并显示结果,极大地提高了用户的交互体验。本篇文章将深入探讨 jQuery 的 Ajax 搜索功能及其核心实现。 ### 一、Ajax 基础 ...

    ---Ajax下拉提示

    Ajax下拉提示是一种常见的前端交互技术,用于提升用户体验,特别是在数据输入和搜索场景中。它利用Ajax(异步JavaScript和XML)技术从服务器获取数据,并在用户输入时动态更新下拉选项,提供实时的建议或搜索结果。...

    Ajax-ember-ajax.zip

    Ajax-ember-ajax.zip,在ember应用程序中发出ajax请求的服务,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载网页的...

    struts-ajax.zip_ajax struts _javascript_struts ajax_struts-aj_ti

    在这个名为"struts-ajax.zip"的压缩包中,我们可以推测它包含了使用Struts框架与Ajax技术(通过JavaScript实现)进行开发的一些实例和资源。 Struts是一个开源的Java MVC(Model-View-Controller)框架,主要用于...

    xe-ajax3.0.9.js

    `xe-ajax3.0.9.js`是一个独立且开源的JavaScript库,专注于提供高效、易用和可扩展的Ajax请求功能。这个库不依赖任何特定的前端框架,如jQuery或Vue,使得它在各种开发环境中都能灵活运用。`xe-ajax`的设计理念是...

    源代码-AJAX+ASP实现输入框提示.zip

    【标题】"源代码-AJAX+ASP实现输入框提示.zip"揭示了这个压缩包包含了一个使用AJAX(异步JavaScript和XML)技术与ASP(Active Server Pages)结合的源代码示例,其目的是实现输入框的智能提示功能。这种功能在网页...

    jQuery-ajax-用户名异步请求

    Ajax,即Asynchronous JavaScript and XML,允许我们在不刷新整个页面的情况下与服务器交换数据并更新部分网页内容,提供更流畅的用户体验。 在“jQuery-ajax-用户名异步请求”这个场景中,我们可能是在设计一个...

    Jquery AutoComplete组件+Ajax实现搜索框输入提示功能小记

    本文主要介绍如何使用Jquery AutoComplete组件与Ajax技术来实现搜索框的实时输入提示功能。这种功能能够显著提升用户的交互体验,尤其是在需要大量数据检索的应用场景下。 #### 背景技术及术语解释 - **JQuery**:...

    PyPI 官网下载 | django-ajax-selects-1.9.0.tar.gz

    在`django-ajax-selects`中,Ajax被用来实现在用户输入时实时查询和填充下拉选择框。 **django-ajax-selects** `django-ajax-selects` 是一个Django应用,它扩展了Django的表单字段,提供了与后端数据库交互的实时...

    dynatrace-AJAX-edition-4.2.0.1528.zip

    包含的“dynatrace-AJAX-edition-4.2.0.1528.msi”是Windows Installer文件,用于在Windows操作系统上安装Dynatrace AJAX Edition。安装过程通常包括接受许可协议、选择安装路径、配置初始设置等步骤。安装完成后,...

    一个exjs-ajax-mysql实现的登录示例

    本示例项目"一个ExJS-AJAX-MYSQL实现的登录示例"旨在展示如何使用这些技术来创建一个用户登录系统。以下是对这些关键技术的详细说明: **ExtJS** ExtJS是一个基于JavaScript的前端框架,用于构建富互联网应用(RIA...

    AJAX基础教程-AJAX编程(Javascript实现).rar

    - **AJAX入门--概述XMLHttpRequest-AJAX编程教程.txt**:初级级别的教程,适合初学者了解AJAX和XMLHttpRequest的入门知识。 - **TestInTeaching**:可能是一个教学测试项目,用于实践和检验学习成果。 通过这些...

Global site tag (gtag.js) - Google Analytics