AutoComplete.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. if (typeof FlowUtil == 'undefined') {
  2. AutoComplete = {};
  3. }
  4. /**
  5. * 以别名alias为键,缓存该别名所搜索过的数据
  6. */
  7. var cache = {};
  8. var matchPattern =new RegExp('\\[[^\\]]+\\]','g');
  9. /**
  10. * 需要引用的样式及js<br>
  11. * &lt;link rel="stylesheet" href="${ctx}/js/jquery-ui-portlet/lib/themes/jquery-ui.css"&gt;<br>
  12. * &lt;script type="text/javascript" src="${ctx}/js/jquery-ui-portlet/lib/jquery-1.8.3.js"&gt;&lt;/script&gt;<br>
  13. * &lt;script src="${ctx}/js/jquery-ui-portlet/lib/jquery.ui.core.js"&gt;&lt;/script&gt;<br>
  14. * &lt;script src="${ctx}/js/jquery-ui-portlet/lib/jquery.ui.widget.js"&gt;&lt;/script&gt;<br>
  15. * &lt;script src="${ctx}/js/jquery-ui-portlet/lib/jquery.ui.position.js"&gt;&lt;/script&gt;<br>
  16. * &lt;script src="${ctx}/js/jquery-ui-portlet/lib/jquery.ui.menu.js"&gt;&lt;/script&gt;<br>
  17. * &lt;script src="${ctx}/js/jquery-ui-portlet/lib/jquery.ui.autocomplete.js"&gt;&lt;/script&gt;<br>
  18. * &lt;script type="text/javascript" src="${ctx}/js/util/json2.js"&gt;&lt;/script&gt;<br>
  19. * &lt;script src="${ctx}/js/hotent/platform/form/CommonDialog.js"&gt;&lt;/script&gt;<br>
  20. */
  21. AutoComplete.init = function(){
  22. $('[autoQuery]').each(function(){
  23. var self = $(this);
  24. AutoComplete.handleInit(self);
  25. });
  26. };
  27. /**
  28. * 处理【自动完成】控件的初始化工作
  29. * @param obj 需要初始化的对象
  30. * <pre>
  31. * &lt;input id="test" type="text" autoQuery="{'alias':'cxyh', 'filter':'FULLNAME|ACCOUNT', 'format':'姓名:[fullname],用户ID[userid]', 'render-format':'[account]', 'isCache':true}"&gt;
  32. * &lt;script&gt;
  33. * var testObj = $('#test');
  34. * autocomplete.handleInit(testObj);
  35. * &lt;/script&gt;
  36. *
  37. * autoQuery参数介绍:
  38. * alias:自定义查询的别名(必需)
  39. * filter:对应自定义查询的条件字段,可传多个,以“|”分隔
  40. * format:格式化自定义查询返回的结果,格式:[返回字段](必需)
  41. * render-format:格式化下拉列表的显示结果,如果为空,则使用上述format属性进行格式化显示
  42. * isCache:是否使用js缓存返回的结果集
  43. * minLength:最小输入长度,默认为0(即时搜索)。比如设置minLength:2,则在输入至少2个字符时才会去发起数据请求
  44. * maxResult:最多返回的记录数,默认为10,即返回前10条记录
  45. * </pre>
  46. */
  47. AutoComplete.handleInit = function(obj){
  48. var self = $(obj);
  49. var autoQuery = eval("("+self.attr('autoQuery')+")");
  50. if(!autoQuery) return;
  51. var opinion = {
  52. /**
  53. * 使用format格式化返回结果
  54. * @param item 数据
  55. * @param format 格式化格式,默认使用autoQuery里的format属性:员工姓名-[fullname]
  56. */
  57. getFormatItem: function(item, format){
  58. if(!format) format = autoQuery.format;
  59. if(!format) return "无格式化format属性";
  60. //返回的字段貌似都是小写
  61. format = format.toLowerCase();
  62. //使用全局定义的正则获取括号及内容
  63. var result = format.match(matchPattern);
  64. if(!result || result.length<1) return false;
  65. for(var i=0;i<result.length;i++) {
  66. var tmp = result[i].trim();
  67. var fieldName = tmp.replace(/[\[|\]]/g, '');
  68. format = format.replace(tmp, item[fieldName]);
  69. }
  70. return format;
  71. },
  72. source: function(request, response) {
  73. var alias = autoQuery.alias;
  74. var filter = autoQuery.filter;
  75. var filters = [];
  76. if(filter) {
  77. filters = filter.split('|');
  78. }
  79. var term = request.term;
  80. var isCache = autoQuery.isCache;
  81. if (isCache){
  82. var aliasCache = cache[alias];
  83. if(aliasCache && term in aliasCache){
  84. response(aliasCache[term]);
  85. return;
  86. }
  87. }
  88. var queryObj = {};
  89. var filterValue = self.val();
  90. for(var i=0;i<filters.length;i++){
  91. queryObj[filters[i]] = filterValue;
  92. }
  93. var maxResult = autoQuery.maxResult;
  94. if(!maxResult) maxResult = 10;
  95. var condition = {alias:alias,page:1,pagesize:maxResult,querydata:JSON2.stringify(queryObj)};
  96. DoQuery(condition,function(data){
  97. var dataErrors = data.errors;
  98. if(dataErrors){
  99. alert(dataErrors);
  100. return;
  101. }
  102. var dataList = data.list;
  103. if (isCache) {
  104. if(!cache[alias]) cache[alias] = {};
  105. cache[alias][term] = dataList;
  106. }
  107. response(dataList);
  108. });
  109. },
  110. focus: function(event, ui) {
  111. self.val(opinion.getFormatItem(ui.item));
  112. return false;
  113. },
  114. select: function(event, ui) {
  115. self.val(opinion.getFormatItem(ui.item));
  116. return false;
  117. }
  118. };
  119. var minLength = autoQuery.minLength;
  120. if(minLength && minLength>0){
  121. opinion.minLength = minLength;
  122. }
  123. self.autocomplete(opinion)
  124. .data("autocomplete")._renderItem = function(ul, item) {
  125. var format = autoQuery['render-format'];
  126. //如果render-format属性为空,则会直接使用format进行显示
  127. var result = opinion.getFormatItem(item, format);
  128. return $("<li>")
  129. .data("item.autocomplete", item)
  130. .append("<a>" + result + "</a>")
  131. .appendTo(ul);
  132. };
  133. };
  134. $(function(){
  135. AutoComplete.init();
  136. })