jquery.combobox.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. /**
  2. * jQuery EasyUI 1.5.2
  3. *
  4. * Copyright (c) 2009-2017 www.jeasyui.com. All rights reserved.
  5. *
  6. * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php
  7. * To use it on other terms please contact us: info@jeasyui.com
  8. *
  9. */
  10. (function($){
  11. function _1(_2,_3){
  12. var _4=$.data(_2,"combobox");
  13. return $.easyui.indexOfArray(_4.data,_4.options.valueField,_3);
  14. };
  15. function _5(_6,_7){
  16. var _8=$.data(_6,"combobox").options;
  17. var _9=$(_6).combo("panel");
  18. var _a=_8.finder.getEl(_6,_7);
  19. if(_a.length){
  20. if(_a.position().top<=0){
  21. var h=_9.scrollTop()+_a.position().top;
  22. _9.scrollTop(h);
  23. }else{
  24. if(_a.position().top+_a.outerHeight()>_9.height()){
  25. var h=_9.scrollTop()+_a.position().top+_a.outerHeight()-_9.height();
  26. _9.scrollTop(h);
  27. }
  28. }
  29. }
  30. _9.triggerHandler("scroll");
  31. };
  32. function _b(_c,_d){
  33. var _e=$.data(_c,"combobox").options;
  34. var _f=$(_c).combobox("panel");
  35. var _10=_f.children("div.combobox-item-hover");
  36. if(!_10.length){
  37. _10=_f.children("div.combobox-item-selected");
  38. }
  39. _10.removeClass("combobox-item-hover");
  40. var _11="div.combobox-item:visible:not(.combobox-item-disabled):first";
  41. var _12="div.combobox-item:visible:not(.combobox-item-disabled):last";
  42. if(!_10.length){
  43. _10=_f.children(_d=="next"?_11:_12);
  44. }else{
  45. if(_d=="next"){
  46. _10=_10.nextAll(_11);
  47. if(!_10.length){
  48. _10=_f.children(_11);
  49. }
  50. }else{
  51. _10=_10.prevAll(_11);
  52. if(!_10.length){
  53. _10=_f.children(_12);
  54. }
  55. }
  56. }
  57. if(_10.length){
  58. _10.addClass("combobox-item-hover");
  59. var row=_e.finder.getRow(_c,_10);
  60. if(row){
  61. $(_c).combobox("scrollTo",row[_e.valueField]);
  62. if(_e.selectOnNavigation){
  63. _13(_c,row[_e.valueField]);
  64. }
  65. }
  66. }
  67. };
  68. function _13(_14,_15,_16){
  69. var _17=$.data(_14,"combobox").options;
  70. var _18=$(_14).combo("getValues");
  71. if($.inArray(_15+"",_18)==-1){
  72. if(_17.multiple){
  73. _18.push(_15);
  74. }else{
  75. _18=[_15];
  76. }
  77. _19(_14,_18,_16);
  78. }
  79. };
  80. function _1a(_1b,_1c){
  81. var _1d=$.data(_1b,"combobox").options;
  82. var _1e=$(_1b).combo("getValues");
  83. var _1f=$.inArray(_1c+"",_1e);
  84. if(_1f>=0){
  85. _1e.splice(_1f,1);
  86. _19(_1b,_1e);
  87. }
  88. };
  89. function _19(_20,_21,_22){
  90. var _23=$.data(_20,"combobox").options;
  91. var _24=$(_20).combo("panel");
  92. if(!$.isArray(_21)){
  93. _21=_21.split(_23.separator);
  94. }
  95. if(!_23.multiple){
  96. _21=_21.length?[_21[0]]:[""];
  97. }
  98. var _25=$(_20).combo("getValues");
  99. if(_24.is(":visible")){
  100. _24.find(".combobox-item-selected").each(function(){
  101. var row=_23.finder.getRow(_20,$(this));
  102. if(row){
  103. if($.easyui.indexOfArray(_25,row[_23.valueField])==-1){
  104. $(this).removeClass("combobox-item-selected");
  105. }
  106. }
  107. });
  108. }
  109. $.map(_25,function(v){
  110. if($.easyui.indexOfArray(_21,v)==-1){
  111. var el=_23.finder.getEl(_20,v);
  112. if(el.hasClass("combobox-item-selected")){
  113. el.removeClass("combobox-item-selected");
  114. _23.onUnselect.call(_20,_23.finder.getRow(_20,v));
  115. }
  116. }
  117. });
  118. var _26=null;
  119. var vv=[],ss=[];
  120. for(var i=0;i<_21.length;i++){
  121. var v=_21[i];
  122. var s=v;
  123. var row=_23.finder.getRow(_20,v);
  124. if(row){
  125. s=row[_23.textField];
  126. _26=row;
  127. var el=_23.finder.getEl(_20,v);
  128. if(!el.hasClass("combobox-item-selected")){
  129. el.addClass("combobox-item-selected");
  130. _23.onSelect.call(_20,row);
  131. }
  132. }
  133. vv.push(v);
  134. ss.push(s);
  135. }
  136. if(!_22){
  137. $(_20).combo("setText",ss.join(_23.separator));
  138. }
  139. if(_23.showItemIcon){
  140. var tb=$(_20).combobox("textbox");
  141. tb.removeClass("textbox-bgicon "+_23.textboxIconCls);
  142. if(_26&&_26.iconCls){
  143. tb.addClass("textbox-bgicon "+_26.iconCls);
  144. _23.textboxIconCls=_26.iconCls;
  145. }
  146. }
  147. $(_20).combo("setValues",vv);
  148. _24.triggerHandler("scroll");
  149. };
  150. function _27(_28,_29,_2a){
  151. var _2b=$.data(_28,"combobox");
  152. var _2c=_2b.options;
  153. _2b.data=_2c.loadFilter.call(_28,_29);
  154. _2c.view.render.call(_2c.view,_28,$(_28).combo("panel"),_2b.data);
  155. var vv=$(_28).combobox("getValues");
  156. $.easyui.forEach(_2b.data,false,function(row){
  157. if(row["selected"]){
  158. $.easyui.addArrayItem(vv,row[_2c.valueField]+"");
  159. }
  160. });
  161. if(_2c.multiple){
  162. _19(_28,vv,_2a);
  163. }else{
  164. _19(_28,vv.length?[vv[vv.length-1]]:[],_2a);
  165. }
  166. _2c.onLoadSuccess.call(_28,_29);
  167. };
  168. function _2d(_2e,url,_2f,_30){
  169. var _31=$.data(_2e,"combobox").options;
  170. if(url){
  171. _31.url=url;
  172. }
  173. _2f=$.extend({},_31.queryParams,_2f||{});
  174. if(_31.onBeforeLoad.call(_2e,_2f)==false){
  175. return;
  176. }
  177. _31.loader.call(_2e,_2f,function(_32){
  178. _27(_2e,_32,_30);
  179. },function(){
  180. _31.onLoadError.apply(this,arguments);
  181. });
  182. };
  183. function _33(_34,q){
  184. var _35=$.data(_34,"combobox");
  185. var _36=_35.options;
  186. var _37=$();
  187. var qq=_36.multiple?q.split(_36.separator):[q];
  188. if(_36.mode=="remote"){
  189. _38(qq);
  190. _2d(_34,null,{q:q},true);
  191. }else{
  192. var _39=$(_34).combo("panel");
  193. _39.find(".combobox-item-hover").removeClass("combobox-item-hover");
  194. _39.find(".combobox-item,.combobox-group").hide();
  195. var _3a=_35.data;
  196. var vv=[];
  197. $.map(qq,function(q){
  198. q=$.trim(q);
  199. var _3b=q;
  200. var _3c=undefined;
  201. _37=$();
  202. for(var i=0;i<_3a.length;i++){
  203. var row=_3a[i];
  204. if(_36.filter.call(_34,q,row)){
  205. var v=row[_36.valueField];
  206. var s=row[_36.textField];
  207. var g=row[_36.groupField];
  208. var _3d=_36.finder.getEl(_34,v).show();
  209. if(s.toLowerCase()==q.toLowerCase()){
  210. _3b=v;
  211. if(_36.reversed){
  212. _37=_3d;
  213. }else{
  214. _13(_34,v,true);
  215. }
  216. }
  217. if(_36.groupField&&_3c!=g){
  218. _36.finder.getGroupEl(_34,g).show();
  219. _3c=g;
  220. }
  221. }
  222. }
  223. vv.push(_3b);
  224. });
  225. _38(vv);
  226. }
  227. function _38(vv){
  228. if(_36.reversed){
  229. _37.addClass("combobox-item-hover");
  230. }else{
  231. _19(_34,_36.multiple?(q?vv:[]):vv,true);
  232. }
  233. };
  234. };
  235. function _3e(_3f){
  236. var t=$(_3f);
  237. var _40=t.combobox("options");
  238. var _41=t.combobox("panel");
  239. var _42=_41.children("div.combobox-item-hover");
  240. if(_42.length){
  241. _42.removeClass("combobox-item-hover");
  242. var row=_40.finder.getRow(_3f,_42);
  243. var _43=row[_40.valueField];
  244. if(_40.multiple){
  245. if(_42.hasClass("combobox-item-selected")){
  246. t.combobox("unselect",_43);
  247. }else{
  248. t.combobox("select",_43);
  249. }
  250. }else{
  251. t.combobox("select",_43);
  252. }
  253. }
  254. var vv=[];
  255. $.map(t.combobox("getValues"),function(v){
  256. if(_1(_3f,v)>=0){
  257. vv.push(v);
  258. }
  259. });
  260. t.combobox("setValues",vv);
  261. if(!_40.multiple){
  262. t.combobox("hidePanel");
  263. }
  264. };
  265. function _44(_45){
  266. var _46=$.data(_45,"combobox");
  267. var _47=_46.options;
  268. $(_45).addClass("combobox-f");
  269. $(_45).combo($.extend({},_47,{onShowPanel:function(){
  270. $(this).combo("panel").find("div.combobox-item:hidden,div.combobox-group:hidden").show();
  271. _19(this,$(this).combobox("getValues"),true);
  272. $(this).combobox("scrollTo",$(this).combobox("getValue"));
  273. _47.onShowPanel.call(this);
  274. }}));
  275. var p=$(_45).combo("panel");
  276. p.unbind(".combobox");
  277. for(var _48 in _47.panelEvents){
  278. p.bind(_48+".combobox",{target:_45},_47.panelEvents[_48]);
  279. }
  280. };
  281. function _49(e){
  282. $(this).children("div.combobox-item-hover").removeClass("combobox-item-hover");
  283. var _4a=$(e.target).closest("div.combobox-item");
  284. if(!_4a.hasClass("combobox-item-disabled")){
  285. _4a.addClass("combobox-item-hover");
  286. }
  287. e.stopPropagation();
  288. };
  289. function _4b(e){
  290. $(e.target).closest("div.combobox-item").removeClass("combobox-item-hover");
  291. e.stopPropagation();
  292. };
  293. function _4c(e){
  294. var _4d=$(this).panel("options").comboTarget;
  295. if(!_4d){
  296. return;
  297. }
  298. var _4e=$(_4d).combobox("options");
  299. var _4f=$(e.target).closest("div.combobox-item");
  300. if(!_4f.length||_4f.hasClass("combobox-item-disabled")){
  301. return;
  302. }
  303. var row=_4e.finder.getRow(_4d,_4f);
  304. if(!row){
  305. return;
  306. }
  307. if(_4e.blurTimer){
  308. clearTimeout(_4e.blurTimer);
  309. _4e.blurTimer=null;
  310. }
  311. _4e.onClick.call(_4d,row);
  312. var _50=row[_4e.valueField];
  313. if(_4e.multiple){
  314. if(_4f.hasClass("combobox-item-selected")){
  315. _1a(_4d,_50);
  316. }else{
  317. _13(_4d,_50);
  318. }
  319. }else{
  320. $(_4d).combobox("setValue",_50).combobox("hidePanel");
  321. }
  322. e.stopPropagation();
  323. };
  324. function _51(e){
  325. var _52=$(this).panel("options").comboTarget;
  326. if(!_52){
  327. return;
  328. }
  329. var _53=$(_52).combobox("options");
  330. if(_53.groupPosition=="sticky"){
  331. var _54=$(this).children(".combobox-stick");
  332. if(!_54.length){
  333. _54=$("<div class=\"combobox-stick\"></div>").appendTo(this);
  334. }
  335. _54.hide();
  336. var _55=$(_52).data("combobox");
  337. $(this).children(".combobox-group:visible").each(function(){
  338. var g=$(this);
  339. var _56=_53.finder.getGroup(_52,g);
  340. var _57=_55.data[_56.startIndex+_56.count-1];
  341. var _58=_53.finder.getEl(_52,_57[_53.valueField]);
  342. if(g.position().top<0&&_58.position().top>0){
  343. _54.show().html(g.html());
  344. return false;
  345. }
  346. });
  347. }
  348. };
  349. $.fn.combobox=function(_59,_5a){
  350. if(typeof _59=="string"){
  351. var _5b=$.fn.combobox.methods[_59];
  352. if(_5b){
  353. return _5b(this,_5a);
  354. }else{
  355. return this.combo(_59,_5a);
  356. }
  357. }
  358. _59=_59||{};
  359. return this.each(function(){
  360. var _5c=$.data(this,"combobox");
  361. if(_5c){
  362. $.extend(_5c.options,_59);
  363. }else{
  364. _5c=$.data(this,"combobox",{options:$.extend({},$.fn.combobox.defaults,$.fn.combobox.parseOptions(this),_59),data:[]});
  365. }
  366. _44(this);
  367. if(_5c.options.data){
  368. _27(this,_5c.options.data);
  369. }else{
  370. var _5d=$.fn.combobox.parseData(this);
  371. if(_5d.length){
  372. _27(this,_5d);
  373. }
  374. }
  375. _2d(this);
  376. });
  377. };
  378. $.fn.combobox.methods={options:function(jq){
  379. var _5e=jq.combo("options");
  380. return $.extend($.data(jq[0],"combobox").options,{width:_5e.width,height:_5e.height,originalValue:_5e.originalValue,disabled:_5e.disabled,readonly:_5e.readonly});
  381. },cloneFrom:function(jq,_5f){
  382. return jq.each(function(){
  383. $(this).combo("cloneFrom",_5f);
  384. $.data(this,"combobox",$(_5f).data("combobox"));
  385. $(this).addClass("combobox-f").attr("comboboxName",$(this).attr("textboxName"));
  386. });
  387. },getData:function(jq){
  388. return $.data(jq[0],"combobox").data;
  389. },setValues:function(jq,_60){
  390. return jq.each(function(){
  391. _19(this,_60);
  392. });
  393. },setValue:function(jq,_61){
  394. return jq.each(function(){
  395. _19(this,$.isArray(_61)?_61:[_61]);
  396. });
  397. },clear:function(jq){
  398. return jq.each(function(){
  399. _19(this,[]);
  400. });
  401. },reset:function(jq){
  402. return jq.each(function(){
  403. var _62=$(this).combobox("options");
  404. if(_62.multiple){
  405. $(this).combobox("setValues",_62.originalValue);
  406. }else{
  407. $(this).combobox("setValue",_62.originalValue);
  408. }
  409. });
  410. },loadData:function(jq,_63){
  411. return jq.each(function(){
  412. _27(this,_63);
  413. });
  414. },reload:function(jq,url){
  415. return jq.each(function(){
  416. if(typeof url=="string"){
  417. _2d(this,url);
  418. }else{
  419. if(url){
  420. var _64=$(this).combobox("options");
  421. _64.queryParams=url;
  422. }
  423. _2d(this);
  424. }
  425. });
  426. },select:function(jq,_65){
  427. return jq.each(function(){
  428. _13(this,_65);
  429. });
  430. },unselect:function(jq,_66){
  431. return jq.each(function(){
  432. _1a(this,_66);
  433. });
  434. },scrollTo:function(jq,_67){
  435. return jq.each(function(){
  436. _5(this,_67);
  437. });
  438. }};
  439. $.fn.combobox.parseOptions=function(_68){
  440. var t=$(_68);
  441. return $.extend({},$.fn.combo.parseOptions(_68),$.parser.parseOptions(_68,["valueField","textField","groupField","groupPosition","mode","method","url",{showItemIcon:"boolean",limitToList:"boolean"}]));
  442. };
  443. $.fn.combobox.parseData=function(_69){
  444. var _6a=[];
  445. var _6b=$(_69).combobox("options");
  446. $(_69).children().each(function(){
  447. if(this.tagName.toLowerCase()=="optgroup"){
  448. var _6c=$(this).attr("label");
  449. $(this).children().each(function(){
  450. _6d(this,_6c);
  451. });
  452. }else{
  453. _6d(this);
  454. }
  455. });
  456. return _6a;
  457. function _6d(el,_6e){
  458. var t=$(el);
  459. var row={};
  460. row[_6b.valueField]=t.attr("value")!=undefined?t.attr("value"):t.text();
  461. row[_6b.textField]=t.text();
  462. row["selected"]=t.is(":selected");
  463. row["disabled"]=t.is(":disabled");
  464. if(_6e){
  465. _6b.groupField=_6b.groupField||"group";
  466. row[_6b.groupField]=_6e;
  467. }
  468. _6a.push(row);
  469. };
  470. };
  471. var _6f=0;
  472. var _70={render:function(_71,_72,_73){
  473. var _74=$.data(_71,"combobox");
  474. var _75=_74.options;
  475. _6f++;
  476. _74.itemIdPrefix="_easyui_combobox_i"+_6f;
  477. _74.groupIdPrefix="_easyui_combobox_g"+_6f;
  478. _74.groups=[];
  479. var dd=[];
  480. var _76=undefined;
  481. for(var i=0;i<_73.length;i++){
  482. var row=_73[i];
  483. var v=row[_75.valueField]+"";
  484. var s=row[_75.textField];
  485. var g=row[_75.groupField];
  486. if(g){
  487. if(_76!=g){
  488. _76=g;
  489. _74.groups.push({value:g,startIndex:i,count:1});
  490. dd.push("<div id=\""+(_74.groupIdPrefix+"_"+(_74.groups.length-1))+"\" class=\"combobox-group\">");
  491. dd.push(_75.groupFormatter?_75.groupFormatter.call(_71,g):g);
  492. dd.push("</div>");
  493. }else{
  494. _74.groups[_74.groups.length-1].count++;
  495. }
  496. }else{
  497. _76=undefined;
  498. }
  499. var cls="combobox-item"+(row.disabled?" combobox-item-disabled":"")+(g?" combobox-gitem":"");
  500. dd.push("<div id=\""+(_74.itemIdPrefix+"_"+i)+"\" class=\""+cls+"\">");
  501. if(_75.showItemIcon&&row.iconCls){
  502. dd.push("<span class=\"combobox-icon "+row.iconCls+"\"></span>");
  503. }
  504. dd.push(_75.formatter?_75.formatter.call(_71,row):s);
  505. dd.push("</div>");
  506. }
  507. $(_72).html(dd.join(""));
  508. }};
  509. $.fn.combobox.defaults=$.extend({},$.fn.combo.defaults,{valueField:"value",textField:"text",groupPosition:"static",groupField:null,groupFormatter:function(_77){
  510. return _77;
  511. },mode:"local",method:"post",url:null,data:null,queryParams:{},showItemIcon:false,limitToList:false,view:_70,keyHandler:{up:function(e){
  512. _b(this,"prev");
  513. e.preventDefault();
  514. },down:function(e){
  515. _b(this,"next");
  516. e.preventDefault();
  517. },left:function(e){
  518. },right:function(e){
  519. },enter:function(e){
  520. _3e(this);
  521. },query:function(q,e){
  522. _33(this,q);
  523. }},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){
  524. var _78=e.data.target;
  525. var _79=$(_78).combobox("options");
  526. if(_79.reversed||_79.limitToList){
  527. if(_79.blurTimer){
  528. clearTimeout(_79.blurTimer);
  529. }
  530. _79.blurTimer=setTimeout(function(){
  531. var _7a=$(_78).parent().length;
  532. if(_7a){
  533. if(_79.reversed){
  534. $(_78).combobox("setValues",$(_78).combobox("getValues"));
  535. }else{
  536. if(_79.limitToList){
  537. _3e(_78);
  538. }
  539. }
  540. _79.blurTimer=null;
  541. }
  542. },50);
  543. }
  544. }}),panelEvents:{mouseover:_49,mouseout:_4b,click:_4c,scroll:_51},filter:function(q,row){
  545. var _7b=$(this).combobox("options");
  546. return row[_7b.textField].toLowerCase().indexOf(q.toLowerCase())>=0;
  547. },formatter:function(row){
  548. var _7c=$(this).combobox("options");
  549. return row[_7c.textField];
  550. },loader:function(_7d,_7e,_7f){
  551. var _80=$(this).combobox("options");
  552. if(!_80.url){
  553. return false;
  554. }
  555. $.ajax({type:_80.method,url:_80.url,data:_7d,dataType:"json",success:function(_81){
  556. _7e(_81);
  557. },error:function(){
  558. _7f.apply(this,arguments);
  559. }});
  560. },loadFilter:function(_82){
  561. return _82;
  562. },finder:{getEl:function(_83,_84){
  563. var _85=_1(_83,_84);
  564. var id=$.data(_83,"combobox").itemIdPrefix+"_"+_85;
  565. return $("#"+id);
  566. },getGroupEl:function(_86,_87){
  567. var _88=$.data(_86,"combobox");
  568. var _89=$.easyui.indexOfArray(_88.groups,"value",_87);
  569. var id=_88.groupIdPrefix+"_"+_89;
  570. return $("#"+id);
  571. },getGroup:function(_8a,p){
  572. var _8b=$.data(_8a,"combobox");
  573. var _8c=p.attr("id").substr(_8b.groupIdPrefix.length+1);
  574. return _8b.groups[parseInt(_8c)];
  575. },getRow:function(_8d,p){
  576. var _8e=$.data(_8d,"combobox");
  577. var _8f=(p instanceof $)?p.attr("id").substr(_8e.itemIdPrefix.length+1):_1(_8d,p);
  578. return _8e.data[parseInt(_8f)];
  579. }},onBeforeLoad:function(_90){
  580. },onLoadSuccess:function(_91){
  581. },onLoadError:function(){
  582. },onSelect:function(_92){
  583. },onUnselect:function(_93){
  584. },onClick:function(_94){
  585. }});
  586. })(jQuery);