search_template.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. var $searchtResult = $("#search_result"),
  2. $noResultWrap = $("#no_result_wrap"),
  3. $searchSuggest = $("#searchValWrap");
  4. var page = 1,
  5. pagesize = 15,
  6. hasMore = true,
  7. searchKey = "";
  8. mui.init();
  9. // 页面业务处理流程开始
  10. new Promise(function(resolve, reject) {
  11. mui.plusReady(function() {
  12. resolve(true);
  13. initKeyboardAndroid();
  14. });
  15. }).then(function() {
  16. initScroll();
  17. bindEvents();
  18. $('#search-input').focus();
  19. openSoftKeyboard();
  20. }).catch(function(e) {
  21. plus.nativeUI.closeWaiting();
  22. console && console.error(e);
  23. });
  24. function initScroll(){
  25. //阻尼系数
  26. var deceleration = mui.os.ios?0.003:0.0009;
  27. mui('.mui-scroll-wrapper').scroll({
  28. bounce: false,
  29. indicators: true, //是否显示滚动条
  30. deceleration:deceleration
  31. });
  32. mui('.mui-scroll-wrapper').pullRefresh({
  33. down: {
  34. callback: function() {
  35. setTimeout(function() {
  36. searchByPaging(true);
  37. mui('.mui-scroll-wrapper').pullRefresh().endPulldownToRefresh();
  38. }, 1000);
  39. }
  40. },
  41. up:{
  42. contentrefresh: '正在加载...',
  43. callback: function(){
  44. var self = this;
  45. setTimeout(function() {
  46. searchByPaging(false);
  47. mui('.mui-scroll-wrapper').pullRefresh().endPullupToRefresh(!hasMore);
  48. }, 1000);
  49. }
  50. }
  51. });
  52. }
  53. function bindEvents(){
  54. $('#cancel').on('click', function(){
  55. mui.back();
  56. });
  57. $("#search-input").on('input', function(){
  58. var html = $(this).val();
  59. var reg = new RegExp("<"+"(?!>)","gi");
  60. html = html.replace(reg,'&lt');
  61. var reg = new RegExp(">"+"(?!>)","gi");
  62. html = html.replace(reg,'&gt');
  63. $('#searchVal').html(html);
  64. $(".searchbar-clear").toggle($(this).val() != "");
  65. $searchSuggest.toggle($(this).val()!="");
  66. $searchtResult.hide();
  67. $noResultWrap.hide();
  68. }).on('keyup',function(e) {
  69. if (e.which === 13) {
  70. $searchSuggest.hide();
  71. searchByPaging(true);
  72. }
  73. });
  74. $(".searchbar-clear").on('click', function(){
  75. $(this).hide();
  76. $("#search-input").val("");
  77. $('#searchVal').html("");
  78. $searchSuggest.hide();
  79. });
  80. $("form").on('submit', function(){
  81. searchByPaging(true);
  82. return false;
  83. });
  84. $searchSuggest.on('click',function() {
  85. $searchSuggest.hide();
  86. searchByPaging(true);
  87. });
  88. $("#result_list").on('tap', "li",function(){
  89. var $this = $(this),
  90. code = $this.attr("data-code"),
  91. info = $this.attr("data-json");
  92. openWebview("template_info.html", {template_id: code, info: JSON.parse(info)});
  93. });
  94. }
  95. function searchByPaging(isInit){
  96. page = isInit ? 1 : page;
  97. searchKey = $("#search-input").val();
  98. var url = "/doctor/questionnaire/getTemplateByLabelOrTitle",
  99. params = {name: searchKey, pageNo: page, pageSize: pagesize};
  100. sendGet(url, params, null, function(res){
  101. if(res.status == 200){
  102. page ++;
  103. if(isInit && res.data.length == 0){
  104. $("#no_result_wrap").show();
  105. $(".mui-scroll-wrapper").hide();
  106. }else{
  107. $("#no_result_wrap").hide();
  108. $(".mui-scroll-wrapper").show();
  109. if(res.data.length < pagesize){
  110. hasMore = false;
  111. isInit && mui(".mui-scroll-wrapper").pullRefresh().endPullupToRefresh(!hasMore);
  112. }else{
  113. hasMore = true;
  114. }
  115. var list = _.map(res.data, function(o){
  116. var label_text = "";
  117. o.jsonStr = JSON.stringify(o);
  118. for(i=0; i<o.label.length; i++){
  119. var ml = (i>0)? 'ml10' : "";
  120. label_text += '<span class="c-f14 flag c-333 '+ml+'">'+o.label[i]+'</span>';
  121. }
  122. o.label_text = label_text;
  123. return o;
  124. });
  125. var html = template("result_tmp", {list: res.data});
  126. if(isInit){
  127. $("#result_list").empty().append(html);
  128. }else{
  129. $("#result_list").append(html);
  130. }
  131. ellipsisText($("#result_list").find('li'),searchKey);
  132. }
  133. }
  134. }, true);
  135. }
  136. function getRowProps($el) {
  137. var $textEllipsis = $el,
  138. $text = $textEllipsis.eq(0),
  139. $chart = $text.text('a'),
  140. enWidth = $chart.width(),
  141. $chart = $text.text('中'),
  142. zhWidth = $chart.width(),
  143. lineHeight = parseFloat($chart.css("lineHeight"), 10),
  144. rowHeight = $chart.height();
  145. $chart.text('');
  146. return {
  147. chartWidth: {
  148. zh: zhWidth,
  149. en: enWidth
  150. },
  151. rowHeight: Math.max(rowHeight, lineHeight),
  152. rowWidth: $el.width()
  153. };
  154. }
  155. function replaceAll(text, arr) {
  156. var html = text;
  157. _.each(arr,function(kw) {
  158. var reg = new RegExp(kw+"(?!>)","gi");
  159. html = html.replace(reg,'<em>'+kw+'</em>');
  160. });
  161. return html;
  162. }
  163. function highlineKeyword($el,searchText) {
  164. var props = getRowProps($el),
  165. chartWidth = props.chartWidth,
  166. rowHeight = props.rowHeight,
  167. rowWidth = props.rowWidth,
  168. // 每行显示字符数(以中文字符为标准计算)
  169. chartNum = Math.floor(rowWidth / chartWidth.zh),
  170. // 排除指定数量字符所占宽度
  171. exceptNum = 0,
  172. // 行数
  173. rowNum = 1,
  174. // 预计显示总字符数
  175. expectedNum = chartNum * rowNum - exceptNum,
  176. $target = $el,
  177. // 目标文本
  178. text = $.trim($target.attr('data-text')),
  179. length = text.length,
  180. // 关键字数组
  181. kws = $.trim(searchText).replace(/\s+/g," ").split(" ");
  182. var fidx = 0,preFidx,diff = 0;
  183. $target.html(replaceAll(text, kws));
  184. if(Math.floor($target.height() / rowHeight) <= rowNum) {
  185. return ;
  186. }
  187. if(text.length > expectedNum) {
  188. fidx = text.indexOf(kws[0])+kws[0].length-1;
  189. diff = fidx - expectedNum + 1;
  190. preFidx = fidx;
  191. diff = (diff<0)?0:diff;
  192. var preChar = (diff>0)?"...":"";
  193. $target.html(preChar+replaceAll(text.slice(diff,preFidx+1), kws)+"...");
  194. while((Math.floor($target.height() / rowHeight) <= rowNum) && (preFidx < length)) {
  195. preFidx++;
  196. $target.html(preChar+replaceAll(text.slice(diff,preFidx+1), kws)+"...");
  197. }
  198. if(preFidx == length && (Math.floor($target.height() / rowHeight) <= rowNum)) {
  199. diff = diff>0?(diff - 1):0;
  200. $target.html(preChar+replaceAll(text.slice(diff,preFidx), kws));
  201. } else if((Math.floor($target.height() / rowHeight) > rowNum)) {
  202. $target.html(preChar+replaceAll(text.slice(diff,preFidx), kws)+"...");
  203. }
  204. }
  205. }
  206. function ellipsisText($elements, searchText) {
  207. //$el.ellipsis({ row: 2});
  208. _.each($elements,function(el) {
  209. var $textEl = $(el).find(".j-text-ellipsis");
  210. _.each($textEl, function(t){
  211. highlineKeyword($(t),searchText);
  212. });
  213. });
  214. }