截流自动化的商城平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

iconPicker.js 22KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. /**
  2. * Layui图标选择器
  3. * @author wujiawei0926@yeah.net
  4. * @version 1.1
  5. */
  6. layui.define(['laypage', 'form'], function (exports) {
  7. "use strict";
  8. var IconPicker =function () {
  9. this.v = '1.1';
  10. }, _MOD = 'iconPicker',
  11. _this = this,
  12. $ = layui.jquery,
  13. laypage = layui.laypage,
  14. form = layui.form,
  15. BODY = 'body',
  16. TIPS = '请选择图标';
  17. /**
  18. * 渲染组件
  19. */
  20. IconPicker.prototype.render = function(options){
  21. var opts = options,
  22. // DOM选择器
  23. elem = opts.elem,
  24. // 数据类型:fontClass/unicode
  25. type = opts.type == null ? 'fontClass' : opts.type,
  26. // 是否分页:true/false
  27. page = opts.page == null ? true : opts.page,
  28. // 每页显示数量
  29. limit = opts.limit == null ? 12 : opts.limit,
  30. // 是否开启搜索:true/false
  31. search = opts.search == null ? true : opts.search,
  32. // 每个图标格子的宽度:'43px'或'20%'
  33. cellWidth = opts.cellWidth,
  34. // 点击回调
  35. click = opts.click,
  36. // 渲染成功后的回调
  37. success = opts.success,
  38. // json数据
  39. data = {},
  40. // 唯一标识
  41. tmp = new Date().getTime(),
  42. // 是否使用的class数据
  43. isFontClass = opts.type === 'fontClass',
  44. // 初始化时input的值
  45. ORIGINAL_ELEM_VALUE = $(elem).val(),
  46. TITLE = 'layui-select-title',
  47. TITLE_ID = 'layui-select-title-' + tmp,
  48. ICON_BODY = 'layui-iconpicker-' + tmp,
  49. PICKER_BODY = 'layui-iconpicker-body-' + tmp,
  50. PAGE_ID = 'layui-iconpicker-page-' + tmp,
  51. LIST_BOX = 'layui-iconpicker-list-box',
  52. selected = 'layui-form-selected',
  53. unselect = 'layui-unselect';
  54. var a = {
  55. init: function () {
  56. data = common.getData[type]();
  57. a.hideElem().createSelect().createBody().toggleSelect();
  58. a.preventEvent().inputListen();
  59. common.loadCss();
  60. if (success) {
  61. success(this.successHandle());
  62. }
  63. return a;
  64. },
  65. successHandle: function(){
  66. var d = {
  67. options: opts,
  68. data: data,
  69. id: tmp,
  70. elem: $('#' + ICON_BODY)
  71. };
  72. return d;
  73. },
  74. /**
  75. * 隐藏elem
  76. */
  77. hideElem: function () {
  78. $(elem).hide();
  79. return a;
  80. },
  81. /**
  82. * 绘制select下拉选择框
  83. */
  84. createSelect: function () {
  85. var oriIcon = '<i class="layui-icon">';
  86. // 默认图标
  87. if(ORIGINAL_ELEM_VALUE === '') {
  88. if(isFontClass) {
  89. ORIGINAL_ELEM_VALUE = 'layui-icon-circle-dot';
  90. } else {
  91. ORIGINAL_ELEM_VALUE = '&#xe617;';
  92. }
  93. }
  94. if (isFontClass) {
  95. oriIcon = '<i class="layui-icon '+ ORIGINAL_ELEM_VALUE +'">';
  96. } else {
  97. oriIcon += ORIGINAL_ELEM_VALUE;
  98. }
  99. oriIcon += '</i>';
  100. var selectHtml = '<div class="layui-iconpicker layui-unselect layui-form-select" id="'+ ICON_BODY +'">' +
  101. '<div class="'+ TITLE +'" id="'+ TITLE_ID +'">' +
  102. '<div class="layui-iconpicker-item">'+
  103. '<span class="layui-iconpicker-icon layui-unselect">' +
  104. oriIcon +
  105. '</span>'+
  106. '<i class="layui-edge"></i>' +
  107. '</div>'+
  108. '</div>' +
  109. '<div class="layui-anim layui-anim-upbit" style="">' +
  110. '123' +
  111. '</div>';
  112. $(elem).after(selectHtml);
  113. return a;
  114. },
  115. /**
  116. * 展开/折叠下拉框
  117. */
  118. toggleSelect: function () {
  119. var item = '#' + TITLE_ID + ' .layui-iconpicker-item,#' + TITLE_ID + ' .layui-iconpicker-item .layui-edge';
  120. a.event('click', item, function (e) {
  121. var $icon = $('#' + ICON_BODY);
  122. if ($icon.hasClass(selected)) {
  123. $icon.removeClass(selected).addClass(unselect);
  124. } else {
  125. // 隐藏其他picker
  126. $('.layui-form-select').removeClass(selected);
  127. // 显示当前picker
  128. $icon.addClass(selected).removeClass(unselect);
  129. }
  130. e.stopPropagation();
  131. });
  132. return a;
  133. },
  134. /**
  135. * 绘制主体部分
  136. */
  137. createBody: function () {
  138. // 获取数据
  139. var searchHtml = '';
  140. if (search) {
  141. searchHtml = '<div class="layui-iconpicker-search">' +
  142. '<input class="layui-input">' +
  143. '<i class="layui-icon">&#xe615;</i>' +
  144. '</div>';
  145. }
  146. // 组合dom
  147. var bodyHtml = '<div class="layui-iconpicker-body" id="'+ PICKER_BODY +'">' +
  148. searchHtml +
  149. '<div class="'+ LIST_BOX +'"></div> '+
  150. '</div>';
  151. $('#' + ICON_BODY).find('.layui-anim').eq(0).html(bodyHtml);
  152. a.search().createList().check().page();
  153. return a;
  154. },
  155. /**
  156. * 绘制图标列表
  157. * @param text 模糊查询关键字
  158. * @returns {string}
  159. */
  160. createList: function (text) {
  161. var d = data,
  162. l = d.length,
  163. pageHtml = '',
  164. listHtml = $('<div class="layui-iconpicker-list">')//'<div class="layui-iconpicker-list">';
  165. // 计算分页数据
  166. var _limit = limit, // 每页显示数量
  167. _pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1), // 总计多少页
  168. _id = PAGE_ID;
  169. // 图标列表
  170. var icons = [];
  171. for (var i = 0; i < l; i++) {
  172. var obj = d[i];
  173. // 判断是否模糊查询
  174. if (text && obj.indexOf(text) === -1) {
  175. continue;
  176. }
  177. // 是否自定义格子宽度
  178. var style = '';
  179. if (cellWidth !== null) {
  180. style += ' style="width:' + cellWidth + '"';
  181. }
  182. // 每个图标dom
  183. var icon = '<div class="layui-iconpicker-icon-item" title="'+ obj +'" '+ style +'>';
  184. if (isFontClass){
  185. icon += '<i class="layui-icon '+ obj +'"></i>';
  186. } else {
  187. icon += '<i class="layui-icon">'+ obj.replace('amp;', '') +'</i>';
  188. }
  189. icon += '</div>';
  190. icons.push(icon);
  191. }
  192. // 查询出图标后再分页
  193. l = icons.length;
  194. _pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1);
  195. for (var i = 0; i < _pages; i++) {
  196. // 按limit分块
  197. var lm = $('<div class="layui-iconpicker-icon-limit" id="layui-iconpicker-icon-limit-' + tmp + (i+1) +'">');
  198. for (var j = i * _limit; j < (i+1) * _limit && j < l; j++) {
  199. lm.append(icons[j]);
  200. }
  201. listHtml.append(lm);
  202. }
  203. // 无数据
  204. if (l === 0) {
  205. listHtml.append('<p class="layui-iconpicker-tips">无数据</p>');
  206. }
  207. // 判断是否分页
  208. if (page){
  209. $('#' + PICKER_BODY).addClass('layui-iconpicker-body-page');
  210. pageHtml = '<div class="layui-iconpicker-page" id="'+ PAGE_ID +'">' +
  211. '<div class="layui-iconpicker-page-count">' +
  212. '<span id="'+ PAGE_ID +'-current">1</span>/' +
  213. '<span id="'+ PAGE_ID +'-pages">'+ _pages +'</span>' +
  214. ' (<span id="'+ PAGE_ID +'-length">'+ l +'</span>)' +
  215. '</div>' +
  216. '<div class="layui-iconpicker-page-operate">' +
  217. '<i class="layui-icon" id="'+ PAGE_ID +'-prev" data-index="0" prev>&#xe603;</i> ' +
  218. '<i class="layui-icon" id="'+ PAGE_ID +'-next" data-index="2" next>&#xe602;</i> ' +
  219. '</div>' +
  220. '</div>';
  221. }
  222. $('#' + ICON_BODY).find('.layui-anim').find('.' + LIST_BOX).html('').append(listHtml).append(pageHtml);
  223. return a;
  224. },
  225. // 阻止Layui的一些默认事件
  226. preventEvent: function() {
  227. var item = '#' + ICON_BODY + ' .layui-anim';
  228. a.event('click', item, function (e) {
  229. e.stopPropagation();
  230. });
  231. return a;
  232. },
  233. // 分页
  234. page: function () {
  235. var icon = '#' + PAGE_ID + ' .layui-iconpicker-page-operate .layui-icon';
  236. $(icon).unbind('click');
  237. a.event('click', icon, function (e) {
  238. var elem = e.currentTarget,
  239. total = parseInt($('#' +PAGE_ID + '-pages').html()),
  240. isPrev = $(elem).attr('prev') !== undefined,
  241. // 按钮上标的页码
  242. index = parseInt($(elem).attr('data-index')),
  243. $cur = $('#' +PAGE_ID + '-current'),
  244. // 点击时正在显示的页码
  245. current = parseInt($cur.html());
  246. // 分页数据
  247. if (isPrev && current > 1) {
  248. current=current-1;
  249. $(icon + '[prev]').attr('data-index', current);
  250. } else if (!isPrev && current < total){
  251. current=current+1;
  252. $(icon + '[next]').attr('data-index', current);
  253. }
  254. $cur.html(current);
  255. // 图标数据
  256. $('#'+ ICON_BODY + ' .layui-iconpicker-icon-limit').hide();
  257. $('#layui-iconpicker-icon-limit-' + tmp + current).show();
  258. e.stopPropagation();
  259. });
  260. return a;
  261. },
  262. /**
  263. * 搜索
  264. */
  265. search: function () {
  266. var item = '#' + PICKER_BODY + ' .layui-iconpicker-search .layui-input';
  267. a.event('input propertychange', item, function (e) {
  268. var elem = e.target,
  269. t = $(elem).val();
  270. a.createList(t);
  271. });
  272. return a;
  273. },
  274. /**
  275. * 点击选中图标
  276. */
  277. check: function () {
  278. var item = '#' + PICKER_BODY + ' .layui-iconpicker-icon-item';
  279. a.event('click', item, function (e) {
  280. var el = $(e.currentTarget).find('.layui-icon'),
  281. icon = '';
  282. if (isFontClass) {
  283. var clsArr = el.attr('class').split(/[\s\n]/),
  284. cls = clsArr[1],
  285. icon = cls;
  286. $('#' + TITLE_ID).find('.layui-iconpicker-item .layui-icon').html('').attr('class', clsArr.join(' '));
  287. } else {
  288. var cls = el.html(),
  289. icon = cls;
  290. $('#' + TITLE_ID).find('.layui-iconpicker-item .layui-icon').html(icon);
  291. }
  292. $('#' + ICON_BODY).removeClass(selected).addClass(unselect);
  293. $(elem).val(icon).attr('value', icon);
  294. // 回调
  295. if (click) {
  296. click({
  297. icon: icon
  298. });
  299. }
  300. });
  301. return a;
  302. },
  303. // 监听原始input数值改变
  304. inputListen: function(){
  305. var el = $(elem);
  306. a.event('change', elem, function(){
  307. var value = el.val();
  308. })
  309. // el.change(function(){
  310. // });
  311. return a;
  312. },
  313. event: function (evt, el, fn) {
  314. $(BODY).on(evt, el, fn);
  315. }
  316. };
  317. var common = {
  318. /**
  319. * 加载样式表
  320. */
  321. loadCss: function () {
  322. var css = '.layui-iconpicker {max-width: 280px;}.layui-iconpicker .layui-anim{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box;}.layui-iconpicker-item{border:1px solid #e6e6e6;width:90px;height:38px;border-radius:4px;cursor:pointer;position:relative;}.layui-iconpicker-icon{border-right:1px solid #e6e6e6;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;width:60px;height:100%;float:left;text-align:center;background:#fff;transition:all .3s;}.layui-iconpicker-icon i{line-height:38px;font-size:18px;}.layui-iconpicker-item > .layui-edge{left:70px;}.layui-iconpicker-item:hover{border-color:#D2D2D2!important;}.layui-iconpicker-item:hover .layui-iconpicker-icon{border-color:#D2D2D2!important;}.layui-iconpicker.layui-form-selected .layui-anim{display:block;}.layui-iconpicker-body{padding:6px;}.layui-iconpicker .layui-iconpicker-list{background-color:#fff;border:1px solid #ccc;border-radius:4px;}.layui-iconpicker .layui-iconpicker-icon-item{display:inline-block;width:21.1%;line-height:36px;text-align:center;cursor:pointer;vertical-align:top;height:36px;margin:4px;border:1px solid #ddd;border-radius:2px;transition:300ms;}.layui-iconpicker .layui-iconpicker-icon-item i.layui-icon{font-size:17px;}.layui-iconpicker .layui-iconpicker-icon-item:hover{background-color:#eee;border-color:#ccc;-webkit-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;-moz-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;box-shadow:0 0 2px #aaa,0 0 2px #fff inset;text-shadow:0 0 1px #fff;}.layui-iconpicker-search{position:relative;margin:0 0 6px 0;border:1px solid #e6e6e6;border-radius:2px;transition:300ms;}.layui-iconpicker-search:hover{border-color:#D2D2D2!important;}.layui-iconpicker-search .layui-input{cursor:text;display:inline-block;width:86%;border:none;padding-right:0;margin-top:1px;}.layui-iconpicker-search .layui-icon{position:absolute;top:11px;right:4%;}.layui-iconpicker-tips{text-align:center;padding:8px 0;cursor:not-allowed;}.layui-iconpicker-page{margin-top:6px;margin-bottom:-6px;font-size:12px;padding:0 2px;}.layui-iconpicker-page-count{display:inline-block;}.layui-iconpicker-page-operate{display:inline-block;float:right;cursor:default;}.layui-iconpicker-page-operate .layui-icon{font-size:12px;cursor:pointer;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit{display:none;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit:first-child{display:block;}';
  323. var $style = $('head').find('style[iconpicker]');
  324. if ($style.length === 0) {
  325. $('head').append('<style rel="stylesheet" iconpicker>'+css+'</style>');
  326. }
  327. },
  328. /**
  329. * 获取数据
  330. */
  331. getData: {
  332. fontClass: function () {
  333. var arr = ["layui-icon-rate-half","layui-icon-rate","layui-icon-rate-solid","layui-icon-cellphone","layui-icon-vercode","layui-icon-login-wechat","layui-icon-login-qq","layui-icon-login-weibo","layui-icon-password","layui-icon-username","layui-icon-refresh-3","layui-icon-auz","layui-icon-spread-left","layui-icon-shrink-right","layui-icon-snowflake","layui-icon-tips","layui-icon-note","layui-icon-home","layui-icon-senior","layui-icon-refresh","layui-icon-refresh-1","layui-icon-flag","layui-icon-theme","layui-icon-notice","layui-icon-website","layui-icon-console","layui-icon-face-surprised","layui-icon-set","layui-icon-template-1","layui-icon-app","layui-icon-template","layui-icon-praise","layui-icon-tread","layui-icon-male","layui-icon-female","layui-icon-camera","layui-icon-camera-fill","layui-icon-more","layui-icon-more-vertical","layui-icon-rmb","layui-icon-dollar","layui-icon-diamond","layui-icon-fire","layui-icon-return","layui-icon-location","layui-icon-read","layui-icon-survey","layui-icon-face-smile","layui-icon-face-cry","layui-icon-cart-simple","layui-icon-cart","layui-icon-next","layui-icon-prev","layui-icon-upload-drag","layui-icon-upload","layui-icon-download-circle","layui-icon-component","layui-icon-file-b","layui-icon-user","layui-icon-find-fill","layui-icon-loading","layui-icon-loading-1","layui-icon-add-1","layui-icon-play","layui-icon-pause","layui-icon-headset","layui-icon-video","layui-icon-voice","layui-icon-speaker","layui-icon-fonts-del","layui-icon-fonts-code","layui-icon-fonts-html","layui-icon-fonts-strong","layui-icon-unlink","layui-icon-picture","layui-icon-link","layui-icon-face-smile-b","layui-icon-align-left","layui-icon-align-right","layui-icon-align-center","layui-icon-fonts-u","layui-icon-fonts-i","layui-icon-tabs","layui-icon-radio","layui-icon-circle","layui-icon-edit","layui-icon-share","layui-icon-delete","layui-icon-form","layui-icon-cellphone-fine","layui-icon-dialogue","layui-icon-fonts-clear","layui-icon-layer","layui-icon-date","layui-icon-water","layui-icon-code-circle","layui-icon-carousel","layui-icon-prev-circle","layui-icon-layouts","layui-icon-util","layui-icon-templeate-1","layui-icon-upload-circle","layui-icon-tree","layui-icon-table","layui-icon-chart","layui-icon-chart-screen","layui-icon-engine","layui-icon-triangle-d","layui-icon-triangle-r","layui-icon-file","layui-icon-set-sm","layui-icon-add-circle","layui-icon-404","layui-icon-about","layui-icon-up","layui-icon-down","layui-icon-left","layui-icon-right","layui-icon-circle-dot","layui-icon-search","layui-icon-set-fill","layui-icon-group","layui-icon-friends","layui-icon-reply-fill","layui-icon-menu-fill","layui-icon-log","layui-icon-picture-fine","layui-icon-face-smile-fine","layui-icon-list","layui-icon-release","layui-icon-ok","layui-icon-help","layui-icon-chat","layui-icon-top","layui-icon-star","layui-icon-star-fill","layui-icon-close-fill","layui-icon-close","layui-icon-ok-circle","layui-icon-add-circle-fine"];
  334. return arr;
  335. },
  336. unicode: function () {
  337. return ["&amp;#xe6c9;","&amp;#xe67b;","&amp;#xe67a;","&amp;#xe678;","&amp;#xe679;","&amp;#xe677;","&amp;#xe676;","&amp;#xe675;","&amp;#xe673;","&amp;#xe66f;","&amp;#xe9aa;","&amp;#xe672;","&amp;#xe66b;","&amp;#xe668;","&amp;#xe6b1;","&amp;#xe702;","&amp;#xe66e;","&amp;#xe68e;","&amp;#xe674;","&amp;#xe669;","&amp;#xe666;","&amp;#xe66c;","&amp;#xe66a;","&amp;#xe667;","&amp;#xe7ae;","&amp;#xe665;","&amp;#xe664;","&amp;#xe716;","&amp;#xe656;","&amp;#xe653;","&amp;#xe663;","&amp;#xe6c6;","&amp;#xe6c5;","&amp;#xe662;","&amp;#xe661;","&amp;#xe660;","&amp;#xe65d;","&amp;#xe65f;","&amp;#xe671;","&amp;#xe65e;","&amp;#xe659;","&amp;#xe735;","&amp;#xe756;","&amp;#xe65c;","&amp;#xe715;","&amp;#xe705;","&amp;#xe6b2;","&amp;#xe6af;","&amp;#xe69c;","&amp;#xe698;","&amp;#xe657;","&amp;#xe65b;","&amp;#xe65a;","&amp;#xe681;","&amp;#xe67c;","&amp;#xe601;","&amp;#xe857;","&amp;#xe655;","&amp;#xe770;","&amp;#xe670;","&amp;#xe63d;","&amp;#xe63e;","&amp;#xe654;","&amp;#xe652;","&amp;#xe651;","&amp;#xe6fc;","&amp;#xe6ed;","&amp;#xe688;","&amp;#xe645;","&amp;#xe64f;","&amp;#xe64e;","&amp;#xe64b;","&amp;#xe62b;","&amp;#xe64d;","&amp;#xe64a;","&amp;#xe64c;","&amp;#xe650;","&amp;#xe649;","&amp;#xe648;","&amp;#xe647;","&amp;#xe646;","&amp;#xe644;","&amp;#xe62a;","&amp;#xe643;","&amp;#xe63f;","&amp;#xe642;","&amp;#xe641;","&amp;#xe640;","&amp;#xe63c;","&amp;#xe63b;","&amp;#xe63a;","&amp;#xe639;","&amp;#xe638;","&amp;#xe637;","&amp;#xe636;","&amp;#xe635;","&amp;#xe634;","&amp;#xe633;","&amp;#xe632;","&amp;#xe631;","&amp;#xe630;","&amp;#xe62f;","&amp;#xe62e;","&amp;#xe62d;","&amp;#xe62c;","&amp;#xe629;","&amp;#xe628;","&amp;#xe625;","&amp;#xe623;","&amp;#xe621;","&amp;#xe620;","&amp;#xe61f;","&amp;#xe61c;","&amp;#xe60b;","&amp;#xe619;","&amp;#xe61a;","&amp;#xe603;","&amp;#xe602;","&amp;#xe617;","&amp;#xe615;","&amp;#xe614;","&amp;#xe613;","&amp;#xe612;","&amp;#xe611;","&amp;#xe60f;","&amp;#xe60e;","&amp;#xe60d;","&amp;#xe60c;","&amp;#xe60a;","&amp;#xe609;","&amp;#xe605;","&amp;#xe607;","&amp;#xe606;","&amp;#xe604;","&amp;#xe600;","&amp;#xe658;","&amp;#x1007;","&amp;#x1006;","&amp;#x1005;","&amp;#xe608;"];
  338. }
  339. }
  340. };
  341. a.init();
  342. return new IconPicker();
  343. };
  344. /**
  345. * 选中图标
  346. * @param filter lay-filter
  347. * @param iconName 图标名称,自动识别fontClass/unicode
  348. */
  349. IconPicker.prototype.checkIcon = function (filter, iconName){
  350. var el = $('*[lay-filter='+ filter +']'),
  351. p = el.next().find('.layui-iconpicker-item .layui-icon'),
  352. c = iconName;
  353. if (c.indexOf('#xe') > 0){
  354. p.html(c);
  355. } else {
  356. p.html('').attr('class', 'layui-icon ' + c);
  357. }
  358. el.attr('value', c).val(c);
  359. };
  360. var iconPicker = new IconPicker();
  361. exports(_MOD, iconPicker);
  362. });