UU跑腿标准版

ligerListBox.js 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. /**
  2. * jQuery ligerUI 1.2.4
  3. *
  4. * http://ligerui.com
  5. *
  6. * Author daomi 2014 [ gd_star@163.com ]
  7. *
  8. */
  9. (function ($)
  10. {
  11. $.fn.ligerListBox = function (options)
  12. {
  13. return $.ligerui.run.call(this, "ligerListBox", arguments);
  14. };
  15. $.ligerDefaults.ListBox = {
  16. isMultiSelect: false, //是否多选
  17. isShowCheckBox: false, //是否选择复选框
  18. columns: null, //表格状态
  19. width: 150, //宽度
  20. height: 100, //高度
  21. onSelect: false, //选择前事件
  22. onSelected: null, //选择值事件
  23. valueField: 'id', //值成员
  24. textField: 'text', //显示成员
  25. valueFieldID: null, //值 隐藏域 表单名
  26. split: ";", //分隔符
  27. data: null, //数据
  28. parms: null, //ajax提交表单
  29. url: null, //数据源URL(需返回JSON)
  30. onSuccess: null,
  31. onError: null,
  32. render: null, //显示html自定义函数
  33. css: null, //附加css
  34. value: null, //值
  35. valueFieldCssClass: null
  36. };
  37. //扩展方法
  38. $.ligerMethos.ListBox = $.ligerMethos.ListBox || {};
  39. $.ligerui.controls.ListBox = function (element, options)
  40. {
  41. $.ligerui.controls.ListBox.base.constructor.call(this, element, options);
  42. };
  43. $.ligerui.controls.ListBox.ligerExtend($.ligerui.controls.Input, {
  44. __getType: function ()
  45. {
  46. return 'ListBox';
  47. },
  48. _extendMethods: function ()
  49. {
  50. return $.ligerMethos.ListBox;
  51. },
  52. _init: function ()
  53. {
  54. $.ligerui.controls.ListBox.base._init.call(this);
  55. },
  56. _render: function ()
  57. {
  58. var g = this, p = this.options;
  59. g.data = p.data;
  60. g.valueField = null; //隐藏域(保存值)
  61. if (p.valueFieldID)
  62. {
  63. g.valueField = $("#" + p.valueFieldID + ":input,[name=" + p.valueFieldID + "]:input");
  64. if (g.valueField.length == 0) g.valueField = $('<input type="hidden"/>');
  65. g.valueField[0].id = g.valueField[0].name = p.valueFieldID;
  66. }
  67. else
  68. {
  69. g.valueField = $('<input type="hidden"/>');
  70. g.valueField[0].id = g.valueField[0].name = g.id + "_val";
  71. }
  72. if (g.valueField[0].name == null) g.valueField[0].name = g.valueField[0].id;
  73. if (p.valueFieldCssClass)
  74. {
  75. g.valueField.addClass(p.valueFieldCssClass);
  76. }
  77. g.valueField.attr("data-ligerid", g.id);
  78. //选择框框
  79. g.selectBox = $(this.element);
  80. g.selectBox.html('<div class="l-listbox-inner"><table cellpadding="0" cellspacing="0" border="0" class="l-listbox-table"></table></div>').addClass("l-listbox").append(g.valueField);
  81. g.selectBox.table = $("table:first", g.selectBox);
  82. g.set(p);
  83. g._addClickEven();
  84. },
  85. destroy: function ()
  86. {
  87. if (this.selectBox) this.selectBox.remove();
  88. this.options = null;
  89. $.ligerui.remove(this);
  90. },
  91. clear : function()
  92. {
  93. this._changeValue("");
  94. this.trigger('clear');
  95. },
  96. _setIsShowCheckBox : function(value)
  97. {
  98. if (value)
  99. {
  100. $("table", this.selectBox).addClass("l-table-checkbox");
  101. } else
  102. {
  103. $("table", this.selectBox).addClass("l-table-nocheckbox");
  104. }
  105. },
  106. _setCss: function (css)
  107. {
  108. if (css)
  109. {
  110. this.selectBox.addClass(css);
  111. }
  112. },
  113. _setDisabled: function (value)
  114. {
  115. //禁用样式
  116. if (value)
  117. {
  118. this.selectBox.addClass('l-text-disabled');
  119. } else
  120. {
  121. this.selectBox.removeClass('l-text-disabled');
  122. }
  123. },
  124. _setWidth: function (value)
  125. {
  126. this.selectBox.width(value);
  127. },
  128. _setHeight: function (value)
  129. {
  130. this.selectBox.height(value);
  131. },
  132. //查找Text,适用多选和单选
  133. findTextByValue: function (value)
  134. {
  135. var g = this, p = this.options;
  136. if (value == null) return "";
  137. var texts = "";
  138. var contain = function (checkvalue)
  139. {
  140. var targetdata = value.toString().split(p.split);
  141. for (var i = 0; i < targetdata.length; i++)
  142. {
  143. if (targetdata[i] == checkvalue) return true;
  144. }
  145. return false;
  146. };
  147. $(g.data).each(function (i, item)
  148. {
  149. var val = item[p.valueField];
  150. var txt = item[p.textField];
  151. if (contain(val))
  152. {
  153. texts += txt + p.split;
  154. }
  155. });
  156. if (texts.length > 0) texts = texts.substr(0, texts.length - 1);
  157. return texts;
  158. },
  159. getDataByValue: function (value)
  160. {
  161. var g = this, p = this.options;
  162. for (var i = 0, l = g.data.length; i < l; i++)
  163. {
  164. if (g.data[i][p.valueField] == value) return g.data[i];
  165. }
  166. return null;
  167. },
  168. indexOf: function (item)
  169. {
  170. var g = this, p = this.options;
  171. if (!g.data) return -1;
  172. var isObj = typeof (item) == "object";
  173. for (var i = 0, l = g.data.length; i < l; i++)
  174. {
  175. if (isObj)
  176. {
  177. if (g.data[i] == item) return i;
  178. } else
  179. {
  180. if (g.data[i][p.valueField] && g.data[i][p.valueField].toString() == item.toString()) return i;
  181. }
  182. }
  183. return -1;
  184. },
  185. removeItems : function(items)
  186. {
  187. var g = this;
  188. if (!g.data) return;
  189. $(items).each(function (i,item)
  190. {
  191. var index = g.indexOf(item);
  192. if (index == -1) return;
  193. g.data.splice(index, 1);
  194. });
  195. g.refresh();
  196. },
  197. removeItem: function (item)
  198. {
  199. if (!this.data) return;
  200. var index = this.indexOf(item);
  201. if (index == -1) return;
  202. this.data.splice(index, 1);
  203. this.refresh();
  204. },
  205. insertItem: function (item,index)
  206. {
  207. var g = this;
  208. if (!g.data) g.data = [];
  209. g.data.splice(index, 0, item);
  210. g.refresh();
  211. },
  212. addItems: function (items)
  213. {
  214. var g = this;
  215. if (!g.data) g.data = [];
  216. $(items).each(function (i, item)
  217. {
  218. g.data.push(item);
  219. });
  220. g.refresh();
  221. },
  222. addItem: function (item)
  223. {
  224. var g = this;
  225. if (!g.data) g.data = [];
  226. g.data.push(item);
  227. g.refresh();
  228. },
  229. getSelectedItems: function()
  230. {
  231. var g = this, p = this.options;
  232. if (!g.data) return null;
  233. var value = g.getValue();
  234. if (!value) return null;
  235. var items = [];
  236. $(value.split(p.split)).each(function ()
  237. {
  238. var index = g.indexOf(this.toString());
  239. if (index != -1) items.push(g.data[index]);
  240. });
  241. return items;
  242. },
  243. _setValue: function (value)
  244. {
  245. var g = this, p = this.options;
  246. p.value = value;
  247. this._dataInit();
  248. },
  249. setValue: function (value)
  250. {
  251. this._setValue(value);
  252. },
  253. _setUrl: function (url)
  254. {
  255. if (!url) return;
  256. var g = this, p = this.options;
  257. $.ajax({
  258. type: 'post',
  259. url: url,
  260. data: p.parms,
  261. cache: false,
  262. dataType: 'json',
  263. success: function (data)
  264. {
  265. g.setData(data);
  266. g.trigger('success', [data]);
  267. },
  268. error: function (XMLHttpRequest, textStatus)
  269. {
  270. g.trigger('error', [XMLHttpRequest, textStatus]);
  271. }
  272. });
  273. },
  274. setUrl: function (url)
  275. {
  276. return this._setUrl(url);
  277. },
  278. setParm: function (name, value)
  279. {
  280. if (!name) return;
  281. var g = this;
  282. var parms = g.get('parms');
  283. if (!parms) parms = {};
  284. parms[name] = value;
  285. g.set('parms', parms);
  286. },
  287. clearContent: function ()
  288. {
  289. var g = this, p = this.options;
  290. $("table", g.selectBox).html("");
  291. },
  292. _setColumns : function(columns)
  293. {
  294. var g = this, p = this.options;
  295. p.columns = columns;
  296. g.refresh();
  297. },
  298. _setData : function(data)
  299. {
  300. this.setData(data);
  301. },
  302. setData: function (data)
  303. {
  304. var g = this, p = this.options;
  305. if (!data || !data.length) return;
  306. g.data = data;
  307. g.refresh();
  308. g.updateStyle();
  309. },
  310. refresh:function()
  311. {
  312. var g = this, p = this.options, data = this.data;
  313. this.clearContent();
  314. if (!data) return;
  315. if (p.columns)
  316. {
  317. g.selectBox.table.headrow = $("<tr class='l-table-headerow'><td width='18px' class='l-checkboxrow'></td></tr>");
  318. g.selectBox.table.append(g.selectBox.table.headrow);
  319. g.selectBox.table.addClass("l-listbox-grid");
  320. for (var j = 0; j < p.columns.length; j++)
  321. {
  322. var headrow = $("<td columnindex='" + j + "' columnname='" + p.columns[j].name + "'>" + p.columns[j].header + "</td>");
  323. if (p.columns[j].width)
  324. {
  325. headrow.width(p.columns[j].width);
  326. }
  327. g.selectBox.table.headrow.append(headrow);
  328. }
  329. }
  330. var out = [];
  331. for (var i = 0; i < data.length; i++)
  332. {
  333. var val = data[i][p.valueField];
  334. var txt = data[i][p.textField];
  335. var valueIndexStr = " value='" + val + "' index='" + i + "'";
  336. if (!p.columns)
  337. {
  338. out.push("<tr " + valueIndexStr + ">");
  339. out.push("<td style='width:18px;' class='l-checkboxrow'><input type='checkbox'" + valueIndexStr + "/></td>");
  340. var itemHtml = txt;
  341. if (p.render)
  342. {
  343. itemHtml = p.render({
  344. data: data[i],
  345. value: val,
  346. text: txt
  347. });
  348. }
  349. out.push("<td align='left'>" + itemHtml + "</td></tr>");
  350. } else
  351. {
  352. out.push("<tr " + valueIndexStr + "><td style='width:18px;' class='l-checkboxrow'><input type='checkbox' " + valueIndexStr + "/></td>");
  353. for (var j = 0; j < p.columns.length; j++)
  354. {
  355. var columnname = p.columns[j].name;
  356. out.push("<td>" + data[i][columnname] + "</td>");
  357. }
  358. out.push('</tr>');
  359. }
  360. }
  361. g.selectBox.table.append(out.join(''));
  362. },
  363. _getValue: function ()
  364. {
  365. return $(this.valueField).val();
  366. },
  367. getValue: function ()
  368. {
  369. //获取值
  370. return this._getValue();
  371. },
  372. updateStyle: function ()
  373. {
  374. this._dataInit();
  375. },
  376. selectAll: function ()
  377. {
  378. var g = this, p = this.options;
  379. var values = [];
  380. $("tr", g.selectBox).each(function ()
  381. {
  382. var jrow = $(this);
  383. values.push(jrow.attr("value"));
  384. });
  385. $("tr", g.selectBox).addClass("l-selected").find(":checkbox").each(function () { this.checked = true; });
  386. g.valueField.val(values.join(p.split));
  387. },
  388. _dataInit: function ()
  389. {
  390. var g = this, p = this.options;
  391. var value = p.value;
  392. //根据值来初始化
  393. if (value != null)
  394. {
  395. g._changeValue(value);
  396. }
  397. else if (g.valueField.val() != "")
  398. {
  399. p.value = g.valueField.val();
  400. }
  401. var valueArr = (value || "").toString().split(p.split);
  402. $("tr.l-selected", g.selectBox)
  403. .removeClass("l-selected")
  404. .find(":checkbox").each(function () { this.checked = false; });
  405. $(valueArr).each(function (i, item)
  406. {
  407. $("tr[value='" + item + "']", g.selectBox)
  408. .addClass("l-selected")
  409. .find(":checkbox").each(function () { this.checked = true; });
  410. });
  411. },
  412. //设置值到 隐藏域
  413. _changeValue: function (newValue)
  414. {
  415. var g = this, p = this.options;
  416. g.valueField.val(newValue);
  417. g.selectedValue = newValue;
  418. },
  419. //更新值到隐藏域
  420. _updateValue: function ()
  421. {
  422. var g = this, p = this.options;
  423. var values = [];
  424. $("tr", g.selectBox).each(function ()
  425. {
  426. var jrow = $(this);
  427. if (jrow.hasClass("l-selected"))
  428. {
  429. values.push(jrow.attr("value"));
  430. }
  431. });
  432. g._changeValue(values.join(p.split));
  433. },
  434. _addClickEven: function ()
  435. {
  436. var g = this, p = this.options;
  437. //选项点击
  438. g.selectBox.click(function (e)
  439. {
  440. var obj = (e.target || e.srcElement);
  441. var jrow = $(obj).parents("tr:first");
  442. if (!jrow.length) return;
  443. var value = jrow.attr("value");
  444. var text = g.findTextByValue(value), data = g.getDataByValue(value);
  445. if (g.hasBind('select'))
  446. {
  447. if (g.trigger('select', [value, text, data]) == false)
  448. {
  449. return false;
  450. }
  451. }
  452. if (!p.isMultiSelect)
  453. {
  454. $("tr.l-selected", g.selectBox).not(jrow)
  455. .removeClass("l-selected")
  456. .find(":checkbox").each(function () { this.checked = false });
  457. }
  458. if (jrow.hasClass("l-selected"))
  459. {
  460. jrow.removeClass("l-selected");
  461. } else
  462. {
  463. jrow.addClass("l-selected");
  464. }
  465. jrow.find(":checkbox").each(function () { this.checked = jrow.hasClass("l-selected"); });
  466. g._updateValue();
  467. g.trigger('selected', [value, text, data]);
  468. });
  469. }
  470. });
  471. })(jQuery);