控制台应用,yzncms本身基于tp5.1框架,里面的队列用不了,bug,坑
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. /*!
  2. * jQuery cxSelect
  3. * @name jquery.cxselect.js
  4. * @version 1.4.2
  5. * @date 2017-09-26
  6. * @author ciaoca
  7. * @email ciaoca@gmail.com
  8. * @site https://github.com/ciaoca/cxSelect
  9. * @license Released under the MIT license
  10. */
  11. layui.define(['jquery','form'],function(exports) {
  12. var jQuery=layui.$;
  13. var form=layui.form;
  14. (function(factory) {
  15. if (typeof define === 'function' && define.amd) {
  16. define(['jquery'], factory);
  17. } else {
  18. factory(window.jQuery || window.Zepto || window.$);
  19. };
  20. }(function($) {
  21. var cxSelect = function() {
  22. var self = this;
  23. var dom, settings, callback;
  24. // 分配参数
  25. for (var i = 0, l = arguments.length; i < l; i++) {
  26. if (cxSelect.isJquery(arguments[i]) || cxSelect.isZepto(arguments[i])) {
  27. dom = arguments[i];
  28. } else if (cxSelect.isElement(arguments[i])) {
  29. dom = $(arguments[i]);
  30. } else if (typeof arguments[i] === 'function') {
  31. callback = arguments[i];
  32. } else if (typeof arguments[i] === 'object') {
  33. settings = arguments[i];
  34. };
  35. };
  36. var api = new cxSelect.init(dom, settings);
  37. if (typeof callback === 'function') {
  38. callback(api);
  39. };
  40. return api;
  41. };
  42. cxSelect.isElement = function(o){
  43. if (o && (typeof HTMLElement === 'function' || typeof HTMLElement === 'object') && o instanceof HTMLElement) {
  44. return true;
  45. } else {
  46. return (o && o.nodeType && o.nodeType === 1) ? true : false;
  47. };
  48. };
  49. cxSelect.isJquery = function(o){
  50. return (o && o.length && (typeof jQuery === 'function' || typeof jQuery === 'object') && o instanceof jQuery) ? true : false;
  51. };
  52. cxSelect.isZepto = function(o){
  53. return (o && o.length && (typeof Zepto === 'function' || typeof Zepto === 'object') && Zepto.zepto.isZ(o)) ? true : false;
  54. };
  55. cxSelect.getIndex = function(n, required) {
  56. return required ? n : n - 1;
  57. };
  58. cxSelect.getData = function(data, space) {
  59. if (typeof space === 'string' && space.length) {
  60. space = space.split('.');
  61. for (var i = 0, l = space.length; i < l; i++) {
  62. data = data[space[i]];
  63. };
  64. };
  65. return data;
  66. };
  67. cxSelect.init = function(dom, settings) {
  68. var self = this;
  69. if (!cxSelect.isJquery(dom) && !cxSelect.isZepto(dom)) {return};
  70. var theSelect = {
  71. dom: {
  72. box: dom
  73. }
  74. };
  75. self.attach = cxSelect.attach.bind(theSelect);
  76. self.detach = cxSelect.detach.bind(theSelect);
  77. self.setOptions = cxSelect.setOptions.bind(theSelect);
  78. self.clear = cxSelect.clear.bind(theSelect);
  79. theSelect.changeEvent = function(className) {
  80. //兼容layui
  81. if(typeof className === 'object'){
  82. className = this.className;
  83. }
  84. cxSelect.selectChange.call(theSelect, className);
  85. };
  86. theSelect.settings = $.extend({}, $.cxSelect.defaults, settings, {
  87. url: theSelect.dom.box.data('url'),
  88. emptyStyle: theSelect.dom.box.data('emptyStyle'),
  89. required: theSelect.dom.box.data('required'),
  90. firstTitle: theSelect.dom.box.data('firstTitle'),
  91. firstValue: theSelect.dom.box.data('firstValue'),
  92. jsonSpace: theSelect.dom.box.data('jsonSpace'),
  93. jsonName: theSelect.dom.box.data('jsonName'),
  94. jsonValue: theSelect.dom.box.data('jsonValue'),
  95. jsonSub: theSelect.dom.box.data('jsonSub')
  96. });
  97. var _dataSelects = theSelect.dom.box.data('selects');
  98. if (typeof _dataSelects === 'string' && _dataSelects.length) {
  99. theSelect.settings.selects = _dataSelects.split(',');
  100. };
  101. self.setOptions();
  102. self.attach();
  103. // 使用独立接口获取数据
  104. if (!theSelect.settings.url && !theSelect.settings.data) {
  105. cxSelect.start.apply(theSelect);
  106. // 设置自定义数据
  107. } else if ($.isArray(theSelect.settings.data)) {
  108. cxSelect.start.call(theSelect, theSelect.settings.data);
  109. // 设置 URL,通过 Ajax 获取数据
  110. } else if (typeof theSelect.settings.url === 'string' && theSelect.settings.url.length) {
  111. $.getJSON(theSelect.settings.url, function(json) {
  112. cxSelect.start.call(theSelect, json);
  113. });
  114. };
  115. };
  116. // 设置参数
  117. cxSelect.setOptions = function(opts) {
  118. var self = this;
  119. if (opts) {
  120. $.extend(self.settings, opts);
  121. };
  122. // 初次或重设选择器组
  123. if (!$.isArray(self.selectArray) || !self.selectArray.length || (opts && opts.selects)) {
  124. self.selectArray = [];
  125. if ($.isArray(self.settings.selects) && self.settings.selects.length) {
  126. var _tempSelect;
  127. for (var i = 0, l = self.settings.selects.length; i < l; i++) {
  128. _tempSelect = self.dom.box.find('select.' + self.settings.selects[i]);
  129. if (!_tempSelect || !_tempSelect.length) {break};
  130. self.selectArray.push(_tempSelect);
  131. };
  132. };
  133. };
  134. if (opts) {
  135. if (!$.isArray(opts.data) && typeof opts.url === 'string' && opts.url.length) {
  136. $.getJSON(self.settings.url, function(json) {
  137. cxSelect.start.call(self, json);
  138. });
  139. } else {
  140. cxSelect.start.call(self, opts.data);
  141. };
  142. };
  143. };
  144. // 绑定
  145. cxSelect.attach = function() {
  146. var self = this;
  147. if (!self.attachStatus) {
  148. self.dom.box.on('change', 'select', self.changeEvent);
  149. //监听下拉事件 ##兼容layui
  150. form.on('select()',function(data){
  151. self.changeEvent(data.elem.className);
  152. });
  153. };
  154. if (typeof self.attachStatus === 'boolean') {
  155. cxSelect.start.call(self);
  156. };
  157. self.attachStatus = true;
  158. };
  159. // 移除绑定
  160. cxSelect.detach = function() {
  161. var self = this;
  162. self.dom.box.off('change', 'select', self.changeEvent);
  163. self.attachStatus = false;
  164. };
  165. // 清空选项
  166. cxSelect.clear = function(index) {
  167. var self = this;
  168. var _style = {
  169. display: '',
  170. visibility: ''
  171. };
  172. index = isNaN(index) ? 0 : index;
  173. // 清空后面的 select
  174. for (var i = index, l = self.selectArray.length; i < l; i++) {
  175. self.selectArray[i].empty().prop('disabled', true);
  176. if (self.settings.emptyStyle === 'none') {
  177. _style.display = 'none';
  178. } else if (self.settings.emptyStyle === 'hidden') {
  179. _style.visibility = 'hidden';
  180. };
  181. self.selectArray[i].css(_style);
  182. };
  183. };
  184. cxSelect.start = function(data) {
  185. var self = this;
  186. if ($.isArray(data)) {
  187. self.settings.data = cxSelect.getData(data, self.settings.jsonSpace);
  188. };
  189. if (!self.selectArray.length) {return};
  190. // 保存默认值
  191. for (var i = 0, l = self.selectArray.length; i < l; i++) {
  192. if (typeof self.selectArray[i].attr('data-value') !== 'string' && self.selectArray[i][0].options.length) {
  193. self.selectArray[i].attr('data-value', self.selectArray[i].val());
  194. };
  195. };
  196. if (self.settings.data || (typeof self.selectArray[0].data('url') === 'string' && self.selectArray[0].data('url').length)) {
  197. cxSelect.getOptionData.call(self, 0);
  198. } else if (self.selectArray[0][0].options.length && typeof self.selectArray[0].attr('data-value') === 'string' && self.selectArray[0].attr('data-value').length) {
  199. self.selectArray[0].val(self.selectArray[0].attr('data-value'));
  200. cxSelect.getOptionData.call(self, 1);
  201. } else {
  202. self.selectArray[0].prop('disabled', false).css({
  203. 'display': '',
  204. 'visibility': ''
  205. });
  206. };
  207. };
  208. // 获取选项数据
  209. cxSelect.getOptionData = function(index) {
  210. var self = this;
  211. if (typeof index !== 'number' || isNaN(index) || index < 0 || index >= self.selectArray.length) {return};
  212. var _indexPrev = index - 1;
  213. var _select = self.selectArray[index];
  214. var _selectData;
  215. var _valueIndex;
  216. var _dataUrl = _select.data('url');
  217. var _jsonSpace = typeof _select.data('jsonSpace') === 'undefined' ? self.settings.jsonSpace : _select.data('jsonSpace');
  218. var _query = {};
  219. var _queryName;
  220. var _selectName;
  221. var _selectValue;
  222. cxSelect.clear.call(self, index);
  223. // 使用独立接口
  224. if (typeof _dataUrl === 'string' && _dataUrl.length) {
  225. if (index > 0) {
  226. for (var i = 0, j = 1; i < index; i++, j++) {
  227. _queryName = self.selectArray[j].data('queryName');
  228. _selectName = self.selectArray[i].attr('name');
  229. _selectValue = self.selectArray[i].val();
  230. if (typeof _queryName === 'string' && _queryName.length) {
  231. _query[_queryName] = _selectValue;
  232. } else if (typeof _selectName === 'string' && _selectName.length) {
  233. _query[_selectName] = _selectValue;
  234. };
  235. };
  236. };
  237. $.getJSON(_dataUrl, _query, function(json) {
  238. _selectData = cxSelect.getData(json, _jsonSpace);
  239. cxSelect.buildOption.call(self, index, _selectData);
  240. });
  241. // 使用整合数据
  242. } else if (self.settings.data && typeof self.settings.data === 'object') {
  243. _selectData = self.settings.data;
  244. for (var i = 0; i < index; i++) {
  245. _valueIndex = cxSelect.getIndex(self.selectArray[i][0].selectedIndex, typeof self.selectArray[i].data('required') === 'boolean' ? self.selectArray[i].data('required') : self.settings.required);
  246. if (typeof _selectData[_valueIndex] === 'object' && $.isArray(_selectData[_valueIndex][self.settings.jsonSub]) && _selectData[_valueIndex][self.settings.jsonSub].length) {
  247. _selectData = _selectData[_valueIndex][self.settings.jsonSub];
  248. } else {
  249. _selectData = null;
  250. break;
  251. };
  252. };
  253. cxSelect.buildOption.call(self, index, _selectData);
  254. };
  255. };
  256. // 构建选项列表
  257. cxSelect.buildOption = function(index, data) {
  258. var self = this;
  259. var _select = self.selectArray[index];
  260. var _required = typeof _select.data('required') === 'boolean' ? _select.data('required') : self.settings.required;
  261. var _firstTitle = typeof _select.data('firstTitle') === 'undefined' ? self.settings.firstTitle : _select.data('firstTitle');
  262. var _firstValue = typeof _select.data('firstValue') === 'undefined' ? self.settings.firstValue : _select.data('firstValue');
  263. var _jsonName = typeof _select.data('jsonName') === 'undefined' ? self.settings.jsonName : _select.data('jsonName');
  264. var _jsonValue = typeof _select.data('jsonValue') === 'undefined' ? self.settings.jsonValue : _select.data('jsonValue');
  265. if (!$.isArray(data)) {return};
  266. var _html = !_required ? '<option value="' + String(_firstValue) + '">' + String(_firstTitle) + '</option>' : '';
  267. // 区分标题、值的数据
  268. if (typeof _jsonName === 'string' && _jsonName.length) {
  269. // 无值字段时使用标题作为值
  270. if (typeof _jsonValue !== 'string' || !_jsonValue.length) {
  271. _jsonValue = _jsonName;
  272. };
  273. for (var i = 0, l = data.length; i < l; i++) {
  274. _html += '<option value="' + String(data[i][_jsonValue]) + '">' + String(data[i][_jsonName]) + '</option>';
  275. };
  276. // 数组即为值的数据
  277. } else {
  278. for (var i = 0, l = data.length; i < l; i++) {
  279. _html += '<option value="' + String(data[i]) + '">' + String(data[i]) + '</option>';
  280. };
  281. };
  282. _select.html(_html).prop('disabled', false).css({
  283. 'display': '',
  284. 'visibility': ''
  285. });
  286. // 初次加载设置默认值
  287. if (typeof _select.attr('data-value') === 'string') {
  288. _select.val(String(_select.attr('data-value'))).removeAttr('data-value');
  289. if (_select[0].selectedIndex < 0) {
  290. _select[0].options[0].selected = true;
  291. };
  292. };
  293. if (_required || _select[0].selectedIndex > 0) {
  294. _select.trigger('change');
  295. };
  296. //刷新下拉 ##兼容layui
  297. form.render('select');
  298. };
  299. // 改变选择时的处理
  300. cxSelect.selectChange = function(name) {
  301. var self = this;
  302. if (typeof name !== 'string' || !name.length) {return};
  303. var index;
  304. name = name.replace(/\s+/g, ',');
  305. name = ',' + name + ',';
  306. // 获取当前 select 位置
  307. for (var i = 0, l = self.selectArray.length; i < l; i++) {
  308. if (name.indexOf(',' + self.settings.selects[i] + ',') > -1) {
  309. index = i;
  310. break;
  311. };
  312. };
  313. if (typeof index === 'number' && index > -1) {
  314. index += 1;
  315. cxSelect.getOptionData.call(self, index);
  316. };
  317. };
  318. $.cxSelect = function() {
  319. return cxSelect.apply(this, arguments);
  320. };
  321. // 默认值
  322. $.cxSelect.defaults = {
  323. selects: [], // 下拉选框组
  324. url: null, // 列表数据文件路径(URL)或数组数据
  325. data: null, // 自定义数据
  326. emptyStyle: null, // 无数据状态显示方式
  327. required: false, // 是否为必选
  328. firstTitle: '请选择', // 第一个选项的标题
  329. firstValue: '', // 第一个选项的值
  330. jsonSpace: '', // 数据命名空间
  331. jsonName: 'n', // 数据标题字段名称
  332. jsonValue: '', // 数据值字段名称
  333. jsonSub: 's' // 子集数据字段名称
  334. };
  335. $.fn.cxSelect = function(settings, callback) {
  336. this.each(function(i) {
  337. $.cxSelect(this, settings, callback);
  338. });
  339. return this;
  340. };
  341. }));
  342. exports('cxselect',{});
  343. });