`
sprite
  • 浏览: 63780 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用DWR实现搜索自动提示(二)

阅读更多
js 代码
  1. TextSuggest = Class.create();   
  2.   
  3. TextSuggest.prototype = {   
  4.     //构造函数   
  5.    initialize: function(elementId /*:HTMLInputElementId*/,oProvider /*:SuggestionProvider*/, options/*:cssStyle and display count  ect*/) {   
  6.       this.id          = elementId;        
  7.       this.provider    = oProvider;   
  8.       var browser      = navigator.userAgent.toLowerCase();   
  9.       this.isIE        = browser.indexOf("msie") != -1;   
  10.       this.isOpera     = browser.indexOf("opera")!= -1;   
  11.       this.isMozilla   = (browser.indexOf("gecko")!= -1 && browser.indexOf("mozilla")!= -1);   
  12.       this.textInput   = $(this.id);          
  13.       this.suggestions = new Array();   
  14.       this.setOptions(options);   
  15.       this.injectSuggestBehavior();   
  16.    },   
  17.     //设置参数   
  18.    setOptions: function(options) {   
  19.       this.options = {   
  20.          //层样式   
  21.          suggestDivClassName: 'suggestDiv',   
  22.          //选项样式   
  23.          suggestionClassName: 'suggestion',   
  24.          //匹配样式   
  25.          matchClassName     : 'match',   
  26.          //是否匹配输入框宽度   
  27.          matchTextWidth     : true,   
  28.          //选项颜色   
  29.          selectionColor     : '#b1c09c',   
  30.           //是否从头匹配   
  31.          matchAnywhere      : false,   
  32.          //是否忽略大小写   
  33.          ignoreCase         : false,   
  34.          //显示数目   
  35.          count              : 10,   
  36.           //隐藏字段的Id    
  37.          hiddenId           : ''                 
  38.       }.extend(options || {});   
  39.    },   
  40.     //注入输入提示行为   
  41.    injectSuggestBehavior: function() {   
  42.              
  43.       if ( this.isIE ||this.isMozilla){             
  44.           this.textInput.setAttribute('autocomplete','off');             
  45.       }   
  46.             
  47.     //创建控制器   
  48.       var keyEventHandler = new TextSuggestKeyHandler(this);   
  49.       //主要是为了避免在按回车的时候把表单提交 目前未能实现   
  50.       //new Insertion.After( this.textInput,'' );   
  51.      // new Insertion.After( this.textInput,'' );       
  52.       //创建div层   
  53.       this.createSuggestionsDiv();   
  54.    },      
  55.     //处理输入信息   
  56.    handleTextInput: function() {        
  57.      var previousRequest  = this.lastRequestString;        
  58.      this.lastRequestString =this.textInput.value.replace(/(^\s*)|(\s*$)/g, "");          
  59.      if ( this.lastRequestString == "" ||this.lastRequestString.length <=0 ){   
  60.           //如果有hidden的变量,要将变量置为空   
  61.          if(this.options.hiddenId != "" && this.options.hiddenId.length >0){               
  62.             $(this.options.hiddenId).value = "";                
  63.            }                   
  64.          this.hideSuggestions();    
  65.      }else if ( this.lastRequestString != previousRequest ){       
  66.           //访问数据源               
  67.         this.sendRequestForSuggestions();    
  68.      }            
  69.    },   
  70.     //选择框上移   
  71.    moveSelectionUp: function() {   
  72.       if ( this.selectedIndex > 0 ) {   
  73.          this.updateSelection(this.selectedIndex - 1);   
  74.       }   
  75.    },   
  76.     //选择框下移   
  77.    moveSelectionDown: function() {   
  78.       if ( this.selectedIndex < (this.suggestions.length - 1)  ) {   
  79.          this.updateSelection(this.selectedIndex + 1);   
  80.       }   
  81.    },   
  82.     //更新当前选择信息   
  83.    updateSelection: function(n) {   
  84.       var span = $( this.id + "_" + this.selectedIndex );   
  85.       if ( span ){   
  86.           //消除以前的样式   
  87.          span.style.backgroundColor = "";   
  88.       }   
  89.       this.selectedIndex = n;   
  90.       var span = $( this.id + "_" + this.selectedIndex );   
  91.       if ( span ){   
  92.           //更新新样式   
  93.          span.style.backgroundColor = this.options.selectionColor;   
  94.       }   
  95.    },   
  96.     //发送请求   
  97.    sendRequestForSuggestions: function() {   
  98.      if ( this.handlingRequest ) {   
  99.         this.pendingRequest = true;   
  100.         return;   
  101.      }   
  102.   
  103.      this.handlingRequest = true;   
  104.      this.callDWRAjaxEngine();   
  105.    },   
  106.   
  107.     //使用DWR访问后台   
  108.    callDWRAjaxEngine: function() {   
  109.            //清空以前的记录   
  110.            if(this.suggestions.length>0){   
  111.              this.suggestions = null;   
  112.            }             
  113.            //保存当前对象指针   
  114.            var tempThis = this;              
  115.            this.provider(this.lastRequestString,function(ajaxResponse){              
  116.             tempThis.suggestions = ajaxResponse;               
  117.               if ( tempThis.suggestions.length == 0 ) {   
  118.                   //如果有hidden的变量,要将变量置为空   
  119.                  if(tempThis.options.hiddenId != "" && tempThis.options.hiddenId.length >0){   
  120.                      $(tempThis.options.hiddenId).value = "";   
  121.                  }                   
  122.                  tempThis.hideSuggestions();                    
  123.                    
  124.               }else {                   
  125.                  tempThis.updateSuggestionsDiv();   
  126.                  tempThis.showSuggestions();   
  127.                  tempThis.updateSelection(0);                    
  128.               }   
  129.               tempThis.handlingRequest = false;   
  130.             if ( tempThis.pendingRequest ) {                     
  131.                  tempThis.pendingRequest    = false;                                                  
  132.                  tempThis.lastRequestString = this.textInput.value;                                  
  133.                  tempThis.sendRequestForSuggestions();   
  134.               }   
  135.            });   
  136.    },   
  137.    //显示信息   
  138.    setInputFromSelection: function() {        
  139.      var suggestion  = this.suggestions[ this.selectedIndex ];          
  140.      if(typeof(suggestion) != 'undefined'){   
  141.            //如果有hidden的变量,要将变量置赋值   
  142.           if(this.options.hiddenId != "" && this.options.hiddenId.length >0){          
  143.             $(this.options.hiddenId).value = suggestion.id;               
  144.            }            
  145.           this.textInput.value = suggestion.districtName;   
  146.                 
  147.        }        
  148.      this.hideSuggestions();        
  149.    },   
  150.       
  151.    //   
  152.    getLeft : function () /*:int*/ {   
  153.   
  154.      var oNode = this.textInput;   
  155.      var iLeft = 0;   
  156.      while(oNode.tagName != "BODY") {   
  157.        iLeft += oNode.offsetLeft;   
  158.        oNode = oNode.offsetParent;           
  159.     }   
  160.        
  161.     return iLeft;   
  162.   },   
  163.    getTop : function () /*:int*/ {   
  164.   
  165.      var oNode = this.textInput;   
  166.      var iTop = 0;   
  167.        
  168.      while(oNode.tagName != "BODY") {   
  169.         iTop += oNode.offsetTop;   
  170.         oNode = oNode.offsetParent;   
  171.      }   
  172.        
  173.      return iTop;   
  174.    },   
  175.     //显示层   
  176.    showSuggestions: function() {        
  177.       var divStyle = this.suggestionsDiv.style;    
  178.       if( divStyle.display != ''){   
  179.          this.positionSuggestionsDiv();               
  180.          divStyle.display = '';            
  181.       }                      
  182.       if(isIE){   
  183.          //创建与弹出div相同样式的iframe,来修复IE6及以下版本中div不能遮住select控件的bug            
  184.          if(!this.iframeSuggestions){   
  185.             this.iframeSuggestions = document.createElement("iframe");    
  186.             var iframeStyle = this.iframeSuggestions.style;    
  187.             iframeStyle.position ='absolute';   
  188.             iframeStyle.zIndex = 100;            
  189.             iframeStyle.top = divStyle.top;   
  190.             iframeStyle.left = divStyle.left;   
  191.             iframeStyle.width = divStyle.width;   
  192.             iframeStyle.height = this.suggestionsDiv.offsetHeight;                
  193.             iframeStyle.display = '';                    
  194.             this.textInput.parentNode.appendChild(this.iframeSuggestions);     
  195.          }             
  196.          var iframeStyle = this.iframeSuggestions.style;    
  197.          iframeStyle.position ='absolute';   
  198.          iframeStyle.zIndex = 100;            
  199.          iframeStyle.top = divStyle.top;   
  200.          iframeStyle.left = divStyle.left;   
  201.          iframeStyle.width = divStyle.width;   
  202.          iframeStyle.height = this.suggestionsDiv.offsetHeight;                
  203.          iframeStyle.display = '';            
  204.       }          
  205.          
  206.    },   
  207.     //定位层   
  208.    positionSuggestionsDiv: function() {         
  209.       var top = (this.getTop()+this.textInput.offsetHeight) ;   
  210.       var left = this.getLeft() ;   
  211.       var width = this.textInput.offsetWidth ;      
  212.           
  213.       var divStyle  = this.suggestionsDiv.style;   
  214.       divStyle.top  = top  + "px";   
  215.       divStyle.left = left + "px";   
  216.         
  217.       if ( this.options.matchTextWidth ){   
  218.         divStyle.width = width+ "px";    
  219.       }        
  220.        
  221.    },     
  222.     //隐藏层   
  223.    hideSuggestions: function() {   
  224.       this.suggestionsDiv.style.display = 'none';   
  225.       if(isIE){    
  226.         if(this.iframeSuggestions)   
  227.            this.iframeSuggestions.style.display = 'none';          
  228.       }         
  229.    },   
  230.     //创建层   
  231.    createSuggestionsDiv: function() {        
  232.         
  233.       this.suggestionsDiv = document.createElement("div");   
  234.       this.suggestionsDiv.className = this.options.suggestDivClassName;   
  235.          
  236.       var divStyle = this.suggestionsDiv.style;   
  237.       divStyle.position = 'absolute';   
  238.       divStyle.zIndex   = 101;   
  239.       divStyle.display  = "none";   
  240.       this.textInput.parentNode.appendChild(this.suggestionsDiv);            
  241.    },   
  242.     //更新层   
  243.    updateSuggestionsDiv: function() {   
  244.       this.suggestionsDiv.innerHTML = "";        
  245.       //如果有hidden变量,清空隐藏字段的值   
  246.      if(this.options.hiddenId != "" && this.options.hiddenId.length >0){   
  247.         $(this.options.hiddenId).value ="";   
  248.      }         
  249.       var suggestLines = this.createSuggestionSpans();   
  250.       for ( var i = 0 ; i < suggestLines.length ; i++ ){   
  251.         this.suggestionsDiv.appendChild(suggestLines[i]);          
  252.       }          
  253.    },   
  254.     //创建层中的选项span   
  255.    createSuggestionSpans: function() {   
  256.       var regExpFlags = "";   
  257.       if ( this.options.ignoreCase )   
  258.          regExpFlags = 'i';   
  259.       var startRegExp = "^";   
  260.       if ( this.options.matchAnywhere )   
  261.          startRegExp = '';   
  262.          //正则表达式匹配   
  263.       var regExp  = new RegExp( startRegExp + this.lastRequestString, regExpFlags );   
  264.       var suggestionSpans = new Array();   
  265.       for ( var i = 0 ; i < this.suggestions.length && i<this.options.count ; i++ )   
  266.          suggestionSpans.push( this.createSuggestionSpan( i, regExp ) )   
  267.   
  268.       return suggestionSpans;   
  269.    },   
  270.     //创建单个选项span   
  271.    createSuggestionSpan: function( n, regExp ) {   
  272.       var suggestion = this.suggestions[n];   
  273.   
  274.       var suggestionSpan = document.createElement("span");   
  275.       suggestionSpan.className = this.options.suggestionClassName;   
  276.       suggestionSpan.style.width   = '100%';   
  277.       suggestionSpan.style.display = 'block';   
  278.       suggestionSpan.id            = this.id + "_" + n;   
  279.       suggestionSpan.onmouseover   = this.mouseoverHandler.bindAsEventListener(this);   
  280.       suggestionSpan.onclick       = this.itemClickHandler.bindAsEventListener(this);   
  281.       var textValues = this.splitTextValues( suggestion.districtName+"",   
  282.                                              this.lastRequestString.length,   
  283.                                              regExp );   
  284.       var textMatchSpan = document.createElement("span");   
  285.       textMatchSpan.id            = this.id + "_match_" + n;   
  286.       textMatchSpan.className     = this.options.matchClassName;   
  287.       textMatchSpan.onmouseover   = this.mouseoverHandler.bindAsEventListener(this);   
  288.       textMatchSpan.onclick       = this.itemClickHandler.bindAsEventListener(this);   
  289.   
  290.       textMatchSpan.appendChild( document.createTextNode(textValues.mid) );   
  291.   
  292.       suggestionSpan.appendChild( document.createTextNode( textValues.start ) );   
  293.       suggestionSpan.appendChild( textMatchSpan );   
  294.       suggestionSpan.appendChild( document.createTextNode( textValues.end ) );   
  295.          
  296.       //把小区地址显示在小区名后面        
  297.       //suggestionSpan.appendChild(document.createTextNode("        "+suggestion.address ) );   
  298.       suggestionSpan.innerHTML+="    "+suggestion.address;   
  299.       return suggestionSpan;   
  300.    },   
  301.     //鼠标经过处理   
  302.    mouseoverHandler: function(e) {   
  303.       var src = e.srcElement ? e.srcElement : e.target;   
  304.       var index = parseInt(src.id.substring(src.id.lastIndexOf('_')+1));   
  305.       this.updateSelection(index);   
  306.    },   
  307.     //鼠标点击处理   
  308.    itemClickHandler: function(e) {   
  309.       this.mouseoverHandler(e);   
  310.       //鼠标点击把数据set入输入框!   
  311.       this.setInputFromSelection();   
  312.       this.hideSuggestions();   
  313.    },   
  314.     //分拆字符串   
  315.    splitTextValues: function( text, len, regExp ) {   
  316.       var startPos  = text.search(regExp);   
  317.       var matchText = text.substring( startPos, startPos + len );   
  318.       var startText = startPos == 0 ? "" : text.substring(0, startPos);   
  319.       var endText   = text.substring( startPos + len );   
  320.       return { start: startText, mid: matchText, end: endText };   
  321.    },   
  322.       
  323.    //如果只需要显示列表里的文字而已 可以调用此方法   
  324.    getElementContent: function(element) {   
  325.       return element.firstChild.data;   
  326.    }   
  327. };  

 

相关推荐

    DWR实现Google自动提示功能

    在这个实例中,“DWR实现Google自动提示功能”是利用DWR框架来构建一个类似于Google搜索框的自动提示功能,用户在输入框中输入时,后台会实时地根据输入内容提供相关的建议,无需页面刷新。 一、DWR框架详解: DWR...

    搜索自动提示列表的dwr实现实例

    3. **DWR实现搜索提示的步骤** - **创建Java后台服务**:首先,你需要在Java后端编写一个服务接口,该接口接收用户的输入并返回相关的搜索建议。这可能涉及到数据库查询或者其他数据源的操作。 - **配置DWR**:在...

    搜索提示框的自动显示dwr实现实例

    在这个“搜索提示框的自动显示DWR实现实例”中,我们将探讨如何利用DWR技术创建一个智能、高效的搜索输入框,当用户输入时,自动显示相关建议,提升用户体验。 首先,我们需要理解DWR的基本工作原理。DWR通过在后台...

    dwr实现局部刷新

    4. **AutoComplete**:DWR提供了自动完成功能,用于在客户端输入框中动态提示可能的匹配项,例如在搜索框中输入内容时显示建议列表。 5. **Echo**:DWR的Echo功能允许在后台执行长时间的任务,同时保持与客户端的...

    dwr实现聊天室+级连+搜索提示

    在这个“dwr实现聊天室+级连+搜索提示”的项目中,我们将探讨以下几个关键知识点: 1. **DWR聊天室实现**: 聊天室的实现通常涉及客户端和服务器端的实时数据交换。DWR通过创建JavaScript对象(Callee)来映射...

    纯JSP+DWR实现三级联动下拉选择菜单 实现无刷新联动 DWR判断用户是否存在 ajax二级联动菜单 DWR操作数据库模拟实现Google搜索效果

    本示例主要展示了如何使用纯JSP和Direct Web Remoting (DWR)技术来构建一个功能丰富的用户界面,其中包括三级联动下拉选择菜单、无刷新联动、用户存在性判断以及模拟Google搜索效果的功能。DWR是一种JavaScript库,...

    Ajax dwr框架实现自动补全功能

    在本文中,我们将深入探讨如何使用Ajax、Direct Web Remoting (DWR) 框架以及Hibernate ORM工具来实现一个自动补全功能。这个功能类似于百度搜索引擎中的输入提示,能够根据用户输入的字符动态地提供可能的搜索建议...

    基于JQuery和DWR的自动补全

    综上所述,结合JQuery和DWR实现的自动补全功能,不仅提升了用户输入体验,也为开发者提供了一种高效的数据交互手段。在实际开发中,可以根据项目需求灵活调整和优化,以达到最佳效果。在压缩包文件"buquan"中可能...

    DWR框架实用案例

    一旦服务器完成查询,它会将结果返回给客户端,DWR会自动将这些数据更新到页面的JavaScript变量中,从而实现在用户输入过程中动态更新下拉提示列表。 实现这个功能的具体步骤包括: 1. **配置DWR**:在Web应用中...

    DWR 含架包

    3. **AutoComplete**: DWR支持自动完成功能,常用于输入框中智能提示,如搜索建议等。 4. **CORS(Cross-Origin Resource Sharing)**: DWR支持跨域资源共享,允许来自不同源的HTTP请求访问同一资源,扩展了Web应用...

    Dwr+AutoComplete+pinyin4j 自动匹配(中文,拼音)

    标题 "Dwr+AutoComplete+pinyin4j 自动匹配(中文,拼音)" 提到的技术栈涉及了三个关键部分:DWR(Direct Web Remoting)、AutoComplete(自动完成)和pinyin4j。这些技术在Web开发中都有特定的应用场景。 DWR是一...

    dwr开发指南(中文)

    - **AutoComplete**:提供自动完成功能,常用于搜索框,根据用户输入的字符动态提示可能的匹配项。 - **Remote JavaScript**:允许在服务器端生成并执行JavaScript代码,进一步增强了动态性。 4. **DWR的安装与...

    dwr官方资料和搜集资料大全

    Direct Web Remoting (DWR) 是一个开源Java库,它允许JavaScript在Web浏览器中与服务器端的Java对象进行交互,从而实现动态、实时的Web应用。这个“dwr官方资料和搜集资料大全”包含了丰富的资源,帮助开发者深入...

    DWR框架开发详解从入门到精通

    - **AutoComplete**:DWR提供了自动完成功能,常用于搜索框的智能提示。 在深入学习DWR的过程中,你可能还会遇到如何处理异步调用、错误处理、性能优化等方面的问题。通过阅读"DWR框架开发详解从入门到精通"这本书...

    几行代码的二级联动和类似goolge的输入下拉提示

    在实现二级联动和Google输入下拉提示的过程中,DWR可以发挥重要作用。首先,我们可以创建两个Java后台服务,分别处理一级和二级数据的查询。例如,一个服务返回省份列表,另一个服务接收省份ID作为参数,返回对应的...

    ajax常用框架集

    - **Auto-Complete**:DWR提供了自动完成功能,常用于搜索框的实时提示。 2. **DWR的工作原理** - **Reverse Ajax**:DWR利用了HTTP长连接,使得服务器可以主动向客户端推送数据。 - **JavaScript与Java的映射**...

    快速输入地址

    标题“快速输入地址”可能指的是在网页应用中实现快速、自动完成的地址输入功能,这通常涉及到JavaScript和服务器端的交互。在这个场景下,DWR(Direct Web Remoting)可能是被使用的工具,它是一个开源Java框架,...

    像google的文本框的ajax例子

    标题 "像Google的文本框的Ajax例子" 涉及的是使用Ajax技术来实现类似Google搜索框的实时提示功能。Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它通过...

    10Y2 asp.netPPT第十章的

    DWR通过自动处理JavaScript和Java之间的转换,使得在Web 2.0应用中实现动态交互变得更加简单。 **Web 2.0的特点**: 1. **内容聚合**:通过RSS订阅,用户可以聚合来自多个来源的信息。 2. **用户贡献内容**:用户...

Global site tag (gtag.js) - Google Analytics