在输入框中输入内容,下拉出现自动提示列表,鼠标上下键选择提示中的项,然后回车选择相应的项。
实现原理:JS 监听输入框的 kedown、keyup、focusout 事件。
- 输入内容的时候 keyup 触发调取后台数据,并接收返回的数据弹出自动提示内容。
- 键盘按下的时候 keydown 判断是否是上下键、回车键、退格删除键,如果是上下键,通过 js 改变相应内容的显示状态标为当前状态,如果是回车键,将标记为当前选中状态的内容添加到目标 HTML 标签中,如果是回退删除键判断下输入框里面是否有内容,如果没内容删除目标 HTML 标签中最后添加的元素。
- 当 input 框失去焦点的时候出发 focusout 事件,执行隐藏提示内容。
下面看下示例代码吧!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| $(function(){ $('#tag-search').on('keydown', function(event){ var curKeyCode = event.keyCode || event.which; if (curKeyCode == 38) { keychang("up"); event.preventDefault(); } else if (curKeyCode == 40) { keychang(); event.preventDefault(); } else if (curKeyCode == 13) { checkTagname(); $('#tag-tip').hide(); event.preventDefault(); } else if (curKeyCode == 8) { if ($('#tag-search').val() == '') { $('#tag-content :last-child.span-one-tag').remove(); } } }).on('focusout', function(){ $('#tag-tip').hide(); }).on('keyup', function(){ var tagname = $('#tag-search').val(); if (tagname != searchForTagname) { searchForTagname = tagname; $.ajax({ type:'GET' ,url:apiSearchTag ,data: {tagname:tagname} ,dataType:'json' ,success:function(response) { var tags = response.data; if (tags.length > 0) { var tiphtml = ['<ul class="tag-search-list">']; var i=0; for(var i= 0; i<tags.length; i++) { tiphtml.push('<li data-id="'+tags[i]['id']+'">'+ tags[i]['tagname']+'</li>'); } tiphtml.push('</ul>') tiphtml = tiphtml.join(''); $('#tag-tip').html(tiphtml).show(); $('#tag-tip>ul>li:eq(0)').addClass('hover'); } else { if ($('#tag-tip').html() != '') { $('#tag-tip').html(''); } } } }); } }); $('#tag-tip').on('mouseenter', '.tag-search-list li', function(){ $(this).addClass('hover').siblings().removeClass('hover'); });
function keychang(up) { var $list = $('.tag-search-list'); var hover = $list.children('.hover'), index = hover.index(); if (up == "up") { if (index == 0) { hover.removeClass('hover'); $list.children('li:last').addClass('hover'); } else { hover.removeClass('hover').prev().addClass('hover'); } } else { if (index == ($list.children('li').length - 1)) { hover.removeClass('hover'); $list.children('li:first').addClass('hover'); } else { hover.removeClass('hover').next().addClass('hover'); } } }
function checkTagname() { var tagname = $('.tag-search-list').children('.hover').text(); var tagid = $('.tag-search-list').children('.hover').attr('data-id'); $('#tag-content').append('<span class="span-one-tag">#'+ tagname+'<input type="hidden" name="tag[]" value="'+tagid+'"><span>x</span></span>'); $('#tag-search').val(''); }
$('#tag-content').on('click', '.span-one-tag span', function(){ $(this).parent().remove(); }); });
|