在ie8上js实现简单的combobox功能(支持拼音检索)

最近在ie8碰到一个js问题,需要实现(ie8)使用拼音或者拼音首字母来检索select中的内容,原来的combobox只能支持汉字输入检索,现在需要进行改进,现在我将一步一步的实现方法记录下来,功能简单,也可能有bug和不足,供学习参考。(本文只是提供思路学习和备份,实际情况需要在ie8或者ie兼容模式上使用,所以没有考虑到别的浏览器)

目录结构:

test

|--js

|--index.html


在index页面中添加

index.html

[html]  view plain  copy
 
  1. <!DOCTYPE html>  
  2. <html>  
  3.     <head>  
  4.         <meta charset="utf-8" />  
  5.         <title></title>  
  6.         <script type="text/javascript" src="js/autoComplete.js" ></script>  
  7.         <script type="text/javascript">  
  8.               
  9.         </script>  
  10.     </head>  
  11.     <body>  
  12.         <input type="text" id="txtDisplay" />  
  13.         <select id="city">  
  14.             <option value="1">北京</option>  
  15.             <option value="2">上海</option>  
  16.             <option value="3">广州</option>  
  17.             <option value="4">深圳</option>  
  18.             <option value="5">重庆</option>  
  19.             <option value="6">天津</option>  
  20.             <option value="7">沈阳</option>  
  21.             <option value="8">南京</option>  
  22.             <option value="9">武汉</option>  
  23.             <option value="10">长春</option>  
  24.             <option value="11">成都</option>  
  25.             <option value="12">大连</option>  
  26.             <option value="13">杭州</option>  
  27.             <option value="14">青岛</option>  
  28.             <option value="15">a济南</option>  
  29.             <option value="16">厦门</option>  
  30.             <option value="17">福州</option>  
  31.             <option value="18">西安</option>  
  32.             <option value="19">长沙</option>  
  33.             <option value="20">哈尔滨</option>  
  34.         </select>  
  35.     </body>  
  36. </html>  



效果:开始将select 的下拉列表框隐藏,当点击input文本框的时候显示到input框的下面,选择完成后再将select隐藏。

js实现:

如果一个页面有多个地方需要实现这样的功能,这个时候就要使用面向对象的思维,尽可能代码重用,我们需要自定义一个ap这样的集合。

autoComplete.js

[javascript]  view plain  copy
 
  1. function Map() {  
  2.     /** 存放键的数组(遍历用到) */  
  3.     this.keys = new Array();  
  4.     /** 存放数据 */    
  5.     this.data = new Object();   
  6.      /**   
  7.      * 放入一个键值对   
  8.      * @param {String} key   
  9.      * @param {Object} value   
  10.      */    
  11.     this.put = function(key, value) {     
  12.         if(this.data[key] == null){     
  13.             this.keys.push(key);     
  14.         }     
  15.         this.data[key] = value;     
  16.     };  
  17.     /**   
  18.      * 获取某键对应的值   
  19.      * @param {String} key   
  20.      * @return {Object} value   
  21.      */    
  22.     this.get = function(key) {     
  23.         return this.data[key];     
  24.     };   
  25.     /**   
  26.      * 删除一个键值对   
  27.      * @param {String} key   
  28.      */    
  29.     this.remove = function(key) {     
  30.         this.keys.remove(key);     
  31.         this.data[key] = null;     
  32.     };   
  33.     /**   
  34.      * 遍历Map,执行处理函数   
  35.      *    
  36.      * @param {Function} 回调函数 function(key,value,index){..}   
  37.      */    
  38.     this.each = function(fn){     
  39.         if(typeof fn != 'function'){     
  40.             return;     
  41.         }     
  42.         var len = this.keys.length;     
  43.         for(var i=0;i<len;i++){     
  44.             var k = this.keys[i];     
  45.             fn(k,this.data[k],i);     
  46.         }     
  47.     };  
  48.     /**   
  49.      * 获取键值数组(类似Java的entrySet())   
  50.      * @return 键值对象{key,value}的数组   
  51.      */    
  52.     this.entrys = function() {     
  53.         var len = this.keys.length;     
  54.         var entrys = new Array(len);     
  55.         for (var i = 0; i < len; i++) {     
  56.             entrys[i] = {     
  57.                 key : this.keys[i],     
  58.                 value : this.data[i]     
  59.             };     
  60.         }     
  61.         return entrys;     
  62.     };  
  63.     /**   
  64.      * 判断Map是否为空   
  65.      */    
  66.     this.isEmpty = function() {     
  67.         return this.keys.length == 0;     
  68.     };     
  69.          
  70.     /**   
  71.      * 获取键值对数量   
  72.      */    
  73.     this.size = function(){     
  74.         return this.keys.length;     
  75.     };     
  76.          
  77.     /**   
  78.      * 重写toString    
  79.      */    
  80.     this.toString = function(){     
  81.         var s = "{";     
  82.         for(var i=0;i<this.keys.length;i++,s+=','){     
  83.             var k = this.keys[i];     
  84.             s += k+"="+this.data[k];     
  85.         }     
  86.         s+="}";     
  87.         return s;     
  88.     };  
  89. }  
  90. Array.prototype.remove = function(s) {     
  91.     for (var i = 0; i < this.length; i++) {     
  92.         if (s == this[i])     
  93.             this.splice(i, 1);     
  94.     }     
  95. }  


现在我们要写一个程序加载入口文件,用来将input和select的对象传入,然后进行事件绑定等等一系列的操作。

[javascript]  view plain  copy
 
  1. var autoCompleteMap = new Map(); //组件容器,便于组件事件驱动时调用,同时支持多组件管理  
  2. var splitFleg = "_"//分隔符  
  3. /** 
  4.  * 文本框,下拉框组合成自动补全组件 
  5.  * @param {Object} txtObj 文本框对象 
  6.  * @param {Object} selectObj 下拉框对象 
  7.  * @param {int} selectSize 显示下拉框的数量 
  8.  * @param {int} selectLength 下拉框的长度 
  9.  */  
  10. function AutoComplete(txtObj, selectObj, selectSize, selectLength) {  
  11.     this.cacheContainer = new Array(); //缓存容器,用来在页面刚刚加载的时候将option中的内容缓存到cacheContainer中  
  12.     this.init = function() {  
  13.         this.initCache(); //缓存数据,将option的数据缓存到cacheContainer  
  14.         this.initCSS(); //初始化css  将select隐藏  
  15.         this.registerEvent(); //注册事件  
  16.         this.setSelectIdPosition(); //设置select的位置  
  17.         // 缓存当前组件,便于组件事件驱动时调用,同时支持多组件管理  
  18.         autoCompleteMap.put(txtObj.id + selectObj.id, this);  
  19.         // 界面刷新后,将直属机构下拉框text值,写入文本框  
  20.         var selectIndex = selectObj.selectedIndex;  
  21.         if (selectIndex > 0) //第一个内容一般是 【请选择】,如果没有则将>0改为>=0  
  22.             txtObj.value = selectObj.options[selectIndex].text;  
  23.   
  24.     }  
  25.         //缓存数据,将option的数据缓存到cacheContainer  
  26.     this.initCache = function() {  
  27.         var select_options = selectObj.options;  
  28.         if (select_options == null || select_options.length == 0) {  
  29.             return;  
  30.         }  
  31.         this.cacheContainer = [];  
  32.         for (var i = 0; i < select_options.length; i++) {  
  33.             this.cacheContainer[i] = select_options[i].text + splitFleg + select_options[i].value;  
  34.         }  
  35.     }  
  36.     this.initCSS = function() {  
  37.         selectObj.style.display = "none";  
  38.         selectObj.style.position = "absolute";  
  39.         selectObj.style.zIndex = 2;  
  40.         selectObj.style.width = selectLength + "px";  
  41.         selectObj.multiple = "multiple";  
  42.   
  43.         txtObj.style.width = selectLength - 5 + "px";  
  44.     }  
  45.   
  46.     this.registerEvent = function() {  
  47.         // 下拉框事件  
  48.         selectObj.ondblclick = this.doubleClickEvent;  
  49.         selectObj.onkeyup = this.keyupEvent;  
  50.         selectObj.onblur = this.OnblurEvent;  
  51.         selectObj.onfocus = this.OnfocusEvent;  
  52.   
  53.         // 文本框事件  
  54.         txtObj.onfocus = this.OnfocusEvent;  
  55.         txtObj.onblur = this.OnblurEvent;  
  56.         txtObj.onkeyup = this.txtObjKeyupEvent;  
  57.     }  
  58.     this.setSelectIdPosition = function() {  
  59.         var position = this.findPosition(txtObj);  
  60.   
  61.         selectObj.style.left = position[0] + "px";  
  62.         selectObj.style.top = position[3] + 3 + "px";  
  63.     }  
  64.     this.findPosition = function(oElement) {  
  65.         var x2 = 0;  
  66.         var y2 = 0;  
  67.         var width = oElement.offsetWidth;  
  68.         var height = oElement.offsetHeight;  
  69.         if (typeof(oElement.offsetParent) != 'undefined') {  
  70.             for (var posX = 0, posY = 0; oElement; oElement = oElement.offsetParent) {  
  71.                 posX += oElement.offsetLeft;  
  72.                 posY += oElement.offsetTop;  
  73.             }  
  74.             x2 = posX + width;  
  75.             y2 = posY + height;  
  76.             return [posX, posY, x2, y2];  
  77.   
  78.         } else {  
  79.             x2 = oElement.x + width;  
  80.             y2 = oElement.y + height;  
  81.             return [oElement.x, oElement.y, x2, y2];  
  82.         }  
  83.     }  
  84.   
  85.     //-----------------绑定的事件------------------------  
  86.     /** 
  87.      * select下拉列表框双击事件 
  88.      */  
  89.     this.doubleClickEvent = function() {  
  90.         selectObj.style.display = "none";  
  91.         var selectIndex = selectObj.selectedIndex;  
  92.         txtObj.value = selectObj.options[selectIndex].text;  
  93.     }  
  94.     /** 
  95.      * 鼠标点击松开事件 
  96.      */  
  97.     this.keyupEvent = function() {  
  98.         var autocomplete = autoCompleteMap.get(txtObj.id + selectObj.id);  
  99.   
  100.         if (event.keyCode == 13) {  
  101.             event.returnValue = false;  
  102.             var srcElem = document.activeElement; //获取当前聚焦的对象  
  103.             var testval = srcElem.id;  
  104.             if (testval == selectObj.id) {  
  105.                 autocomplete.doubleClickEvent();  
  106.             }  
  107.         }  
  108.     }  
  109.     /** 
  110.      * 聚焦事件 
  111.      */  
  112.     this.OnblurEvent = function() {  
  113.         var srcElem = document.activeElement;  
  114.         var testval = srcElem.id;  
  115.         if (testval != selectObj.id && testval != txtObj.id) { //如果没有聚焦到当前input框或者select列表  
  116.             selectObj.style.display = "none"//将select列表隐藏  
  117.         }  
  118.     }  
  119.     /** 
  120.      * 聚焦事件 
  121.      */  
  122.     this.OnfocusEvent = function() {  
  123.         var autocomplete = autoCompleteMap.get(txtObj.id + selectObj.id);  
  124.         autocomplete.setSelectIdPosition();  
  125.   
  126.         var srcElem = document.activeElement;  
  127.         var testval = srcElem.id;  
  128.         if (testval == selectObj.id || testval == txtObj.id) { //聚焦在当前对象  
  129.             if (txtObj.value.length != 0) { //当input框中存在字符,则不进行任何操作  
  130.                 return;  
  131.             }  
  132.             var selectIdLength = selectObj.options.length;  
  133.   
  134.             if (selectIdLength > selectSize) {  
  135.                 selectObj.size = selectSize;  
  136.             } else {  
  137.                 selectObj.size = selectIdLength;  
  138.             }  
  139.             selectObj.style.display = "block";  
  140.         }  
  141.     }  
  142.     var myTimeout = null;  
  143.     /** 
  144.      * 文本框鼠标聚焦松开事件 ,设置一个定时器,每个特定的时间执行函数,查询和input框中匹配到的select列表数据并显示 
  145.      */  
  146.     this.txtObjKeyupEvent = function() {  
  147.         var autocomplete = autoCompleteMap.get(txtObj.id + selectObj.id);  
  148.   
  149.         if (event.keyCode == 40) { //input框中点击键盘方向键下,这个时候不需要进行检索,只有在输入的时候触发检索事件  
  150.             var srcElem = document.activeElement;  
  151.             var testval = srcElem.id;  
  152.             if (testval == txtObj.id) {  
  153.                 selectObj.focus();  
  154.                 if (selectObj.options.length >= 1)  
  155.                     selectObj.options[0].selected = true;  
  156.             }  
  157.             return;  
  158.         }  
  159.         if (autocomplete.myTimeout != null) { //清空设置的定时执行事件  
  160.             clearTimeout(autocomplete.myTimeout);  
  161.         }  
  162.         autocomplete.myTimeout = setTimeout(autocomplete.doAJAX, 200);  
  163.     }  
  164.     //----------------------------检索显示匹配数据-----------------------------  
  165.     /** 
  166.      * 做主要的查询匹配操作 
  167.      */  
  168.     this.doAJAX = function() {  
  169.         var autocomplete = autoCompleteMap.get(txtObj.id + selectObj.id);  
  170.   
  171.         //清空原来的OPTIONS  
  172.         autocomplete.clearAllOptions();  
  173.   
  174.         autocomplete.setSelectIdPosition();  
  175.         var inputStr = txtObj.value;  
  176.   
  177.         var arrays = autocomplete.compareInput(inputStr); //匹配符合查询条件的数据  
  178.         if (arrays == null || arrays.length == 0) {  
  179.             selectObj.style.display = "none";  
  180.             return;  
  181.         }  
  182.   
  183.         selectObj.style.display = "block";  
  184.   
  185.         for (var i = 0; i < arrays.length; i++) {  
  186.             var optionParams = arrays[i].split(splitFleg);  
  187.             var opt = new Option();  
  188.             opt.text = optionParams[0];  
  189.             opt.value = optionParams[1];  
  190.   
  191.             selectObj.add(opt);  
  192.         }  
  193.   
  194.         if (arrays.length > selectSize) {  
  195.             selectObj.size = selectSize;  
  196.         } else {  
  197.             selectObj.size = arrays.length;  
  198.         }  
  199.     }  
  200.     /** 
  201.      * 清空原来的OPTIONS 
  202.      */  
  203.     this.clearAllOptions = function() {  
  204.         //清空原来的OPTIONS  
  205.         var nL = selectObj.options.length;  
  206.         while (nL > 0) {  
  207.             selectObj.remove(selectObj.options.length - 1);  
  208.             nL = selectObj.options.length;  
  209.         }  
  210.     }  
  211.     //--------------------------数据检索规则---------------------  
  212.     /** 
  213.      * 数据检索规则 
  214.      * @param {String} inputStr input框中需要进行匹配的条件 
  215.      */  
  216.     this.compareInput = function(inputStr) {  
  217.         if (this.cacheContainer.length == 0) {  
  218.             return;  
  219.         }  
  220.   
  221.         inputStr = inputStr.replace(/(^[\s]*)/g, ""); //去前边空白字符串  
  222.         inputStr = this.deleteSpecialSpace(inputStr); //去除特殊空白字符串  
  223.         if (inputStr == null || inputStr.length == 0) {  
  224.             return this.cacheContainer;  
  225.         }  
  226.         inputStr = disableSpecialCharacter(inputStr); //特殊字符处理  
  227.   
  228.         var resultArray = new Array();  
  229.   
  230.         var k = 0;  
  231.         var selectText = "";  
  232.         for (var i = 0; i < this.cacheContainer.length; i++) {  
  233.             selectText = (this.cacheContainer[i].split(splitFleg)[0]).replace(/(^[\s]*)/g, "");  
  234.             selectText = this.deleteSpecialSpace(selectText);  
  235.             if (compareRules(inputStr, selectText)) { //匹配规则  
  236.                 resultArray[k] = this.cacheContainer[i];  
  237.                 k++;  
  238.             }  
  239.         }  
  240.         return uniqueArray(resultArray);  
  241.   
  242.     }  
  243.     /** 
  244.      * 去除特殊空白字符串 
  245.      */  
  246.     this.deleteSpecialSpace = function(srcStr) {  
  247.         var temp = "";  
  248.         for (var i = 0; i < srcStr.length; i++) {  
  249.             var charStr = srcStr.charAt(i);  
  250.             // 界面特殊空格Unicode=160,此空格既不是全角,也非半角  
  251.             if (charStr.charCodeAt(0) == 160) {  
  252.                 continue;  
  253.             }  
  254.             temp += charStr;  
  255.         }  
  256.         return temp;  
  257.     }  
  258. }  
  259. /** 
  260.  * @param {String} inputStr 需要进行过滤的字符 
  261.  * 特殊字符处理 
  262.  */  
  263. function disableSpecialCharacter(inputStr) {  
  264.     inputStr = inputStr.replace(new RegExp("\\\\", 'g'), "\\\\");  
  265.     inputStr = inputStr.replace(new RegExp("\\."'g'), "\\.");  
  266.     inputStr = inputStr.replace(new RegExp("\\^"'g'), "\\^");  
  267.     inputStr = inputStr.replace(new RegExp("\\{"'g'), "\\{");  
  268.     inputStr = inputStr.replace(new RegExp("\\["'g'), "\\[");  
  269.     inputStr = inputStr.replace(new RegExp("\\("'g'), "\\(");  
  270.     inputStr = inputStr.replace(new RegExp("\\|"'g'), "\\|");  
  271.     inputStr = inputStr.replace(new RegExp("\\]"'g'), "\\]");  
  272.     inputStr = inputStr.replace(new RegExp("\\)"'g'), "\\)");  
  273.     inputStr = inputStr.replace(new RegExp("\\*"'g'), "\\*");  
  274.     inputStr = inputStr.replace(new RegExp("\\+"'g'), "\\+");  
  275.     inputStr = inputStr.replace(new RegExp("\\?"'g'), "\\?");  
  276.     return inputStr;  
  277. }  
  278. /** 
  279.  * 匹配规则 
  280.  * @param {String} inputStr   input框字符,匹配条件 
  281.  * @param {String} selectText  被匹配文字 
  282.  */  
  283. function compareRules(inputStr, selectText) {  
  284.     //匹配汉字   
  285.     return selectText.indexOf(inputStr) != -1 ;  
  286. }  
  287. /** 
  288.  * 过滤重复数据 
  289.  * @param {Object} arr 结果数组 
  290.  */  
  291. function uniqueArray(arr) {  
  292.     if(arr == null || arr.length == 0){  
  293.         return arr;  
  294.     }  
  295.     return arr.reverse().join(",").match( /([^,]+)(?!.*\1)/ig).reverse();  
  296. }  
  297. /** 
  298.  * 在原来onload的基础上加上自定义要执行的函数 
  299.  * @param {Object} func 加载函数 
  300.  */  
  301. function addLoadEvent(func) {  
  302.     var oldonload = window.onload;  
  303.     if (typeof window.onload != 'function') {  
  304.         window.onload = func;  
  305.     } else {  
  306.         window.onload = function() {  
  307.             oldonload();  
  308.             func();  
  309.         }  
  310.     }  
  311. }  

引入将汉字转换成拼音的工具js

pinYinHanZi.js

[javascript]  view plain  copy
 
  1. /** 
  2.  * 汉子转换成拼音工具js 
  3.  */  
  4. var key2code = {  
  5.     65: "a",  
  6.     66: "b",  
  7.     67: "c",  
  8.     68: "d",  
  9.     69: "e",  
  10.     70: "f",  
  11.     71: "g",  
  12.     72: "h",  
  13.     73: "i",  
  14.     74: "j",  
  15.     75: "k",  
  16.     76: "l",  
  17.     77: "m",  
  18.     78: "n",  
  19.     79: "o",  
  20.     80: "p",  
  21.     81: "q",  
  22.     82: "r",  
  23.     83: "s",  
  24.     84: "t",  
  25.     85: "u",  
  26.     86: "v",  
  27.     87: "w",  
  28.     88: "x",  
  29.     89: "y",  
  30.     90: "z",  
  31.     49: "1",  
  32.     50: "2",  
  33.     51: "3",  
  34.     52: "4",  
  35.     53: "5",  
  36.     54: "6",  
  37.     55: "7",  
  38.     56: "8",  
  39.     57: "9",  
  40.     48: "0"  
  41. };  
  42.   
  43. var spell = {  
  44.     0xB0A1: "a",  
  45.     0xB0A3: "ai",  
  46.     0xB0B0: "an",  
  47.     0xB0B9: "ang",  
  48.     0xB0BC: "ao",  
  49.     0xB0C5: "ba",  
  50.     0xB0D7: "bai",  
  51.     0xB0DF: "ban",  
  52.     0xB0EE: "bang",  
  53.     0xB0FA: "bao",  
  54.     0xB1AD: "bei",  
  55.     0xB1BC: "ben",  
  56.     0xB1C0: "beng",  
  57.     0xB1C6: "bi",  
  58.     0xB1DE: "bian",  
  59.     0xB1EA: "biao",  
  60.     0xB1EE: "bie",  
  61.     0xB1F2: "bin",  
  62.     0xB1F8: "bing",  
  63.     0xB2A3: "bo",  
  64.     0xB2B8: "bu",  
  65.     0xB2C1: "ca",  
  66.     0xB2C2: "cai",  
  67.     0xB2CD: "can",  
  68.     0xB2D4: "cang",  
  69.     0xB2D9: "cao",  
  70.     0xB2DE: "ce",  
  71.     0xB2E3: "ceng",  
  72.     0xB2E5: "cha",  
  73.     0xB2F0: "chai",  
  74.     0xB2F3: "chan",  
  75.     0xB2FD: "chang",  
  76.     0xB3AC: "chao",  
  77.     0xB3B5: "che",  
  78.     0xB3BB: "chen",  
  79.     0xB3C5: "cheng",  
  80.     0xB3D4: "chi",  
  81.     0xB3E4: "chong",  
  82.     0xB3E9: "chou",  
  83.     0xB3F5: "chu",  
  84.     0xB4A7: "chuai",  
  85.     0xB4A8: "chuan",  
  86.     0xB4AF: "chuang",  
  87.     0xB4B5: "chui",  
  88.     0xB4BA: "chun",  
  89.     0xB4C1: "chuo",  
  90.     0xB4C3: "ci",  
  91.     0xB4CF: "cong",  
  92.     0xB4D5: "cou",  
  93.     0xB4D6: "cu",  
  94.     0xB4DA: "cuan",  
  95.     0xB4DD: "cui",  
  96.     0xB4E5: "cun",  
  97.     0xB4E8: "cuo",  
  98.     0xB4EE: "da",  
  99.     0xB4F4: "dai",  
  100.     0xB5A2: "dan",  
  101.     0xB5B1: "dang",  
  102.     0xB5B6: "dao",  
  103.     0xB5C2: "de",  
  104.     0xB5C5: "deng",  
  105.     0xB5CC: "di",  
  106.     0xB5DF: "dian",  
  107.     0xB5EF: "diao",  
  108.     0xB5F8: "die",  
  109.     0xB6A1: "ding",  
  110.     0xB6AA: "diu",  
  111.     0xB6AB: "dong",  
  112.     0xB6B5: "dou",  
  113.     0xB6BC: "du",  
  114.     0xB6CB: "duan",  
  115.     0xB6D1: "dui",  
  116.     0xB6D5: "dun",  
  117.     0xB6DE: "duo",  
  118.     0xB6EA: "e",  
  119.     0xB6F7: "en",  
  120.     0xB6F8: "er",  
  121.     0xB7A2: "fa",  
  122.     0xB7AA: "fan",  
  123.     0xB7BB: "fang",  
  124.     0xB7C6: "fei",  
  125.     0xB7D2: "fen",  
  126.     0xB7E1: "feng",  
  127.     0xB7F0: "fo",  
  128.     0xB7F1: "fou",  
  129.     0xB7F2: "fu",  
  130.     0xB8C1: "ga",  
  131.     0xB8C3: "gai",  
  132.     0xB8C9: "gan",  
  133.     0xB8D4: "gang",  
  134.     0xB8DD: "gao",  
  135.     0xB8E7: "ge",  
  136.     0xB8F8: "gei",  
  137.     0xB8F9: "gen",  
  138.     0xB8FB: "geng",  
  139.     0xB9A4: "gong",  
  140.     0xB9B3: "gou",  
  141.     0xB9BC: "gu",  
  142.     0xB9CE: "gua",  
  143.     0xB9D4: "guai",  
  144.     0xB9D7: "guan",  
  145.     0xB9E2: "guang",  
  146.     0xB9E5: "gui",  
  147.     0xB9F5: "gun",  
  148.     0xB9F8: "guo",  
  149.     0xB9FE: "ha",  
  150.     0xBAA1: "hai",  
  151.     0xBAA8: "han",  
  152.     0xBABB: "hang",  
  153.     0xBABE: "hao",  
  154.     0xBAC7: "he",  
  155.     0xBAD9: "hei",  
  156.     0xBADB: "hen",  
  157.     0xBADF: "heng",  
  158.     0xBAE4: "hong",  
  159.     0xBAED: "hou",  
  160.     0xBAF4: "hu",  
  161.     0xBBA8: "hua",  
  162.     0xBBB1: "huai",  
  163.     0xBBB6: "huan",  
  164.     0xBBC4: "huang",  
  165.     0xBBD2: "hui",  
  166.     0xBBE7: "hun",  
  167.     0xBBED: "huo",  
  168.     0xBBF7: "ji",  
  169.     0xBCCE: "jia",  
  170.     0xBCDF: "jian",  
  171.     0xBDA9: "jiang",  
  172.     0xBDB6: "jiao",  
  173.     0xBDD2: "jie",  
  174.     0xBDED: "jin",  
  175.     0xBEA3: "jing",  
  176.     0xBEBC: "jiong",  
  177.     0xBEBE: "jiu",  
  178.     0xBECF: "ju",  
  179.     0xBEE8: "juan",  
  180.     0xBEEF: "jue",  
  181.     0xBEF9: "jun",  
  182.     0xBFA6: "ka",  
  183.     0xBFAA: "kai",  
  184.     0xBFAF: "kan",  
  185.     0xBFB5: "kang",  
  186.     0xBFBC: "kao",  
  187.     0xBFC0: "ke",  
  188.     0xBFCF: "ken",  
  189.     0xBFD3: "keng",  
  190.     0xBFD5: "kong",  
  191.     0xBFD9: "kou",  
  192.     0xBFDD: "ku",  
  193.     0xBFE4: "kua",  
  194.     0xBFE9: "kuai",  
  195.     0xBFED: "kuan",  
  196.     0xBFEF: "kuang",  
  197.     0xBFF7: "kui",  
  198.     0xC0A4: "kun",  
  199.     0xC0A8: "kuo",  
  200.     0xC0AC: "la",  
  201.     0xC0B3: "lai",  
  202.     0xC0B6: "lan",  
  203.     0xC0C5: "lang",  
  204.     0xC0CC: "lao",  
  205.     0xC0D5: "le",  
  206.     0xC0D7: "lei",  
  207.     0xC0E2: "leng",  
  208.     0xC0E5: "li",  
  209.     0xC1A9: "lia",  
  210.     0xC1AA: "lian",  
  211.     0xC1B8: "liang",  
  212.     0xC1C3: "liao",  
  213.     0xC1D0: "lie",  
  214.     0xC1D5: "lin",  
  215.     0xC1E1: "ling",  
  216.     0xC1EF: "liu",  
  217.     0xC1FA: "long",  
  218.     0xC2A5: "lou",  
  219.     0xC2AB: "lu",  
  220.     0xC2BF: "lv",  
  221.     0xC2CD: "luan",  
  222.     0xC2D3: "lue",  
  223.     0xC2D5: "lun",  
  224.     0xC2DC: "luo",  
  225.     0xC2E8: "ma",  
  226.     0xC2F1: "mai",  
  227.     0xC2F7: "man",  
  228.     0xC3A2: "mang",  
  229.     0xC3A8: "mao",  
  230.     0xC3B4: "me",  
  231.     0xC3B5: "mei",  
  232.     0xC3C5: "men",  
  233.     0xC3C8: "meng",  
  234.     0xC3D0: "mi",  
  235.     0xC3DE: "mian",  
  236.     0xC3E7: "miao",  
  237.     0xC3EF: "mie",  
  238.     0xC3F1: "min",  
  239.     0xC3F7: "ming",  
  240.     0xC3FD: "miu",  
  241.     0xC3FE: "mo",  
  242.     0xC4B1: "mou",  
  243.     0xC4B4: "mu",  
  244.     0xC4C3: "na",  
  245.     0xC4CA: "nai",  
  246.     0xC4CF: "nan",  
  247.     0xC4D2: "nang",  
  248.     0xC4D3: "nao",  
  249.     0xC4D8: "ne",  
  250.     0xC4D9: "nei",  
  251.     0xC4DB: "nen",  
  252.     0xC4DC: "neng",  
  253.     0xC4DD: "ni",  
  254.     0xC4E8: "nian",  
  255.     0xC4EF: "niang",  
  256.     0xC4F1: "niao",  
  257.     0xC4F3: "nie",  
  258.     0xC4FA: "nin",  
  259.     0xC4FB: "ning",  
  260.     0xC5A3: "niu",  
  261.     0xC5A7: "nong",  
  262.     0xC5AB: "nu",  
  263.     0xC5AE: "nv",  
  264.     0xC5AF: "nuan",  
  265.     0xC5B0: "nue",  
  266.     0xC5B2: "nuo",  
  267.     0xC5B6: "o",  
  268.     0xC5B7: "ou",  
  269.     0xC5BE: "pa",  
  270.     0xC5C4: "pai",  
  271.     0xC5CA: "pan",  
  272.     0xC5D2: "pang",  
  273.     0xC5D7: "pao",  
  274.     0xC5DE: "pei",  
  275.     0xC5E7: "pen",  
  276.     0xC5E9: "peng",  
  277.     0xC5F7: "pi",  
  278.     0xC6AA: "pian",  
  279.     0xC6AE: "piao",  
  280.     0xC6B2: "pie",  
  281.     0xC6B4: "pin",  
  282.     0xC6B9: "ping",  
  283.     0xC6C2: "po",  
  284.     0xC6CB: "pu",  
  285.     0xC6DA: "qi",  
  286.     0xC6FE: "qia",  
  287.     0xC7A3: "qian",  
  288.     0xC7B9: "qiang",  
  289.     0xC7C1: "qiao",  
  290.     0xC7D0: "qie",  
  291.     0xC7D5: "qin",  
  292.     0xC7E0: "qing",  
  293.     0xC7ED: "qiong",  
  294.     0xC7EF: "qiu",  
  295.     0xC7F7: "qu",  
  296.     0xC8A6: "quan",  
  297.     0xC8B1: "que",  
  298.     0xC8B9: "qun",  
  299.     0xC8BB: "ran",  
  300.     0xC8BF: "rang",  
  301.     0xC8C4: "rao",  
  302.     0xC8C7: "re",  
  303.     0xC8C9: "ren",  
  304.     0xC8D3: "reng",  
  305.     0xC8D5: "ri",  
  306.     0xC8D6: "rong",  
  307.     0xC8E0: "rou",  
  308.     0xC8E3: "ru",  
  309.     0xC8ED: "ruan",  
  310.     0xC8EF: "rui",  
  311.     0xC8F2: "run",  
  312.     0xC8F4: "ruo",  
  313.     0xC8F6: "sa",  
  314.     0xC8F9: "sai",  
  315.     0xC8FD: "san",  
  316.     0xC9A3: "sang",  
  317.     0xC9A6: "sao",  
  318.     0xC9AA: "se",  
  319.     0xC9AD: "sen",  
  320.     0xC9AE: "seng",  
  321.     0xC9AF: "sha",  
  322.     0xC9B8: "shai",  
  323.     0xC9BA: "shan",  
  324.     0xC9CA: "shang",  
  325.     0xC9D2: "shao",  
  326.     0xC9DD: "she",  
  327.     0xC9E9: "shen",  
  328.     0xC9F9: "sheng",  
  329.     0xCAA6: "shi",  
  330.     0xCAD5: "shou",  
  331.     0xCADF: "shu",  
  332.     0xCBA2: "shua",  
  333.     0xCBA4: "shuai",  
  334.     0xCBA8: "shuan",  
  335.     0xCBAA: "shuang",  
  336.     0xCBAD: "shui",  
  337.     0xCBB1: "shun",  
  338.     0xCBB5: "shuo",  
  339.     0xCBB9: "si",  
  340.     0xCBC9: "song",  
  341.     0xCBD1: "sou",  
  342.     0xCBD4: "su",  
  343.     0xCBE1: "suan",  
  344.     0xCBE4: "sui",  
  345.     0xCBEF: "sun",  
  346.     0xCBF2: "suo",  
  347.     0xCBFA: "ta",  
  348.     0xCCA5: "tai",  
  349.     0xCCAE: "tan",  
  350.     0xCCC0: "tang",  
  351.     0xCCCD: "tao",  
  352.     0xCCD8: "te",  
  353.     0xCCD9: "teng",  
  354.     0xCCDD: "ti",  
  355.     0xCCEC: "tian",  
  356.     0xCCF4: "tiao",  
  357.     0xCCF9: "tie",  
  358.     0xCCFC: "ting",  
  359.     0xCDA8: "tong",  
  360.     0xCDB5: "tou",  
  361.     0xCDB9: "tu",  
  362.     0xCDC4: "tuan",  
  363.     0xCDC6: "tui",  
  364.     0xCDCC: "tun",  
  365.     0xCDCF: "tuo",  
  366.     0xCDDA: "wa",  
  367.     0xCDE1: "wai",  
  368.     0xCDE3: "wan",  
  369.     0xCDF4: "wang",  
  370.     0xCDFE: "wei",  
  371.     0xCEC1: "wen",  
  372.     0xCECB: "weng",  
  373.     0xCECE: "wo",  
  374.     0xCED7: "wu",  
  375.     0xCEF4: "xi",  
  376.     0xCFB9: "xia",  
  377.     0xCFC6: "xian",  
  378.     0xCFE0: "xiang",  
  379.     0xCFF4: "xiao",  
  380.     0xD0A8: "xie",  
  381.     0xD0BD: "xin",  
  382.     0xD0C7: "xing",  
  383.     0xD0D6: "xiong",  
  384.     0xD0DD: "xiu",  
  385.     0xD0E6: "xu",  
  386.     0xD0F9: "xuan",  
  387.     0xD1A5: "xue",  
  388.     0xD1AB: "xun",  
  389.     0xD1B9: "ya",  
  390.     0xD1C9: "yan",  
  391.     0xD1EA: "yang",  
  392.     0xD1FB: "yao",  
  393.     0xD2AC: "ye",  
  394.     0xD2BB: "yi",  
  395.     0xD2F0: "yin",  
  396.     0xD3A2: "ying",  
  397.     0xD3B4: "yo",  
  398.     0xD3B5: "yong",  
  399.     0xD3C4: "you",  
  400.     0xD3D9: "yu",  
  401.     0xD4A7: "yuan",  
  402.     0xD4BB: "yue",  
  403.     0xD4C5: "yun",  
  404.     0xD4D1: "za",  
  405.     0xD4D4: "zai",  
  406.     0xD4DB: "zan",  
  407.     0xD4DF: "zang",  
  408.     0xD4E2: "zao",  
  409.     0xD4F0: "ze",  
  410.     0xD4F4: "zei",  
  411.     0xD4F5: "zen",  
  412.     0xD4F6: "zeng",  
  413.     0xD4FA: "zha",  
  414.     0xD5AA: "zhai",  
  415.     0xD5B0: "zhan",  
  416.     0xD5C1: "zhang",  
  417.     0xD5D0: "zhao",  
  418.     0xD5DA: "zhe",  
  419.     0xD5E4: "zhen",  
  420.     0xD5F4: "zheng",  
  421.     0xD6A5: "zhi",  
  422.     0xD6D0: "zhong",  
  423.     0xD6DB: "zhou",  
  424.     0xD6E9: "zhu",  
  425.     0xD7A5: "zhua",  
  426.     0xD7A7: "zhuai",  
  427.     0xD7A8: "zhuan",  
  428.     0xD7AE: "zhuang",  
  429.     0xD7B5: "zhui",  
  430.     0xD7BB: "zhun",  
  431.     0xD7BD: "zhuo",  
  432.     0xD7C8: "zi",  
  433.     0xD7D7: "zong",  
  434.     0xD7DE: "zou",  
  435.     0xD7E2: "zu",  
  436.     0xD7EA: "zuan",  
  437.     0xD7EC: "zui",  
  438.     0xD7F0: "zun",  
  439.     0xD7F2: "zuo"  
  440. };  
  441. var spellArray = new Array();  
  442. var pn = "";  
  443.   
  444. function pinyin(char) {  
  445.     if (!char.charCodeAt(0) || char.charCodeAt(0) < 1328)  
  446.         return char;  
  447.     if (spellArray[char.charCodeAt(0)])  
  448.         return spellArray[char.charCodeAt(0)]  
  449.     execScript("ascCode=hex(asc(\"" + char + "\"))""vbscript");  
  450.     ascCode = eval("0x" + ascCode);  
  451.     if (!(ascCode > 0xB0A0 && ascCode < 0xD7F3))  
  452.         return char;  
  453.     for (var i = ascCode;(!spell[i] && i > 0);)  
  454.         i--;  
  455.     return spell[i];  
  456. }  
  457.   
  458. function toPinyin(str) {  
  459.     var pStr = ""  
  460.     for (var i = 0; i < str.length; i++) {  
  461.         if (str.charAt(i) == "\n")  
  462.             pStr += "<br>"  
  463.         else  
  464.             pStr += "<ruby style='ruby-align:center'> " + str.charAt(i) + " <rt>" + pinyin(str.charAt(i)) + "</rt></ruby>"  
  465.             // else pStr += pinyin(str.charAt(i)) + " "  
  466.     }  
  467.     return pStr;  
  468. }  
  469.   
  470. function toPinyinOnly(str) {  
  471.     var pStr = ""  
  472.     for (var i = 0; i < str.length; i++) {  
  473.         if (str.charAt(i) == "\n")  
  474.             pStr += "<br>"  
  475.         else  
  476.             pStr += pinyin(str.charAt(i));  
  477.         //pStr += " " + pinyin(str.charAt(i));  
  478.         // else pStr += pinyin(str.charAt(i)) + " "  
  479.     }  
  480.     return pStr;  
  481. }  
  482.   
  483. function toPinyinShengmu(str) {  
  484.     var pStr = ""  
  485.     for (var i = 0; i < str.length; i++) {  
  486.         if (str.charAt(i) == "\n")  
  487.             pStr += "";  
  488.         else  
  489.             pStr += pinyin(str.charAt(i)).charAt(0);  
  490.         // else pStr += pinyin(str.charAt(i)) + " "  
  491.     }  
  492.     return pStr;  
  493. }  
  494.   
  495. function pinyinSort(a, b) {  
  496.     var rValue = 0  
  497.     for (var i = 0; i < a.length; i++) {  
  498.         var pinA = pinyin(a.charAt(i))  
  499.         var pinB = pinyin(b.charAt(i))  
  500.         if (rValue = pinA > pinB ? 1 : pinA < pinB ? -1 : 0)  
  501.             break  
  502.     }  
  503.     return rValue  
  504. }  

index.html

[html]  view plain  copy
 
  1. <!DOCTYPE html>  
  2. <html>  
  3.   
  4.     <head>  
  5.         <meta charset="UTF-8">  
  6.         <title></title>  
  7.         <script type="text/javascript" src="js/autoComplete.js"></script>  
  8.         <script type="text/javascript" src="js/pinYinHanZi.js"></script>  
  9.         <script type="text/javascript">  
  10.             //自定义规则  
  11.             function compareRules(inputStr, selectText) {  
  12.                 //匹配汉字  和拼音  
  13.                 return selectText.indexOf(inputStr) != -1 || toPinyinShengmu(selectText).indexOf(inputStr) != -1 ||   
  14.                         toPinyinOnly(selectText).indexOf(inputStr) != -1;  
  15.             }  
  16.               
  17.             addLoadEvent(func);  
  18.   
  19.             function func() {  
  20.                 var textObj = document.getElementById("txtDisplay");  
  21.                 var cityObj = document.getElementById("city");  
  22.                 var autocomplete = new AutoComplete(textObj, cityObj, 10, 300);  
  23.                 autocomplete.init();  
  24.             }  
  25.         </script>  
  26.     </head>  
  27.   
  28.     <body>  
  29.         <input type="text" id="txtDisplay" />  
  30.         <select id="city">  
  31.             <option value="1">北京</option>  
  32.             <option value="2">    上海</option>  
  33.             <option value="3">广州</option>  
  34.             <option value="5">重庆</option>  
  35.             <option value="6">天津</option>  
  36.             <option value="7">沈阳</option>  
  37.             <option value="8">南京</option>  
  38.             <option value="9">武汉</option>  
  39.             <option value="10">长春</option>  
  40.             <option value="11">成都</option>  
  41.             <option value="12">大连</option>  
  42.             <option value="13">杭州</option>  
  43.             <option value="14">青岛</option>  
  44.             <option value="15">济南</option>  
  45.             <option value="16">厦门</option>  
  46.             <option value="17">福州</option>  
  47.             <option value="18">西安</option>  
  48.             <option value="19">长沙</option>  
  49.             <option value="20">哈尔滨</option>  
  50.         </select>  
  51.   
  52.     </body>  
  53.   
  54. </html>  

注意:该版本有一些bug和对其他(除ie)浏览器不兼容性。

文件下载路径:文件下载

你可能感兴趣的:(在ie8上js实现简单的combobox功能(支持拼音检索))