下拉选项LQuery

来源:岁月联盟 编辑:exp 时间:2012-06-20

最近学习了一下jquery和js的面向对象的写法,写了一个下拉选项,跟大家分享一下。
001 /**
002  * Query下拉选项处理类
003  *
004  * @author  张成轩
005  * @version 1.0
006  * @email  loongzcx@163.com
007  */
008 var LQuery = function() {
009     /* 下拉选项显示内容数组 */
010     this.queryArr = new Array();
011     /* 下拉选项调用对象 */
012     this.queryDoc;
013     /* Query查询标识 */
014     this.queryFlag;
015     /* 其他赋值框对象ID数组 */
016     this.docArr;
017     /* 按键点击事件对象 */
018     this.event;
019     /* 下拉选项显示x坐标 */
020     this.x = 0;
021     /* 下拉选项显示y坐标 */
022     this.y = 0;
023     /* 选项框宽度 */
024     this.width = 150;
025     /* 选项框显示列数 */
026     this.size = 8;
027     /* 是否强制刷新 */
028     this.memory = false;
029     /* 下拉选项显示分隔符 */
030     this.separator = "-";
031     /* Ajax发送连接 */
032     this.sendUrl = "./ajax.html";
033 };
034 
035 LQuery.prototype = {
036     /**
037      * 修改Query默认设置
038      *
039      * @param set
040      *            默认设置对象
041      */
042     set : function(set) {
043         // 设置下拉选项宽度
044         if (set.width != undefined) {
045             this.width = set.width;
046         }
047         // 设置下拉选项框显示列数
048         if (set.size != undefined) {
049             this.size = set.size;
050         }
051         // 设置强制刷新标志
052         if (set.memory != undefined) {
053             this.memory = set.memory;
054         }
055         // 设置下拉选项显示分隔符
056         if (set.separator != undefined) {
057             this.separator = set.separator;
058         }
059     },
060     
061     /**
062      * Query下拉选项调用入口函数,使用ajax获取下拉数据
063      *
064      * @param docArr
065      *            下拉选项调用对象及赋值对象ID数组
066      * @param flag
067      *            Query查询标识
068      * @param event
069      *            按键点击事件,若需要兼容firefox键盘按键处理,需要传入该字段
070      * @param queryArrStr
071      *            指定下拉选项显示信息字符串
072      */
073     show : function(docArr, flag, event, queryArrStr) {
074         // 触发起始时间,用于防止并发
075         this.startTime = new Date();
076         // 按键点击事件对象
077         this.event = event;
078         // 判断是否通过setArr方法设置显示数据
079         if (this.queryArrStr != undefined) {
080             // 设置显示数据字符串
081             queryArrStr = this.queryArrStr;
082             // 清空this中的显示数据字符串,以便再次调用
083             this.queryArrStr = undefined;
084         }
085         // 判断docArr是否为数组
086         if ($.isArray(docArr)) {
087             // 获取docArr第一个元素,并从数组移除第一个元素
088             var doc = docArr.shift();
089         } else {
090             var doc = docArr;
091             // 其他赋值框对象ID数组设置为空
092             docArr = undefined;
093         }
094         // 键盘按键处理
095         if (this.keyUp()) {
096             return;
097         }
098         // 判断是否为同一个触发对象,若默认设置中的memory为true,每次调用都会强制刷新
099         if (doc != this.queryDoc || this.queryArr.length == 0 || this.memory) {
100             // 下拉选项显示内容数组
101             this.queryArr = new Array();
102             // 下拉选项调用对象
103             this.queryDoc = doc;
104             // Query查询标识
105             this.queryFlag = flag;
106             // 其它赋值框对象ID数组
107             this.docArr = docArr;
108             // 下拉选项显示坐标
109             this.setXY(doc);
110             // 检测是否设置了待显示的数据
111             if (queryArrStr != undefined) {
112                 // 已指定显示数据,直接处理显示信息字符串
113                 this.arrSplit(queryArrStr);
114                 // 生成下拉选项
115                 this.init();
116             } else {
117                 // 使用ajax发送
118                 this.send(this.startTime);
119             }
120         } else {
121             // 下拉选项显示坐标
122             this.setXY(doc);
123             // 生成下拉选项
124             this.init();
125         }
126     },
127     
128     /**
129      * 生成下拉选项
130      */
131     init : function() {
132         // 检测_queryInf是否已经生成
133         if ($('#_queryInf').val() == undefined) {
134             $('body').append("<div id='_queryInf' style='display:none;'></div>");
135         }
136         // 生成下拉选项
137         $('#_queryInf').html("<select id='_qInf' "
138                 + "style='background:#F7F6E5;font-size:10pt;font-family:宋体;width:"
139                 + this.width + "px;' size=" + this.size
140                 + "></select>");
141         // 设置显示菜单项
142         for ( var row = 0; row < this.queryArr.length; row++) {
143             $('#_qInf').append('<option>' + this.queryArr[row].join(this.separator)
144                 + '</option>');
145         }
146         // 设置初始选中值
147         this.find($(this.queryDoc).val());
148         // 绑定双击事件
149         $('#_qInf').dblclick(this, function(event) {
150             event.data.click();
151         });
152         // 下拉选项失去焦点事件
153         $('#_qInf').focusout(function() {
154             $('#_queryInf').hide(50);
155         });
156         // 录入框失去焦点事件
157         $(this.queryDoc).focusout(function() {
158             // 判断下拉选项是否获得焦点,为了兼容火狐,使用setTimeout延迟触发
159             setTimeout(function() {
160                 if (!$('#_qInf').is(':focus')) {
161                     $('#_queryInf').hide(50);
162                 }
163             }, 1);
164         });
165         // 下拉选项回车选取事件
166         $('#_qInf').keydown(this, function(event) {
167             if (event.keyCode == 13) {
168                 event.data.click();
169             }
170         });
171         // 显示下拉选项
172         $('#_queryInf').css('position', 'absolute');
173         $('#_queryInf').css('left', this.x);
174         $('#_queryInf').css('top', this.y);
175         $('#_queryInf').show('fast');
176     },
177     
178     /**
179      * 键盘按键处理函数
180      *
181      * @param event
182      *            按键点击事件,若需要兼容firefox键盘按键处理,需要传入该字段
183      */
184     keyUp : function() {
185         try {
186             var keyCode = window.event ? window.event.keyCode
187                     : this.event.keyCode;
188             // 获取下拉选项已选择项
189             var row = $("#_queryInf option:selected").index();
190             if (keyCode == "38") {
191                 // 键盘上键处理,选择上移
192                 $('#_qInf > option:nth-child(' + row + ')').attr('selected',
193                         true);
194             } else if (keyCode == "40") {
195                 // 键盘下键处理,选择下移
196                 $('#_qInf > option:nth-child(' + (row + 2) + ')').attr(
197                         'selected', true);
198             } else if (keyCode == "13") {
199                 // 键盘回车键处理,选择项赋值
200                 if (row != -1) {
201                     this.click();
202                     return true;
203                 }
204             } else {
205                 return false;
206             }
207             // 下拉选项获取焦点
208             $('#_qInf').focus();
209             return true;
210         } catch (ex) {
211             return false;
212         }
213     },
214     
215     /**
216      * ajax发送函数
217      *
218      * @param startTime
219      *            起始时间,防止ajax尚未处理完毕时触发其它下拉选项
220      */
221     send : function(startTime) {
222         // 调用ajax发送请求
223         $.ajax({
224             // 发送请求方式
225             type : "POST",
226             // 发送连接
227             url : this.sendUrl,
228             // 发送附加参数
229             data : "queryFlag=" + this.queryFlag,
230             // 设置返回类型
231             dataType : "text",
232             // 修改发送回调函数this指向
233             context : this,
234             // 连接返回信息预处理
235             dataFilter : function(data) {
236                 return $.trim(data);
237             },
238             // 连接响应成功回调函数
239             success : function(data) {
240                 // 检测是否有其它下拉选项被触发
241                 if (startTime == this.startTime) {
242                     // 解析ajax返回字符串
243                     this.arrSplit(data);
244                     // 生成下拉选项
245                     this.init();
246                 }
247             },
248             // 连接响应失败回调函数
249             error : function() {
250                 alert("页面访问异常");
251             }
252         });
253     },
254     
255     /**
256      * 下拉选项双击事件
257      */
258     click : function() {
259         // 获取点击项索引
260         var resRow = $("#_queryInf option:selected").index();
261         // 判断标识是否存在
262         if (resRow != -1 && this.queryArr[resRow] != undefined) {
263             // 设置录入框值
264             $(this.queryDoc).val(this.queryArr[resRow][0]);
265             // 判断是否有其他赋值框
266             if (this.docArr != undefined && this.docArr.length > 0) {
267                 // 判断docArr是否为数组
268                 for ( var row = 0; row < this.docArr.length; row++) {
269                     // 设置录入框名称
270                     if (row + 1 < this.queryArr[resRow].length) {
271                         $('#' + this.docArr[row]).val(
272                                 this.queryArr[resRow][row + 1]);
273                     } else {
274                         // 若返回信息数组项不存在,将录入框置为空
275                         $('#' + this.docArr[row]).val("");
276                     }
277                 }
278             }
279             // 调用点击回调处理函数,若有需要可以使用
280             try {
281                 afterQueryClick(this.queryArr[resRow], this.queryFlag, this);
282             } catch (ex) {
283             }
284             // 隐藏下拉选项
285             $('#_queryInf').hide(50);
286         }
287     },
288     
289     /**
290      * 设置下拉菜单选择项,支持大小写进行匹配
291      *
292      * @param value
293      *            录入框值
294      */
295     find : function(value) {
296         if (value != "") {
297             // 将字符串转换成小写
298             value = value.toLowerCase();
299             // 循环下拉选项数组
300             for ( var row = 0; row < this.queryArr.length; row++) {
301                 // 将数组转换成小写字符串
302                 var queryStr = this.queryArr[row].join("-").toLowerCase();
303                 // 匹配下拉选项的值
304                 if (value.length <= queryStr.length
305                         && value == queryStr.substring(0, value.length)) {
306                     // 设置选择项
307                     $('#_qInf > option:nth-child(' + (row + 1) + ')').attr(
308                             'selected', true);
309                     break;
310                 }
311             }
312         }
313     },
314     
315     /**
316      * 设置下拉选项显示信息
317      *
318      * @param queryArrStr
319      *            下拉选项显示信息字符串
320      */
321     setArr : function(queryArrStr) {
322         // 设置下拉选项显示信息字符串
323         this.queryArrStr = queryArrStr;
324         // 返回本对象
325         return this;
326     },
327     
328     /**
329      * 设置下拉选项显示坐标
330      *
331      * @param doc
332      *            下拉选项调用对象
333      */
334     setXY : function(doc) {
335         this.x = 0;
336         this.y = doc.offsetHeight;
337         // 累加父窗口坐标
338         while (doc.offsetParent) {
339             this.x += doc.offsetLeft;
340             this.y += doc.offsetTop;
341             doc = doc.offsetParent;
342         }
343     },
344     
345     /**
346      * 显示信息字符串拆分函数
347      *
348      * @param queryArrSrt
349      *            待拆分字符串
350      */
351     arrSplit : function(queryArrSrt) {
352         // 拆分ajax返回字符串生成二维数组
353         // 按|拆分行
354         var queryArr = queryArrSrt.split("|");
355         for ( var row = 0; row < queryArr.length; row++) {
356             // 按^拆分列
357             queryArr[row] = queryArr[row].split("^");
358         }
359         this.queryArr = queryArr;
360     }
361 };
362 
363 // 实例化对象
364 var query = new LQuery();
最近学习了一下jquery和js的面向对象的写法,写了一个下拉选项,跟大家分享一下。
view source
print?
001 /**
002  * Query下拉选项处理类
003  *
004  * @author  张成轩
005  * @version 1.0
006  * @email  loongzcx@163.com
007  */
008 var LQuery = function() {
009     /* 下拉选项显示内容数组 */
010     this.queryArr = new Array();
011     /* 下拉选项调用对象 */
012     this.queryDoc;
013     /* Query查询标识 */
014     this.queryFlag;
015     /* 其他赋值框对象ID数组 */
016     this.docArr;
017     /* 按键点击事件对象 */
018     this.event;
019     /* 下拉选项显示x坐标 */
020     this.x = 0;
021     /* 下拉选项显示y坐标 */
022     this.y = 0;
023     /* 选项框宽度 */
024     this.width = 150;
025     /* 选项框显示列数 */
026     this.size = 8;
027     /* 是否强制刷新 */
028     this.memory = false;
029     /* 下拉选项显示分隔符 */
030     this.separator = "-";
031     /* Ajax发送连接 */
032     this.sendUrl = "./ajax.html";
033 };
034 
035 LQuery.prototype = {
036     /**
037      * 修改Query默认设置
038      *
039      * @param set
040      *            默认设置对象
041      */
042     set : function(set) {
043         // 设置下拉选项宽度
044         if (set.width != undefined) {
045             this.width = set.width;
046         }
047         // 设置下拉选项框显示列数
048         if (set.size != undefined) {
049             this.size = set.size;
050         }
051         // 设置强制刷新标志
052         if (set.memory != undefined) {
053             this.memory = set.memory;
054         }
055         // 设置下拉选项显示分隔符
056         if (set.separator != undefined) {
057             this.separator = set.separator;
058         }
059     },
060     
061     /**
062      * Query下拉选项调用入口函数,使用ajax获取下拉数据
063      *
064      * @param docArr
065      *            下拉选项调用对象及赋值对象ID数组
066      * @param flag
067      *            Query查询标识
068      * @param event
069      *            按键点击事件,若需要兼容firefox键盘按键处理,需要传入该字段
070      * @param queryArrStr
071      *            指定下拉选项显示信息字符串
072      */
073     show : function(docArr, flag, event, queryArrStr) {
074         // 触发起始时间,用于防止并发
075         this.startTime = new Date();
076         // 按键点击事件对象
077         this.event = event;
078         // 判断是否通过setArr方法设置显示数据
079         if (this.queryArrStr != undefined) {
080             // 设置显示数据字符串
081             queryArrStr = this.queryArrStr;
082             // 清空this中的显示数据字符串,以便再次调用
083             this.queryArrStr = undefined;
084         }
085         // 判断docArr是否为数组
086         if ($.isArray(docArr)) {
087             // 获取docArr第一个元素,并从数组移除第一个元素
088             var doc = docArr.shift();
089         } else {
090             var doc = docArr;
091             // 其他赋值框对象ID数组设置为空
092             docArr = undefined;
093         }
094         // 键盘按键处理
095         if (this.keyUp()) {
096             return;
097         }
098         // 判断是否为同一个触发对象,若默认设置中的memory为true,每次调用都会强制刷新
099         if (doc != this.queryDoc || this.queryArr.length == 0 || this.memory) {
100             // 下拉选项显示内容数组
101             this.queryArr = new Array();
102             // 下拉选项调用对象
103             this.queryDoc = doc;
104             // Query查询标识
105             this.queryFlag = flag;
106             // 其它赋值框对象ID数组
107             this.docArr = docArr;
108             // 下拉选项显示坐标
109             this.setXY(doc);
110             // 检测是否设置了待显示的数据
111             if (queryArrStr != undefined) {
112                 // 已指定显示数据,直接处理显示信息字符串
113                 this.arrSplit(queryArrStr);
114                 // 生成下拉选项
115                 this.init();
116             } else {
117                 // 使用ajax发送
118                 this.send(this.startTime);
119             }
120         } else {
121             // 下拉选项显示坐标
122             this.setXY(doc);
123             // 生成下拉选项
124             this.init();
125         }
126     },
127     
128     /**
129      * 生成下拉选项
130      */
131     init : function() {
132         // 检测_queryInf是否已经生成
133         if ($('#_queryInf').val() == undefined) {
134             $('body').append("<div id='_queryInf' style='display:none;'></div>");
135         }
136         // 生成下拉选项
137         $('#_queryInf').html("<select id='_qInf' "
138                 + "style='background:#F7F6E5;font-size:10pt;font-family:宋体;width:"
139                 + this.width + "px;' size=" + this.size
140                 + "></select>");
141         // 设置显示菜单项
142         for ( var row = 0; row < this.queryArr.length; row++) {
143             $('#_qInf').append('<option>' + this.queryArr[row].join(this.separator)
144                 + '</option>');
145         }
146         // 设置初始选中值
147         this.find($(this.queryDoc).val());
148         // 绑定双击事件
149         $('#_qInf').dblclick(this, function(event) {
150             event.data.click();
151         });
152         // 下拉选项失去焦点事件
153         $('#_qInf').focusout(function() {
154             $('#_queryInf').hide(50);
155         });
156         // 录入框失去焦点事件
157         $(this.queryDoc).focusout(function() {
158             // 判断下拉选项是否获得焦点,为了兼容火狐,使用setTimeout延迟触发
159             setTimeout(function() {
160                 if (!$('#_qInf').is(':focus')) {
161                     $('#_queryInf').hide(50);
162                 }
163             }, 1);
164         });
165         // 下拉选项回车选取事件
166         $('#_qInf').keydown(this, function(event) {
167             if (event.keyCode == 13) {
168                 event.data.click();
169             }
170         });
171         // 显示下拉选项
172         $('#_queryInf').css('position', 'absolute');
173         $('#_queryInf').css('left', this.x);
174         $('#_queryInf').css('top', this.y);
175         $('#_queryInf').show('fast');
176     },
177     
178     /**
179      * 键盘按键处理函数
180      *
181      * @param event
182      *            按键点击事件,若需要兼容firefox键盘按键处理,需要传入该字段
183      */
184     keyUp : function() {
185         try {
186             var keyCode = window.event ? window.event.keyCode
187                     : this.event.keyCode;
188             // 获取下拉选项已选择项
189             var row = $("#_queryInf option:selected").index();
190             if (keyCode == "38") {
191                 // 键盘上键处理,选择上移
192                 $('#_qInf > option:nth-child(' + row + ')').attr('selected',
193                         true);
194             } else if (keyCode == "40") {
195                 // 键盘下键处理,选择下移
196                 $('#_qInf > option:nth-child(' + (row + 2) + ')').attr(
197                         'selected', true);
198             } else if (keyCode == "13") {
199                 // 键盘回车键处理,选择项赋值
200                 if (row != -1) {
201                     this.click();
202                     return true;
203                 }
204             } else {
205                 return false;
206             }
207             // 下拉选项获取焦点
208             $('#_qInf').focus();
209             return true;
210         } catch (ex) {
211             return false;
212         }
213     },
214     
215     /**
216      * ajax发送函数
217      *
218      * @param startTime
219      *            起始时间,防止ajax尚未处理完毕时触发其它下拉选项
220      */
221     send : function(startTime) {
222         // 调用ajax发送请求
223         $.ajax({
224             // 发送请求方式
225             type : "POST",
226             // 发送连接
227             url : this.sendUrl,
228             // 发送附加参数
229             data : "queryFlag=" + this.queryFlag,
230             // 设置返回类型
231             dataType : "text",
232             // 修改发送回调函数this指向
233             context : this,
234             // 连接返回信息预处理
235             dataFilter : function(data) {
236                 return $.trim(data);
237             },
238             // 连接响应成功回调函数
239             success : function(data) {
240                 // 检测是否有其它下拉选项被触发
241                 if (startTime == this.startTime) {
242                     // 解析ajax返回字符串
243                     this.arrSplit(data);
244                     // 生成下拉选项
245                     this.init();
246                 }
247             },
248             // 连接响应失败回调函数
249             error : function() {
250                 alert("页面访问异常");
251             }
252         });
253     },
254     
255     /**
256      * 下拉选项双击事件www.2cto.com
257      */
258     click : function() {
259         // 获取点击项索引
260         var resRow = $("#_queryInf option:selected").index();
261         // 判断标识是否存在
262         if (resRow != -1 && this.queryArr[resRow] != undefined) {
263             // 设置录入框值
264             $(this.queryDoc).val(this.queryArr[resRow][0]);
265             // 判断是否有其他赋值框
266             if (this.docArr != undefined && this.docArr.length > 0) {
267                 // 判断docArr是否为数组
268                 for ( var row = 0; row < this.docArr.length; row++) {
269                     // 设置录入框名称
270                     if (row + 1 < this.queryArr[resRow].length) {
271                         $('#' + this.docArr[row]).val(
272                                 this.queryArr[resRow][row + 1]);
273                     } else {
274                         // 若返回信息数组项不存在,将录入框置为空
275                         $('#' + this.docArr[row]).val("");
276                     }
277                 }
278             }
279             // 调用点击回调处理函数,若有需要可以使用
280             try {
281                 afterQueryClick(this.queryArr[resRow], this.queryFlag, this);
282             } catch (ex) {
283             }
284             // 隐藏下拉选项
285             $('#_queryInf').hide(50);
286         }
287     },
288     
289     /**
290      * 设置下拉菜单选择项,支持大小写进行匹配
291      *
292      * @param value
293      *            录入框值
294      */
295     find : function(value) {
296         if (value != "") {
297             // 将字符串转换成小写
298             value = value.toLowerCase();
299             // 循环下拉选项数组
300             for ( var row = 0; row < this.queryArr.length; row++) {
301                 // 将数组转换成小写字符串
302                 var queryStr = this.queryArr[row].join("-").toLowerCase();
303                 // 匹配下拉选项的值
304                 if (value.length <= queryStr.length
305                         && value == queryStr.substring(0, value.length)) {
306                     // 设置选择项
307                     $('#_qInf > option:nth-child(' + (row + 1) + ')').attr(
308                             'selected', true);
309                     break;
310                 }
311             }
312         }
313     },
314     
315     /**
316      * 设置下拉选项显示信息
317      *
318      * @param queryArrStr
319      *            下拉选项显示信息字符串
320      */
321     setArr : function(queryArrStr) {
322         // 设置下拉选项显示信息字符串
323         this.queryArrStr = queryArrStr;
324         // 返回本对象
325         return this;
326     },
327     
328     /**
329      * 设置下拉选项显示坐标
330      *
331      * @param doc
332      *            下拉选项调用对象
333      */
334     setXY : function(doc) {
335         this.x = 0;
336         this.y = doc.offsetHeight;
337         // 累加父窗口坐标
338         while (doc.offsetParent) {
339             this.x += doc.offsetLeft;
340             this.y += doc.offsetTop;
341             doc = doc.offsetParent;
342         }
343     },
344     
345     /**
346      * 显示信息字符串拆分函数
347      *
348      * @param queryArrSrt
349      *            待拆分字符串
350      */
351     arrSplit : function(queryArrSrt) {
352         // 拆分ajax返回字符串生成二维数组
353         // 按|拆分行
354         var queryArr = queryArrSrt.split("|");
355         for ( var row = 0; row < queryArr.length; row++) {
356             // 按^拆分列
357             queryArr[row] = queryArr[row].split("^");
358         }
359         this.queryArr = queryArr;
360     }
361 };
362 
363 // 实例化对象
364 var query = new LQuery();

 作者:张成轩