yvanui.combobox.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. (function ($) {
  2. $.extend(true, $.fn.combobox.defaults, {
  3. editable: true,
  4. filter: function (input, row) {
  5. // 清空内容, 则不过滤
  6. if (!$.trim(input)) return true;
  7. input = input.toUpperCase();
  8. // 先判断显示值
  9. var opts = $(this).combobox('options');
  10. var text = row[opts.textField].toUpperCase();
  11. if (text.indexOf(input) >= 0) {
  12. return true;
  13. }
  14. var letter = pinyin ? pinyin.getCamelChars(text) : text;
  15. return (letter.indexOf(input) >= 0);
  16. },
  17. onHidePanel: function () {
  18. var el = $(this);
  19. el.combobox('textbox').focus();
  20. // 检查录入内容是否在数据里
  21. var opts = el.combobox("options");
  22. var data = el.combobox("getData");
  23. var value = el.combobox("getValue");
  24. // 有高亮选中的项目, 则不进一步处理
  25. var panel = el.combobox("panel");
  26. var items = panel.find(".combobox-item-selected");
  27. if (items.length > 0) {
  28. var values = el.combobox("getValues");
  29. el.combobox("setValues", values);
  30. return;
  31. }
  32. var allowInput = opts.allowInput;
  33. if (allowInput) {
  34. // 允许录入, 并且当前下拉没内容(过滤掉了), 则加入下拉列表里
  35. var idx = data.length;
  36. data[idx] = [];
  37. data[idx][opts.textField] = value;
  38. data[idx][opts.valueField] = value;
  39. el.combobox("loadData", data);
  40. } else {
  41. // 不允许录入任意项, 则清空
  42. el.combobox("clear");
  43. if (el.combo("options").onSelect) {
  44. el.combo("options").onSelect.call(el, null);
  45. }
  46. }
  47. },
  48. keyHandler: {
  49. query: function (q, evt) {
  50. var target = this;
  51. var el = $(this);
  52. var state = $.data(target, 'combobox');
  53. var opts = state.options;
  54. if (opts.multiple && !q) {
  55. el.combobox("setValues", [], true);
  56. } else {
  57. el.combobox("setValues", [q], true);
  58. }
  59. var panel = el.combo('panel');
  60. panel.find('div.combobox-item-selected,div.combobox-item-hover').removeClass('combobox-item-selected combobox-item-hover');
  61. panel.find('div.combobox-item,div.combobox-group').hide();
  62. var data = el.combobox('getData');
  63. var vv = [];
  64. var qq = opts.multiple ? q.split(opts.separator) : [q];
  65. $.map(qq, function (q) {
  66. q = $.trim(q);
  67. for (var i = 0; i < data.length; i++) {
  68. var row = data[i];
  69. if (opts.filter.call(el, q, row)) {
  70. var v = row[opts.valueField];
  71. var s = row[opts.textField];
  72. var g = row[opts.groupField];
  73. var item = opts.finder.getEl(target, v).show();
  74. vv.push(row);
  75. }
  76. }
  77. });
  78. // 默认高亮第一项
  79. if (vv.length > 0 && q) {
  80. var v = vv[0][opts.valueField];
  81. var item = opts.finder.getEl(target, v);
  82. item.addClass('combobox-item-selected');
  83. // 只改value, 不改text
  84. el.combo("setValues", [v], true);
  85. if (el.combo("options").onSelect) {
  86. el.combo("options").onSelect.call(el, vv[0]);
  87. }
  88. }
  89. }
  90. }
  91. });
  92. })(jQuery);