程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> 用js實現輸入提示(自動完成)

用js實現輸入提示(自動完成)

編輯:J2EE

以前也寫過一個jQuery的這種插件 ,但是很多地方根本不用jQuery,這個功能也有很多其它庫支持,但是為了用這個功能而加載很多JS插件,這樣效率明顯下降了很多,而且這個東西平時也很常用,所以一決心自己寫了個相對比較獨立的。

完成有以下功能:

輸入字符會把以輸入字符開頭的提示出來。

支持上下方向鍵選擇提示選項,支持循環

支持綁定一個數組提示,支持AJax傳遞輸入框值請求數據。

支持多個選擇的dom元素一塊綁定數據實現輸入提示。各dom元素也可以單獨綁定自己的數據實現輸入提示,互不影響。

支持中文。

首先是JS的核心部分,其各部分都有較詳細的說明,代碼如下:

vIEw source print ?

  1. ;( function (window){
  2. /* 插件開始 */
  3. var autoComplete= function (o){
  4. var handler=( function (){
  5. var handler= function (e,o){ return new handler.prototype.init(e,o); }; /* 為每個選擇的dom都創建一個相對應的對象,這樣選擇多個dom時可以很方便地使用 */
  6. handler.prototype={
  7. e: null , o: null , timer: null , show:0, input: null , popup: null ,
  8. init: function (e,o){ /* 設置初始對象 */
  9. this .e=e, this .o=o,
  10. this .input= this .e.getElementsByTagName( this .o.input)[0],
  11. this .popup= this .e.getElementsByTagName( this .o.popup)[0],
  12. this .initEvent(); /* 初始化各種事件 */
  13. },
  14. match: function (quickExpr,value,source){ /* 生成提示 */
  15. var li = null ;
  16. for ( var i in source){
  17. if ( value.length>0 && quickExpr.exec(source[i])!= null ){
  18. li = document.createElement( 'li' );
  19. li.innerHtml = '' +source[i]+ 'a>' ;
  20. this .popup.appendChild(li);
  21. }
  22. }
  23. if ( this .popup.getElementsByTagName( 'a' ).length)
  24. this .popup.style.display= 'block' ;
  25. else
  26. this .popup.style.display= 'none' ;
  27. },
  28. ajax: function (type,url,quickExpr,search){ /* AJax請求遠程數據 */
  29. var xhr = window.ActiveXObject ? new ActiveXObject( "Microsoft.XMLHTTP" ) : new XMLHttpRequest();
  30. xhr.open(type,url, true ); /* 同異步在此修改 */
  31. xhr.setRequestHeader( "Content-Type" , "application/x-www-form-urlencoded" );
  32. var that= this ;
  33. xhr.onreadystatechange = function (){
  34. if (xhr.readyState==4) {
  35. if (xhr.status==200) {
  36. var data = eval(xhr.responseText);
  37. that.match(quickExpr,search,data); /* 相同於成功的回調函數 */
  38. } else {
  39. alert( "請求頁面異常!" ); /* 請求失敗 */
  40. }
  41. }
  42. };
  43. xhr.send( null );
  44. },
  45. fetch: function (AJax,search,quickExpr){
  46. var that= this ;
  47. this .ajax(ajax.type,AJax.url+search,quickExpr,search);
  48. },
  49. initEvent: function (){ /* 各事件的集合 */
  50. var that= this ;
  51. this .input.onfocus = function (){
  52. if ( this .inputValue) this .value = this .inputValue;
  53. var value= this .value, quickExpr=RegExp( '^' +value, 'i' ), self= this ;
  54. var els = that.popup.getElementsByTagName( 'a' );
  55. if (els.length>0) that.popup.style.display = 'block' ;
  56. that.timer=setInterval( function (){
  57. if (value!=self.value){ /* 判斷輸入內容是否改變,兼容中文 */
  58. value=self.value;
  59. that.popup.innerHtml= '' ;
  60. if (value!= '' ){
  61. quickExpr=RegExp( '^' +value);
  62. if (that.o.source) that.match(quickExpr,value,that.o.source);
  63. else if (that.o.ajax) that.fetch(that.o.AJax,value,quickExpr);
  64. }
  65. }
  66. },200);
  67. };
  68. this .input.onblur = function (){ /* 輸入框添加事件 */
  69. if ( this .value!= this .defaultValue) this .inputValue = this .value;
  70. clearInterval(that.timer);
  71. var current=-1; /* 記住當前有焦點的選項 */
  72. var els = that.popup.getElementsByTagName( 'a' );
  73. var len = els.length-1;
  74. var aClick = function (){
  75. that.input.inputValue = this .firstChild.nodeValue;
  76. that.popup.innerHtml= '' ;
  77. that.popup.style.display= 'none' ;
  78. that.input.focus();
  79. };
  80. var aFocus = function (){
  81. for ( var i=len; i>=0; i--){
  82. if ( this .parentNode===that.popup.children[i]){
  83. current = i;
  84. break ;
  85. }
  86. }
  87. //that.input.value = this.firstChild.nodeValue;
  88. for ( var k in that.o.elemCSS.focus){
  89. this .style[k] = that.o.elemCSS.focus[k];
  90. }
  91. };
  92. var aBlur= function (){
  93. for ( var k in that.o.elemCSS.blur)
  94. this .style[k] = that.o.elemCSS.blur[k];
  95. };
  96. var aKeydown = function (event){
  97. eventevent = event || window.event; /* 兼容IE */
  98. if (current === len && event.keyCode===9){ /* tab鍵時popup隱藏 */
  99. that.popup.style.display = 'none' ;
  100. } else if (event.keyCode==40){ /* 處理上下方向鍵事件方便選擇提示的選項 */
  101. current++;
  102. if (current<-1) current=len;
  103. if (current>len){
  104. current=-1;
  105. that.input.focus();
  106. } else {
  107. that.popup.getElementsByTagName( 'a' )[current].focus();
  108. }
  109. } else if (event.keyCode==38){
  110. current--;
  111. if (current==-1){
  112. that.input.focus();
  113. } else if (current<-1){
  114. current = len;
  115. that.popup.getElementsByTagName( 'a' )[current].focus();
  116. } else {
  117. that.popup.getElementsByTagName( 'a' )[current].focus();
  118. }
  119. }
  120. };
  121. for ( var i=0; i<els.length; i++){ /* 為每個選項添加事件 */
  122. els[i].onclick = aClick;
  123. els[i].onfocus = aFocus;
  124. els[i].onblur = aBlur;
  125. els[i].onkeydown = aKeydown;
  126. }
  127. };
  128. this .input.onkeydown = function (event){
  129. eventevent = event || window.event; /* 兼容IE */
  130. var els = that.popup.getElementsByTagName( 'a' );
  131. if (event.keyCode==40){
  132. if (els[0]) els[0].focus();
  133. } else if (event.keyCode==38){
  134. if (els[els.length-1]) els[els.length-1].focus();
  135. } else if (event.keyCode==9){
  136. if (event.shiftKey== true ) that.popup.style.display = 'none' ;
  137. }
  138. };
  139. this .e.onmouSEOver = function (){ that.show=1; };
  140. this .e.onmouSEOut = function (){ that.show=0; };
  141. addEvent.call(document, 'click' , function (){
  142. if (that.show==0){
  143. that.popup.style.display= 'none' ;
  144. }
  145. }); /* 處理提示框dom元素不支持onblur的情況 */
  146. }
  147. };
  148. handlerhandler.prototype.init.prototype=handler.prototype; /* JQuery style,這樣我們在處的時候就不用每個dom元素都用new來創建對象了 */
  149. return handler; /* 把內部的處理函數傳到外部 */
  150. })();
  151. if ( this .length){ /* 處理選擇多個dom元素 */
  152. for ( var a= this .length-1; a>=0; a--){ /* 調用方法為每個選擇的dom生成一個處理對象,使它們不互相影響 */
  153. handler( this [a],o);
  154. }
  155. } else { /* 處理選擇一個dom元素 */
  156. handler( this ,o);
  157. }
  158. return this ;
  159. };
  160. return window.autoComplete = autoComplete; /* 暴露方法給全局對象 */
  161. /* 插件結束 */
  162. })(window);

其中了一些全局的自定義函數,如addEvent和在例子中將要用到的getElementsByClassName函數如下:

vIEw source print ?

  1. var getElementsByClassName = function (searchClass, node, tag) { /* 兼容各浏覽器的選擇class的方法;(寫法參考了博客園:http://www.cnblogs.com/rubylouvre/archive/2009/07/24/1529640.Html
  2. ,想了解更多請看這個地址) */
  3. nodenode = node || document, tagtag = tag ? tag.toUpperCase() : "*" ;
  4. if (document.getElementsByClassName){ /* 支持getElementsByClassName的浏覽器 */
  5. var temp = node.getElementsByClassName(searchClass);
  6. if (tag== "*" ){
  7. return temp;
  8. } else {
  9. var ret = new Array();
  10. for ( var i=0; i<temp.length; i++)

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved