自动补全 多输入, 适合新闻标签

2015年5月12日 20:16:48 星期二

js+css

  1 <script type="text/javascript">
  2 var ac_domain = ‘http://‘+document.domain+‘/‘;
  3 initAutoComplete();
  4 function initAutoComplete()
  5 {
  6     var ac_input = document.getElementById(‘auto_complete_input‘);
  7     if (!ac_input) {return false;}
  8     var ac_rebuildindex = document.getElementById(‘rebuild_autocomplete_index‘);
  9
 10     if (document.attachEvent) {
 11         ac_input.attachEvent(‘oninput‘, input_autocomplete); //输入时进行自动补全
 12         // ac_input.attachEvent(‘onblur‘, hide_autocomplete); //鼠标点击其它地方隐藏div, 屏蔽 因为onblur 和 onclick 冲突
 13         ac_input.attachEvent(‘onfocus‘, input_autocomplete); //输入框重新获取焦点时显示自动补全结果
 14         ac_input.attachEvent(‘onkeydown‘, input_autocomplete_keydown); //处理按键信息
 15         ac_rebuildindex.attachEvent(‘onclick‘, rebuild_autocomplete_index);
 16     } else {
 17         ac_input.addEventListener(‘input‘, input_autocomplete); //输入时进行自动补全
 18         // ac_input.addEventListener(‘blur‘, hide_autocomplete); //鼠标点击其它地方隐藏div, 屏蔽 因为onblur 和 onclick 冲突
 19         ac_input.addEventListener(‘focus‘, input_autocomplete); //输入框重新获取焦点时显示自动补全结果
 20         ac_input.addEventListener(‘keydown‘, input_autocomplete_keydown); //处理按键信息
 21         ac_rebuildindex.addEventListener(‘click‘, rebuild_autocomplete_index);
 22     }
 23
 24     $(document).bind("click",function(e){
 25         var target  = $(e.target);//表示当前对象,切记,如果没有e这个参数,即表示整个BODY对象
 26         if(target.closest(".form-input-autocomplete,#auto_complete_input").length == 0){
 27            hide_autocomplete();
 28         }
 29      })
 30 }
 31
 32 function input_autocomplete()
 33 {
 34     var ac_input = document.getElementById(‘auto_complete_input‘);
 35     var userinput = ac_input.value;
 36     if (!userinput) {return false;}
 37     var arr_new_word = userinput.split(/,\s*/);
 38     var new_word = arr_new_word.pop();
 39
 40     var url = ac_domain+‘chuanshuo/getAutoComplete?word=‘+new_word;
 41     $.get(url,
 42         function(data) {
 43             if (!data) {return false;};
 44             var objGame = eval(‘(‘+data+‘)‘);
 45             html = ‘<ul>‘;
 46             for (var i in objGame) {
 47                 html += ‘<li class="auto_complete_li" data-id="‘+i+‘" data-name="‘+objGame[i]+‘">‘+objGame[i]+‘</li>‘;
 48             }
 49             html += ‘</ul>‘;
 50             var ac_div = $("#auto_complete_div");
 51             ac_div.show();
 52             ac_div.html(html);
 53             click_autocomplete_li(); //注册点击事件
 54         }
 55     );
 56 }
 57
 58 function hide_autocomplete()
 59 {
 60     var ac_div = document.getElementById(‘auto_complete_div‘);
 61     ac_div.style.display = ‘none‘;
 62 }
 63
 64 function click_autocomplete_li()
 65 {
 66     var arr_ac_li = getElementsByClassName(‘auto_complete_li‘, ‘ul‘);
 67     for (var i = 0; i < arr_ac_li.length; i++) {
 68         arr_ac_li[i].addEventListener(‘click‘, function () {
 69             //获取列表li上的数据, 并组装
 70             var data_id = this.getAttribute(‘data-id‘);
 71             var data_name = this.getAttribute(‘data-name‘);
 72             var data_info = data_id+‘|‘+data_name;
 73
 74             //////向隐藏表单上写数据
 75             var already_complete_data = document.getElementById(‘auto_complete_data‘);
 76             var arr_already_data = already_complete_data.value.split(/,/);
 77             arr_already_data.push(data_info);
 78
 79             //去重
 80             var hash_already_data = {};
 81             for (var i in arr_already_data) {
 82                 if (arr_already_data[i]) {
 83                     hash_already_data[arr_already_data[i]] = arr_already_data[i];
 84                 };
 85             }
 86             console.log(hash_already_data);
 87             arr_already_data = [];
 88             for (key in hash_already_data) {
 89                 arr_already_data.push(key);
 90             }
 91             //处理完毕, 写!
 92             var str_already_data = arr_already_data.join(",");
 93             document.getElementById(‘auto_complete_data‘).value = str_already_data;
 94
 95
 96             ///////向输入框写数据
 97             var already_input = document.getElementById(‘auto_complete_input‘);
 98
 99             //去掉用户的输入, 换做用户点击的li里的name
100             var arr_already_input = already_input.value.split(/,\s*/);
101             arr_already_input.pop();
102             arr_already_input.push(data_name);
103
104             //去重
105             var hash_already_input = {};
106             for (var i in arr_already_input) {
107                 hash_already_input[arr_already_input[i]] = arr_already_input[i];
108             }
109             arr_already_input = [];
110             for (key in hash_already_input) {
111                 arr_already_input.push(key);
112             }
113
114             //回写入表单
115             var str_already_input = arr_already_input.join(", ");
116             document.getElementById(‘auto_complete_input‘).value = str_already_input+", ";
117
118             hide_autocomplete();
119         })
120     };
121 }
122
123 function rebuild_autocomplete_index()
124 {
125     var nodeParent = this.parentNode;
126     var url = ac_domain+‘chuanshuo/setAutoComplete‘;
127     $.get(url,
128         function(data) {
129             nodeParent.innerHTML = ‘已经重建索引,再点击输入框试试‘;
130         }
131     );
132 }
133
134 function input_autocomplete_keydown(e)
135 {
136     if (e.keyCode == 8) {
137         //document.getElementById(‘auto_complete_gid‘).value = 0;//按下删除键时,将gid也删除掉
138         input_autocomplete();
139     };
140 }
141
142 function getElementsByClassName(className, tagName)
143 {
144     var t = typeof(document.getElementsByClassName);
145
146     if (t == ‘function‘) {
147         return document.getElementsByClassName(className);
148     }
149
150     var tags, matchedTags;
151     if (tagName) {
152         tags = document.getElementsByTagName(tagName);
153     } else {
154         tags = document.getElementsByTagName(‘*‘);
155     }
156
157     matchedTags = [];
158     for (var i = 0; i < tags.length; i++) {
159         if (tags[i].className.indexOf(className) != -1) {
160             matchedTags.push(tags[i]);
161         }
162     }
163
164     return matchedTags;
165 }
166 </script>
167
168 <style type="text/css">
169     /*自动补全*/
170     .form-input-autocomplete {padding: 0px; width: 200px; border: 1px solid #aaa; display: none; z-index: 99; position: absolute; background-color: #fff; filter: alpha(opacity=100); opacity: 1;}
171     .form-input-autocomplete ul {margin: 0px;padding: 0px; text-align: left; list-style: none; font:15px;}
172     .form-input-autocomplete ul li{margin: 3px;}
173     .form-input-autocomplete ul li:hover{background-color: #eee; cursor:hand;}
174 </style>
175
176 <?php
177 /*
178 <form action="<?= base_url(‘searchGameByName‘); ?>" method="post" class="form-box">
179     <div class="form-group">
180         <label class="form-label">关联游戏: </label>
181         <input id="auto_complete_input" autocomplete="off" type="text" name="gamename" value="<?= empty($gamename) ? ‘‘ : $gamename ?>" class="form-input">
182         <span class="form-tip"><a href="javascript:;" id="rebuild_autocomplete_index">没找到? 点这里试试</a></span>
183         <div class="form-input-autocomplete" id="auto_complete_div"></div>
184         <input id="auto_complete_gid" type="hidden" name="gid" value="<?= empty($gid) ? ‘‘ : $gid ?>">
185     </div>
186     <input type="submit" name="sub" value="搜索" class="btn btn-primary form-submit" />
187 </form>
188 */
189 ?>

html

1 <input name="tag" type="text" id="auto_complete_input" autocomplete="off" placeholder="新闻标签" value=""> &nbsp;<a href="javascript:;" id="rebuild_autocomplete_index">没找到? 点这里试试</a>
2                 <div class="form-input-autocomplete" id="auto_complete_div"></div>
3                 <input id="auto_complete_data" type="hidden" name="tag" value="">

php (php+redis:hash)

 1     public function buildAutoComplete()
 2     {
 3         $key_pre = ‘autoComplete‘;
 4         $value_pre = ‘team_‘;
 5
 6         //删除之前所有的旧值
 7         $this->redis->del($key_pre);
 8
 9         //重新构建
10         $team = $this->redis->hgetall( ‘LeagueTeamsNames‘);
11
12         $info = array();
13         foreach ($team as $lid => $jsonTeam) {
14             $arrTeam = json_decode($jsonTeam, true);
15             foreach ($arrTeam as $name => $tid) {
16                 $length = mb_strlen($name, ‘UTF-8‘);
17                 for ($i=0; $i < $length; $i++) {
18                     $strOne = mb_substr($name, $i, 1, ‘UTF-8‘);
19                     $value = $value_pre.$tid.‘_‘.$lid;
20                     $info[$strOne][$value] = $value; //懒得去重了
21                 }
22             }
23         }
24         $info_redis = array();
25         foreach ($info as $word => $ids) {
26             $a = array_values($ids);
27             $info_redis[$word] = json_encode($a);
28         }
29         $this->redis->hmset($key_pre, $info_redis);
30         exit(‘over‘);
31     }
32
33     public function getAutoComplete()
34     {
35         $word = common::request(‘word‘, ‘G‘);
36         $key_pre = ‘autoComplete‘;
37         $value_pre = ‘team_‘;
38
39         if (empty($word)) {
40             exit(‘0‘);
41         }
42         $intWordLength = mb_strlen($word, ‘UTF-8‘);
43
44         $arrId = array();
45         if (1 == $intWordLength) {
46             $jsonId = $this->redisSlave->hget($key_pre, $word);
47             $arrId = json_decode($jsonId, true);
48         } else {
49             for ($i=0; $i < $intWordLength; $i++) {
50                 $strOne = mb_substr($word, $i, 1, ‘UTF-8‘);
51                 $jsonIdTmp = $this->redisSlave->hget($key_pre, $strOne);
52                 $arrIdTmp = json_decode($jsonIdTmp, true);
53                 $arrIdTmp = $arrIdTmp ? $arrIdTmp : array();
54
55                 $arrId = empty($arrId) ? $arrIdTmp : $arrId;
56                 $b = array_intersect($arrId, $arrIdTmp);
57
58                 $arrId = empty($b) ? $arrId : $b; // 新输入的词如果跟之前的没有交集, 就维持原来的交集不变
59             }
60         }
61
62         $a = array();
63         $arrId = empty($arrId) ? array() : $arrId;
64         foreach ($arrId as $v) {
65             $id = ltrim($v, $value_pre);
66             $a[$id] = $v;
67         }
68
69         $jsonGame = json_encode($a);
70         exit($jsonGame);
71     }
时间: 2024-10-14 11:40:01

自动补全 多输入, 适合新闻标签的相关文章

0008 vim括号引号html标签自动补全

问题:怎样在vim中实现花括号引号自动补全,包括html标签? 解决办法:只要把下面两段代码粘贴到~/.vimrc中,就可以实现括号超强补全 <!--括号引号补全代码{{{--> " 括号引号补全 inoremap ( ()<Esc>i inoremap [ []<Esc>i inoremap { {<CR>}<Esc>O inoremap ) <c-r>=ClosePair(')')<CR> inoremap

UITextFiled自动补全输入,选中补全内容。NSRange和UITextRange的相互转换。-b

有个需求就是 需要用户输入几位以后账号,可以根据本地存储的登录成功的账号,进行自动补全,并且补全内容为选中状态,不影响用户的新输入. 研究了一下,下面是完整的实现的方法. 补充个下载地址http://download.csdn.net/detail/darkmengqi/8426463 写在 textFiled的delegate里面,这样当有输入时会调用此方法. [objc] view plain copy -(BOOL)textField:(UITextField *)textField sh

JS实现在输入框内输入@时,邮箱账号自动补全

<!DOCTYPE HTML> <html lang="en"> <head> <meta charset="utf-8"/> <title>邮箱自动补全</title> <style type="text/css"> .wrap{width:200px;margin:0 auto;} h1{font-size:36px;text-align:center;lin

iOS 身份证最后一位是X,输入17位后自动补全X(转)

非原创,转载自http://blog.csdn.net/l2i2j2/article/details/51542028如果身份证最后一位是X,输入17位后自动补全X// textField代理方法 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { // string.length为0,表明没有输

[Android] AutoCompleteTextView:自动完成输入内容的控件(自动补全)

AutoCompleteTextView是EditText的直接子类,与普通EditText的最大不同就是,在用户输入的过程中,可以列出可供选择的输入项,方便使用者. AutoCompleteTextView与普通EditText控件使用方法类似,只是需要为其指定一个Adapter对象,绑定可供选择的输入项. AutoCompleteTextView可实现一次自动完成的功能,而另一个控件MultiAutoCompleteTextView,可以连续多次自动完成,即在通过自动完成一个输入项,接着输入

javascript 邮箱输入自动补全插件(转)

<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>inputSuggest_0.1.js</title> <style type="text/css"> body{margin:0;padding:0;} input{width:200px;} .suggest-container{border:1px solid

React-如何在jsx中自动补全标签(vscode)

痛点:  React库最近的增长趋势很明显, 很多朋友都在选择学习, 很多公司也在选择使用React栈. 但在使用React库写代码的时候, 有一个很让人苦恼的问题, 就是标签在jsx语法中不能自动补全(vscode) 那我们经常会想到下载对应的插件来解决这个问题, 可以我们尝试了多个插件之后, 还是解决不了这个问题.  所以小编就深入的对这个东西进行了研究. 发现在vscode的设置中就可以配置. 配置的具体代码是: "emmet.includeLanguages": {     &

Eclipse自动补全功能和自动生成作者、日期注释等功能设置

以前想实现添加代码作者信息的东西,但不知道怎样实现,今天终于在网上无意中找到解决办法了 Eclipse自动生成作者.日期注释等功能设置 在使用Eclipse 编写Java代码时,自动生成的注释信息都是按照预先设置好的格式生成的. 修改作者.日期注释格式:打开Windows->Preferences->Java->Code Style->Code Templates,点击右边窗口中的Comments,可以看到有很多选项,我们便可对此注释信息模板进行编辑. 如我们希望在一个Java文件

【Bootstrap】 typeahead自动补全

typeahead 这篇文章记录了我在使用typeahead的一些问题,不是很全,但是基本够用. Bootstrap提供typeahead组件来完成自动补全功能. 两种用法: 直接给标签添加属性 <input type="text" data-provide="typeahead"> 通过设置autocomplete="off"来关闭浏览器自带的自动补全功能,以防跟我们的产生冲突. 通过JavaScript 调用$('.typeahe