模仿写一个listbox的功能, 这里只完成部分的功能. 因为完整的应该是与服务端交互, 根据搜索的关键进行匹配. 然后可以利用键盘 或者 鼠标来选择推荐出来的内容. 这里只实现选择的功能. 只要是JS部分的代码.
第一步: CSS代码
.ac-renderer { width: 600px; top: 33px; left: 1px; position: absolute; top: 35px; left: 1px; z-index: 10; background: #fff; border: solid 1px #999\0; border: 0 none rgba(0,0,0,0); -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.5); -moz-box-shadow: 0 1px 4px rgba(0,0,0,.5); box-shadow: 0 1px 4px rgba(0,0,0,.5); } .ac-row { cursor: pointer; padding: 8px; zoom: 1; clear: both; } .ac-renderer>.ac-row:first-child { border-radius: 5px 5px 0 0; } .ac-active { background-color: #d6e9f8; } .ac-row .zm-item-img-avatar { margin: 2px 10px 0 0; width: 25px; height: 25px; } .zm-item-img-avatar { border-radius: 2px; } .zg-left { float: left; } .autocomplete-row-name { margin: 0 0 1px 35px; display: block; line-height: 1.2; height: 1.2em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .zu-autocomplete-row-description { color: #999; display: block; font-size: 12px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; line-height: 14px; height: 14px; zoom: 1; }
第二步: 页面代码
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="../../../main/js/global/jquery/1.8/jquery-1.8.1.js"></script> <script src="../../../main/plugin/listbox/jquery.listbox.js"></script> <link rel="stylesheet" href="../../../main/plugin/listbox/listbox.css"/> </head> <body> <center> <div> <input id="box" type="text" value="" placeholder="输入关键字"/> </div> </center> <script> var this$ = $('#box'); var html = [ '<div class="ac-row ac-active active" id=":3g" role="option" style="-webkit-user-select: none;">', '<img class="zm-item-img-avatar zg-left" src="310d85e8d_m.jpg" style="-webkit-user-select: none;">', '<span title="足球" style="-webkit-user-select: none;">足球1111</span>', '<span class="zg-gray-normal zu-autocomplete-row-description" style="-webkit-user-select: none;">', '又称<b style="-webkit-user-select: none;">s</b>occer,222955 人关注', '</span>', '</div>', '<div id=":4g" role="option" style="-webkit-user-select: none;">', '<img class="zm-item-img-avatar zg-left" src="310d85e8d_m.jpg" style="-webkit-user-select: none;">', '<span title="足球" style="-webkit-user-select: none;">足球22222</span>', '<span class="zg-gray-normal zu-autocomplete-row-description" style="-webkit-user-select: none;">', '又称<b style="-webkit-user-select: none;">s</b>occer,222955 人关注', '</span>', '</div>', '<div id=":5g" role="option" style="-webkit-user-select: none;">', '<img class="zm-item-img-avatar zg-left" src="310d85e8d_m.jpg" style="-webkit-user-select: none;">', '<span title="足球" style="-webkit-user-select: none;">足球33333</span>', '<span class="zg-gray-normal zu-autocomplete-row-description" style="-webkit-user-select: none;">', '又称<b style="-webkit-user-select: none;">s</b>occer,222955 人关注', '</span>', '</div>' ].join(''); var options = { width: 300, bodyHtml: html, target: this$, targetWrap: this$.parent(), afterSelected: function (value) { alert(value.html()); } }; var listBoxUtil = new ListBoxUtil(options); listBoxUtil.init(); </script> </body> </html>
第三步: 核心JS代码
(function ($) { ListBoxUtil = function (options) { this.options = options || {}; this.target = null; this.targetWrap = null; this.width = 600; this.top = 0; this.left = 0; this.id = "listbox"; this.bodyHtml = ""; this.currentIndex = 0; this.callFunction = null; var html = [ '<div class="ac-renderer" role="listbox" id="' + this.id + '" style="-webkit-user-select: none;">', '</div>' ].join(''); this.listbox = $(html); }; ListBoxUtil.prototype.init = function () { var this$ = this; this$.setConfig(); this$.mouseHover(); this$.keyup(); this$.bindClick(); this$.target.on('focus', function () { this$.show(); }).on('blur', function () { setTimeout(function () { this$.hide() }, 150); }); }; ListBoxUtil.prototype.setConfig = function () { if (this.options != null) { if (this.options['target']) { this.target = this.options['target']; } if (this.options['targetWrap']) { this.targetWrap = this.options['targetWrap']; } if (this.options['width']) { this.listbox.width(this.options['width']); } if (this.options['bodyHtml']) { this.listbox.append(this.options['bodyHtml']); } if (this.options['left']) { this.listbox.left(this.options['left']); } else { this.listbox.css("left", this.target.offset().left); } if (this.options['top']) { this.listbox.top(this.options['top']); } else { this.listbox.css("top", this.target.offset().top + this.target.height() + 10); } if (this.options['callFunction']) { this.callFunction = this.options['callFunction']; } this.targetWrap.append(this.listbox); } }; ListBoxUtil.prototype.mouseHover = function () { var this$ = this; this.listbox.children().hover( function () { this$.listbox.children().removeClass('ac-active active'); $(this).addClass("ac-active active"); // } ); }; ListBoxUtil.prototype.keyMove = function (e) { var listChild = this.listbox.children().removeClass("ac-active active"); // 向上 if (e.keyCode == 38) { if (this.currentIndex > 0) { this.currentIndex--; } else { this.currentIndex = listChild.length - 1; } } // 向下 else if (e.keyCode == 40) { if (this.currentIndex == listChild.length - 1) { this.currentIndex = 0; } else { this.currentIndex++; } } listChild.eq(this.currentIndex).addClass("ac-active active"); }; ListBoxUtil.prototype.hide = function () { this.listbox.hide(); }; ListBoxUtil.prototype.show = function () { this.listbox.show(); }; ListBoxUtil.prototype.bindClick = function () { var this$ = this; this$.listbox.children().on('click', function () { if (this$.options.afterSelected) { this$.options.afterSelected($(this)); } }); }; ListBoxUtil.prototype.enter = function (e) { var this$ = this; var curentChild = this$.listbox.children().eq(this$.currentIndex); if (this$.options.afterSelected) { this$.options.afterSelected(curentChild); } }; ListBoxUtil.prototype.keyup = function () { var this$ = this; this.target.on('keyup', function (e) { if (e.keyCode == 38 || e.keyCode == 40) { this$.keyMove(e); } else if (e.keyCode == 13) { this$.enter(e); } }); }; })(jQuery);
效果图:
虽然代码非常的简单, 但也是我第一次这么认真的写JS代码. 以后还是得前后坚固才行.