fwcombox.js 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148
  1. (function($){
  2. function selectPrev(target){
  3. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  4. var panelbody = $('.fwcombox-panel-body',fwpanel);
  5. var item = fwpanel.find('div.fwcombox-item-selected');
  6. if (item.length){
  7. //找到匹配的项
  8. var prev = item.prevAll(':visible');
  9. if (prev.length){
  10. //如果有上方还有选项
  11. item = prev.eq(0);
  12. }else{
  13. //如果已经是第一项,那么光标定位到最后一项
  14. item = panelbody.find('div.fwcombox-item:visible:last');
  15. }
  16. }
  17. //没有任何项就直接退出
  18. if(item.length==0)return;
  19. if (item.position().top <= 0){
  20. var h = panelbody.scrollTop() + item.position().top;
  21. panelbody.scrollTop(h);
  22. } else if (item.position().top + item.outerHeight() > panelbody.height()){
  23. var h = panelbody.scrollTop() + item.position().top + item.outerHeight() - panelbody.height();
  24. panelbody.scrollTop(h);
  25. }
  26. var value = item.attr('value');
  27. setValue(target, value);
  28. }
  29. /**
  30. * select next item
  31. */
  32. function selectNext(target){
  33. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  34. var panelbody = $('.fwcombox-panel-body',fwpanel);
  35. var item = fwpanel.find('div.fwcombox-item-selected');
  36. if (item.length){
  37. //找到匹配的项
  38. var next = item.nextAll(':visible');
  39. if (next.length){
  40. //如果有下方还有选项
  41. item = next.eq(0);
  42. }else{
  43. //如果已经是第一项,那么光标定位到最后一项
  44. item = panelbody.find('div.fwcombox-item:visible:first');
  45. }
  46. }
  47. //没有任何项就直接退出
  48. if(item.length==0)return;
  49. if (item.position().top <= 0){
  50. var h = fwpanel.scrollTop() + item.position().top;
  51. panelbody.scrollTop(h);
  52. } else if (item.position().top + item.outerHeight() > panelbody.height()){
  53. var h = panelbody.scrollTop() + item.position().top + item.outerHeight() - panelbody.height();
  54. panelbody.scrollTop(h);
  55. }
  56. var value = item.attr('value');
  57. setValue(target, value);
  58. }
  59. function selectCurr(target){
  60. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  61. var item = fwpanel.find('div.fwcombox-item-selected');
  62. select(target, item.attr('value'));
  63. }
  64. /**
  65. * select the specified value
  66. */
  67. function select(target, value){
  68. var opts = $.data(target, 'fwcombox').options;
  69. var data = $.data(target, 'fwcombox').data;
  70. hidePanel(target);
  71. setValue(target, value,true);
  72. /*
  73. var combo = $.data(target, 'fwcombox').fwcombox;
  74. var input = combo.find('.fwcombox-text');
  75. for(var i=0; i<data.length; i++){
  76. if (data[i][opts.valueField] == value){
  77. //opts.onSelect.call(target, data[i]);
  78. return;
  79. }
  80. }*/
  81. }
  82. /**
  83. * unselect the specified value
  84. */
  85. function unselect(target, value){
  86. var opts = $.data(target, 'fwcombox').options;
  87. var data = $.data(target, 'fwcombox').data;
  88. var value = getValue(target);
  89. setValue(target, '',true);
  90. for(var i=0; i<data.length; i++){
  91. if (data[i][opts.valueField] == value){
  92. opts.onUnselect.call(target, data[i]);
  93. return;
  94. }
  95. }
  96. }
  97. /**
  98. * set values
  99. */
  100. function setValue(target,value,confirm,isInit){
  101. var opts = $.data(target, 'fwcombox').options;
  102. var data = $.data(target, 'fwcombox').data;
  103. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  104. var panelbody = $('.fwcombox-panel-body',fwpanel);
  105. var s='';
  106. var b=false;
  107. var selectedRecord = {};
  108. value = value || "";
  109. if(data!=null){
  110. for(var j=0; j<data.length; j++){
  111. if (data[j][opts.valueField] == value){
  112. s = data[j][opts.textField];
  113. selectedRecord = data[j];
  114. b = true;
  115. break;
  116. }
  117. }
  118. } else if(!opts.dataLoad && !isNull(value)) {
  119. loadData(target, transformData(target));
  120. opts.dataLoad = true;
  121. }
  122. //若是data 还未初始化则从IE默认的下拉框内取
  123. if(!b){
  124. $('>option', target).each(function(){
  125. var v = $(this).attr('value');
  126. if(v == value){
  127. s = $(this).text();
  128. selectedRecord[opts.textField] = s;
  129. selectedRecord[opts.valueField] = value;
  130. return false;
  131. }
  132. });
  133. }
  134. panelbody.find('div.fwcombox-item-selected').removeClass('fwcombox-item-selected');
  135. panelbody.find('div.fwcombox-item[value=' + value + ']').addClass('fwcombox-item-selected');
  136. //按displayCol的配置显示具体的值
  137. if(confirm){
  138. if ('AAA102' == opts.displayCol) {
  139. setText(target, value);
  140. } else if ('AAA103' == opts.displayCol) {
  141. setText(target, s.substr(value.length + 1));
  142. } else {
  143. setText(target, s);
  144. }
  145. setComValue(target,value,isInit);
  146. if(!isInit)
  147. opts.onSelect.call(target, selectedRecord);
  148. }
  149. }
  150. function setComValue(target, value,isInit){
  151. var opts = $.data(target, 'fwcombox').options;
  152. var oldValue = getValue(target);
  153. var combo = $.data(target, 'fwcombox').fwcombox;
  154. target.value = value+"";
  155. if(!isInit && oldValue!=target.value){
  156. $(target).trigger('change');
  157. }
  158. opts.onChange.call(target, value, oldValue);
  159. //联动的时候生成子的下拉内容
  160. if(opts.ldcombox){
  161. var comtype = target.comtype;
  162. if(comtype=='child'){return true;}
  163. LDsetChildValue(target,value);
  164. return true;
  165. }
  166. }
  167. function transformData(target){
  168. var opts = $.data(target, 'fwcombox').options;
  169. var data = [];
  170. var dname = target.dname;
  171. var whereCls = target.whereCls;
  172. var dictType = target.dictType;
  173. var dictArray = null;
  174. if (!isNull(dname) && dictType === "default"){
  175. try {
  176. if (FW.getDictMode() == FW.DICTMODES.LOCAL ) {
  177. var localDictObj = FWGetDictApplet();
  178. var dictStr = localDictObj.getDict(dname,whereCls);
  179. dictArray = JSON.parse(dictStr);
  180. } else {
  181. dictArray = FW.getDict(dname,whereCls);
  182. }
  183. } catch(e) {
  184. }
  185. if (!isNull(dictArray)) {
  186. for(var i=0;i<dictArray.length;i++) {
  187. var item = {};
  188. item[opts.valueField] = dictArray[i][0];
  189. item[opts.textField] = dictArray[i][0]+"-"+dictArray[i][2];
  190. data.push(item);
  191. }
  192. var item = {};
  193. item[opts.valueField] = '';
  194. item[opts.textField]= "";
  195. item['selected'] = 'selected';
  196. data.push(item);
  197. }
  198. } else {
  199. $('>option', target).each(function(){
  200. var item = {};
  201. item[opts.valueField] = $(this).attr('value');
  202. //为联动下拉框
  203. //生成下拉框是现实的文本格式为 荔湾区|401 401表示父的值
  204. if(opts.ldcombox&&comtype=="child"){
  205. comtext = $(this).html();
  206. var sp = comtext.split('|');
  207. item[opts.textField] = sp[0];
  208. item['parentvalue'] = sp[1];
  209. }else{
  210. item[opts.textField] = $(this).text();
  211. }
  212. item['selected'] = $(this).attr('selected');
  213. item['disabled'] = this.disabled;/*标志是否被过滤的对象*/
  214. data.push(item);
  215. });
  216. }
  217. return data;
  218. }
  219. /**
  220. * load data, the old list items will be removed.
  221. */
  222. function removeItem(target,value){
  223. var opts = $.data(target, 'fwcombox').options;
  224. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  225. var panelbody = $('.fwcombox-panel-body',fwpanel);
  226. //若还没有初始化列表,先初始化
  227. if(!opts.dataLoad){
  228. if(!opts.remotedb){
  229. loadData(target, transformData(target));
  230. }
  231. if (opts.data){
  232. loadData(target, opts.data);
  233. }
  234. opts.dataLoad = true;
  235. }
  236. var data = $.data(target, 'fwcombox').data;
  237. for(var i=0; i<data.length; i++){
  238. if(data[i][opts.valueField] == value){
  239. data.splice(i,1);
  240. var item = panelbody.find('div.fwcombox-item[value=' + value + ']');
  241. item.remove();
  242. break;
  243. }
  244. }
  245. $.data(target, 'fwcombox').data = data;
  246. }
  247. function initOptions(target,data) {
  248. target.options.length=0;
  249. for(var i=0; i<data.length; i++){
  250. no = new Option();
  251. no.value = data[i][opts.valueField];
  252. no.text = data[i][opts.textField];
  253. target.options[target.options.length] = no;
  254. }
  255. }
  256. /**
  257. * load data, the old list items will be removed.
  258. */
  259. function loadData(target, data){
  260. var opts = $.data(target, 'fwcombox').options;
  261. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  262. var panelbody = $('.fwcombox-panel-body',fwpanel);
  263. var selected = [];
  264. $.data(target, 'fwcombox').data = data;
  265. panelbody.empty(); // clear old data
  266. var isRefresh = opts.remotedb || FW.getDictMode() == FW.DICTMODES.LOCAL;
  267. //实现远程数据库的录入查询
  268. //清空原来的值
  269. if(isRefresh){target.options.length=0;}
  270. for(var i=0; i<data.length; i++){
  271. var item = $('<div class="fwcombox-item"></div>').appendTo(panelbody);
  272. item.attr({'value': data[i][opts.valueField],'disabled':data[i].disabled});
  273. if(data[i].disabled){
  274. item.hide();
  275. }
  276. item.html(data[i][opts.textField]);
  277. if (data[i]['selected']){
  278. selected.push(data[i][opts.valueField]);
  279. }
  280. //需要将查询到的值初始化给原先的下拉框
  281. //if(isRefresh){
  282. no = new Option();
  283. no.value = data[i][opts.valueField];
  284. no.text = data[i][opts.textField];
  285. target.options[target.options.length] = no;
  286. //}
  287. isRefresh=true;
  288. }
  289. if(isRefresh){
  290. target.value='';
  291. }
  292. if(!opts.remotedb){
  293. if (selected.length){
  294. setValue(target,selected[0],false,true);
  295. } else {
  296. setValue(target,'',false,true);
  297. }
  298. }
  299. opts.onLoadSuccess.call(target, data);
  300. $('.fwcombox-item', fwpanel).hover(
  301. function(){$(this).addClass('fwcombox-item-hover');},
  302. function(){$(this).removeClass('fwcombox-item-hover');}
  303. ).click(function(){
  304. var item = $(this);
  305. select(target,item.attr('value'));
  306. });
  307. }
  308. /**
  309. * request remote data if the url property is setted.
  310. */
  311. function request(target, query){
  312. var opts = $.data(target, 'fwcombox').options;
  313. if (!opts.url) return;
  314. var param = $.extend({}, {"configid":opts.dname,"query":query});
  315. $.ajax({
  316. url:opts.url,
  317. data: param,
  318. dataType:'json',
  319. cache:false,
  320. success:function(data){
  321. if(data.Token!=null){
  322. token=data.Token;//更新全局变量token标志
  323. }
  324. if("1"!=data.FHZ){//出错了,弹出错误提醒
  325. if("CSRF" == data.FHZ){
  326. showMsg(data.MSG||'',3);
  327. return;
  328. }
  329. }
  330. var da=getData(target,data);
  331. loadData(target, da);
  332. },
  333. error:function(){
  334. opts.onLoadError.apply(this, arguments);
  335. },
  336. beforeSend:function(XMLHttpRequest ){
  337. var cToken = $.cookie("Token") || token;XMLHttpRequest.setRequestHeader('Token',cToken);
  338. }
  339. });
  340. }
  341. function getData(target,data){
  342. var opts = $.data(target, 'fwcombox').options;
  343. var rows = data.rows;
  344. var total = data.total;
  345. var iC=0;
  346. var data = [];
  347. if(rows&&rows.length>0){
  348. iC = total - rows.length;
  349. }else{
  350. return data;
  351. }
  352. for(var i=0; i<rows.length; i++) {
  353. var item = {};
  354. item[opts.valueField] = rows[i][0];
  355. item[opts.textField] = rows[i][1];
  356. data.push(item);
  357. }
  358. if(iC>0){
  359. var item = {};
  360. item[opts.valueField] = " ";
  361. item[opts.textField] = "剩余 "+iC+" 记录未显示";
  362. data.push(item);
  363. }
  364. return data;
  365. };
  366. function filter(target, query){
  367. var data = $.data(target, 'fwcombox').data;
  368. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  369. var panelbody = $('.fwcombox-panel-body',fwpanel);
  370. var opts = $.data(target, 'fwcombox').options;
  371. var bEnter = false;
  372. opts.search = false;
  373. //去掉之前的选中状态
  374. panelbody.find('div.fwcombox-item-selected').removeClass('fwcombox-item-selected');
  375. showPanel(target);
  376. if(!opts.remotedb){
  377. target.value='';
  378. var hasSelect = false;//集合中是否有符合要求的记录
  379. var showItems = panelbody.find('div.fwcombox-item').each(function(){
  380. var item = $(this);
  381. var itemText = item.text();
  382. if ((!this.disabled)&&itemText.indexOf(query) != -1){
  383. item.show();
  384. if (itemText == query){
  385. setValue(target, item.attr('value'));
  386. hasSelect = true;
  387. }
  388. bEnter =true;
  389. }else if((!this.disabled)&&isPinyinMatch(itemText,query)){
  390. item.show();
  391. bEnter =true;
  392. } else {
  393. item.hide();
  394. }
  395. }).filter(':visible');
  396. //如果没有完全匹配的,那么默认选中第一个
  397. if(showItems.length > 0 && !hasSelect){
  398. //showItems.first().addClass('fwcombox-item-selected');
  399. setValue(target, showItems.first().attr('value'));
  400. }else if (showItems.length==0){
  401. setValue(target, '');
  402. }
  403. }
  404. if(opts.remotedb){
  405. request(target,query);
  406. }
  407. }
  408. //设置不可编辑属性
  409. function setDisabled(target, disabled){
  410. var opts = $.data(target, 'fwcombox').options;
  411. var combo = $.data(target, 'fwcombox').fwcombox;
  412. if (disabled){
  413. opts.disabled = true;
  414. //$(target).attr('disabled', true);
  415. $(target).removeAttr('disabled');
  416. var input = combo.find('.fwcombox-text');
  417. if(input.length>0){
  418. disablePrimitiveInput(input[0]);
  419. }
  420. } else {
  421. opts.disabled = false;
  422. $(target).removeAttr('disabled');
  423. combo.find('.fwcombox-text').removeAttr('disabled')
  424. .click(function(){
  425. this.select();
  426. });
  427. }
  428. }
  429. function setSize(target){
  430. var opts = $.data(target, 'fwcombox').options;
  431. var combo = $.data(target, 'fwcombox').fwcombox;
  432. var panel = $.data(target, 'fwcombox').fwpanel;
  433. //combo.width(opts.width);
  434. combo.width($(target).outerWidth());
  435. var arrowWidth = combo.find('.fwcombox-arrow').outerWidth();
  436. var width = $(target).outerWidth() - arrowWidth-2;
  437. combo.find('input.fwcombox-text').width(width);
  438. //如果手动设置了宽度,那么用手动设置的
  439. panel.css({
  440. width:opts.fwpanelWidth=='auto'?combo.outerWidth():opts.fwpanelWidth
  441. }).find('.fwcombox-panel-body').css({
  442. height:opts.fwpanelHeight=='auto'?'200': opts.fwpanelHeight
  443. });
  444. }
  445. /**
  446. * hide the drop down panel.
  447. */
  448. function hidePanel(target){
  449. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  450. fwpanel.hide();
  451. }
  452. /**
  453. * show the drop down panel.
  454. */
  455. function showPanel(target){
  456. var combo = $.data(target, 'fwcombox').fwcombox;
  457. var panel = $.data(target, 'fwcombox').fwpanel;
  458. var opts = $.data(target, 'fwcombox').options;
  459. var items = panel.find('div');
  460. /* for(var i=1, len=items.length;i<len;i++){
  461. if(!items[i].disabled){
  462. items[i].style.display="block";
  463. }
  464. }
  465. */
  466. //第一次显示时创建下拉列表的数据
  467. //这样处理的目的是加快控制第一次初始化时的速度
  468. if(!opts.dataLoad){
  469. if(!opts.remotedb){
  470. loadData(target, transformData(target));
  471. } else {
  472. if (opts.data){
  473. loadData(target, opts.data);
  474. }
  475. }
  476. opts.dataLoad = true;
  477. }
  478. //重新计算panel的zindex
  479. var zindex = 0;
  480. $(combo).parents().each(function(){
  481. zindex+=parseInt($(this).css('z-index'));
  482. });
  483. $.data(target, 'fwcombox').fwpanel.css('z-index',zindex);
  484. //每次调整只计算一次,免得重复计算
  485. panel.removeAttr('hasResize');
  486. panel.show();
  487. if (panel.is(':visible')){
  488. //下拉框放到DIV内并且初始化时DIV是不可见的,设置DIV可见时
  489. //下拉列表无法显示,需要修改宽度和高度
  490. if(panel.width()<5){
  491. setSize(target);
  492. }
  493. var top = combo.offset().top + combo.outerHeight();
  494. if (top + panel.outerHeight() > $(window).height() + $(document).scrollTop()){
  495. top = combo.offset().top - panel.outerHeight();
  496. }
  497. if (top < $(document).scrollTop()){
  498. top = combo.offset().top + combo.outerHeight();
  499. }
  500. panel.css({
  501. left:combo.offset().left,
  502. top:top
  503. });
  504. //设置左上角位置(考虑屏幕边界截屏的问题)
  505. if(combo.offset().left+panel.width()>$(window).width()){
  506. panel.css({
  507. left:$(window).width()-panel.width()-3,/*加3预防window出现水平滚动栏*/
  508. top:top
  509. });
  510. }else{
  511. panel.css({
  512. left:combo.offset().left,
  513. top:top
  514. });
  515. }
  516. //setTimeout(arguments.callee, 200);
  517. }
  518. }
  519. function setText(target, text){
  520. var combo = $.data(target, 'fwcombox').fwcombox;
  521. combo.find('input.fwcombox-text').val(text);
  522. }
  523. function getValue(target){
  524. var combo = $.data(target, 'fwcombox').fwcombox;
  525. return target.value;
  526. }
  527. function destroy(target){
  528. $.data(target, 'fwcombox').fwpanel.remove();
  529. $.data(target, 'fwcombox').fwcombox.remove();
  530. $(target).remove();
  531. }
  532. function bindEvents(target){
  533. var opts = $.data(target, 'fwcombox').options;
  534. var combo = $.data(target, 'fwcombox').fwcombox;
  535. var panel = $.data(target, 'fwcombox').fwpanel;
  536. var input = combo.find('.fwcombox-text');
  537. var arrow = combo.find('.fwcombox-arrow');
  538. //$(document).unbind('.fwcombox');
  539. combo.unbind('.fwcombox');
  540. panel.unbind('.fwcombox');
  541. input.unbind('.fwcombox');
  542. arrow.unbind('.fwcombox');
  543. $(target).addClass('fwresize').bind('fwresize',function(){
  544. var comopts = $.data(this, 'fwcombox').options;
  545. comopts.setSize(target);
  546. });
  547. if (!opts.disabled){
  548. /*
  549. $(document).bind('mousedown.fwcombox', function(e){
  550. hidePanel(target);
  551. });
  552. panel.bind('mousedown.fwcombox', function(e){
  553. return false;
  554. });
  555. */
  556. //zzy add 2010-10-08 begin 失去焦点时关闭下拉项
  557. input.bind('keydown',function(e){
  558. if(e.keyCode==13 ||e.keyCode==9){
  559. //hidePanel(target);
  560. opts.selectCurr.call(target);
  561. }
  562. });
  563. //end
  564. //鼠标点击其他地方就隐藏列表
  565. $(document).bind({
  566. 'mousedown':function(e){
  567. if(e.target != input[0] &&e.target != arrow[0]
  568. &&e.target != panel[0] && panel.is(':visible')){
  569. opts.selectCurr.call(target);
  570. }
  571. },
  572. 'focus':function(e){
  573. if(e.target != input[0] &&e.target != arrow[0]
  574. &&e.target != panel[0]&& panel.is(':visible')&&e.target!=target){
  575. opts.selectCurr.call(target);
  576. }
  577. }
  578. });
  579. //鼠标移动到上面屏蔽掉
  580. panel.bind('mousedown', function(e){
  581. var element = e.srcElement;
  582. //存在滚动条的情况下单击滚动条有效
  583. if(e.offsetX>130){
  584. return false;
  585. }
  586. var iLen = 0;
  587. try{
  588. iLen = target.options.length;
  589. }catch(e){}
  590. //有可能存在滚动条
  591. if(iLen>8){
  592. return false;
  593. }
  594. if(-1 != (element.className).indexOf("fwcombox-item")){
  595. return false;//线程堵塞等待ONCLICK执行
  596. }
  597. return true;//直接返回
  598. });
  599. panel.bind('mouseenter', function(e){
  600. var ee = this;
  601. var e2 = e;
  602. if (this == e.currentTarget) {
  603. jQuery(target).data('_hide',true);
  604. //showErrMsg(jQuery(target).data('_hide'),2);
  605. }
  606. });
  607. panel.bind('mouseout', function(e){
  608. if (this != e.currentTarget) {
  609. jQuery(target).data('_hide',false);
  610. //showErrMsg(jQuery(target).data('_hide'),2);
  611. }
  612. });
  613. jQuery(target).bind('mousedown', function(e){
  614. return false;
  615. });
  616. //将hidden控件的onfocus事件专递到外部可见的input来
  617. $(target).focus(function(){
  618. input[0].select();
  619. });
  620. //回传外部的blur事件
  621. input.blur(function(e){
  622. $(target).blur();
  623. if(!jQuery(target).data('_hide')){
  624. hidePanel(target);
  625. }
  626. });
  627. input.unbind('focus.fwcombox').bind('focus.fwcombox', function(event){
  628. input[0].select();
  629. $.data(target, 'fwcombox').fwpanel.hide();
  630. showPanel(target);
  631. })/*.bind('mousedown.fwcombox', function(e){
  632. e.stopPropagation();
  633. })*/.bind('keyup.fwcombox', function(e){
  634. switch(e.keyCode){
  635. case 37: // left
  636. case 38: // up
  637. opts.selectPrev.call(target);
  638. jQuery(target).data('_hide',false);
  639. //showErrMsg(jQuery(target).data('_hide'),2);
  640. break;
  641. case 39: // right
  642. case 40: // down
  643. opts.selectNext.call(target);
  644. jQuery(target).data('_hide',false);
  645. //showErrMsg(jQuery(target).data('_hide'),2);
  646. break;
  647. case 16: //shift
  648. break;
  649. case 9: //tab
  650. case 13: // enter zzy 2010-10-08 注销防止按回车键代替TAB进入时,下拉框消失
  651. //opts.selectCurr.call(target);
  652. break;
  653. case 27: // esc
  654. hidePanel(target);
  655. break;
  656. case 46://delete
  657. clearInput(target);
  658. break;
  659. default:
  660. if (opts.editable){
  661. var queryText = $(this).val();
  662. if(!opts.remotedb){
  663. opts.filter.call(target, queryText);
  664. }else{
  665. var input = $(this);
  666. if(!opts.search){ //为了避免频繁的查询过滤
  667. opts.search = true;
  668. setTimeout(function(){
  669. filter(target,queryText);
  670. },1000*0.3); //延迟两秒处理
  671. }
  672. }
  673. }
  674. }
  675. return false;
  676. });
  677. arrow.bind('click.fwcombox', function(){
  678. input[0].select(); //hr 20111010
  679. $.data(target, 'fwcombox').fwpanel.hide();
  680. //alert("click.fwcombox");
  681. showPanel(target);
  682. }).bind('mouseenter.fwcombox', function(){
  683. $(this).addClass('fwcombox-arrow-hover');
  684. }).bind('mouseleave.fwcombox', function(){
  685. $(this).removeClass('fwcombox-arrow-hover');
  686. });
  687. }
  688. //如果target声明了onselect函数,那么绑定它
  689. if(target.onselect && window[target.onselect]){
  690. opts.onSelect = window[target.onselect];
  691. }
  692. }
  693. //单击delete键去掉选中
  694. function clearInput(target){
  695. var combo = $.data(target, 'fwcombox').fwcombox;
  696. var input = combo.find('.fwcombox-text');
  697. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  698. var panelbody = $('.fwcombox-panel-body',fwpanel);
  699. input.val('');
  700. target.value='';
  701. panelbody.find('div.fwcombox-item-selected').removeClass('fwcombox-item-selected');
  702. panelbody.find('div.fwcombox-item[value=]').addClass('fwcombox-item-selected');
  703. input.focus();
  704. }
  705. //创建下拉框
  706. function create(target){
  707. init(target);
  708. var opts = $.data(target, 'fwcombox').options;
  709. var fwcombox = $.data(target, 'fwcombox').fwcombox;
  710. opts.disabled = $(target).attr('disabled');
  711. $(target).removeAttr('disabled');
  712. $('input.fwcombox-text', fwcombox).attr('readonly', !opts.editable);
  713. setDisabled(target, opts.disabled);
  714. setSize(target);
  715. bindEvents(target);
  716. }
  717. /**
  718. * 创建下拉框的输入框已经下拉DIV
  719. */
  720. function init(target){
  721. var iWidth = $(target).outerWidth();
  722. var iHeight = $(target).outerHeight();
  723. var iTop = $(target).offset().top + iHeight;
  724. var iLeft = $(target).offset().left;
  725. //$(target).hide();
  726. var opts = $.data(target, 'fwcombox').options;
  727. var vldStr = $(target).attr('vldStr');
  728. //取原来下拉框的长度,因为IE自带的下拉框所获取的自动宽度比较正确
  729. if(opts.width=='auto'){
  730. opts.width= $(target).attr('mw');//iWidth;
  731. }
  732. /*var span = $('<span class="fwcombox"></span>').insertAfter(target);
  733. var input = $('<input type="text" class="fwcombox-text">').appendTo(span);
  734. $('<span class="fwcombox-arrow"></span>').appendTo(span);*/
  735. var span = $(target).next(".fwcombox");
  736. var fwpanel = $('<div class="fwcombox-panel"></div>').appendTo('body');
  737. //if(vldStr){
  738. // span.find('input.fwcombox-text').attr('vldStr', vldStr);
  739. // }
  740. //联动下拉框
  741. if(opts.ldcombox){
  742. var comtype = $(target).attr('comtype');
  743. if(comtype=='parent'){
  744. opts.ldchild = $(target).attr('childname');
  745. }else{
  746. opts.ldparent = $(target).attr('parentname');
  747. }
  748. }
  749. fwpanel.css({
  750. 'top':iTop,
  751. 'left':iLeft,
  752. 'display':'none'
  753. });
  754. var panelbody = $('<div class="fwcombox-panel-body"></div>').appendTo(fwpanel);
  755. /* panelbody.css({
  756. 'width':iWidth+10,
  757. 'height':'200px'
  758. });*/
  759. //input.attr('autocomplete', 'off');
  760. $.data(target, 'fwcombox').fwcombox = span;
  761. $.data(target, 'fwcombox').fwpanel = fwpanel;
  762. }
  763. /**
  764. * 联动下拉框 过滤子下拉框的下拉选项
  765. */
  766. function LDsetChildValue(target,value){
  767. var opts = $.data(target,'fwcombox').options;
  768. var child_obj;
  769. //直接找到此控件所在的TABLE 这样的目的是为了减少搜索范围
  770. var table = $(target).parent().parent().parent();
  771. $('.ldcombox',table).each(function(){
  772. if(this.name==opts.ldchild){
  773. child_obj = this;
  774. return false;
  775. }
  776. });
  777. if(child_obj != 'undefined'){
  778. //尚未初始化
  779. if($.data(child_obj, 'fwcombox')==null){return true;}
  780. var fwpanel = $.data(child_obj, 'fwcombox').fwpanel;
  781. var panelbody = $('.fwcombox-panel-body',fwpanel);
  782. var combo = $.data(child_obj,'fwcombox').fwcombox;
  783. var input = combo.find('input.fwcombox-text');
  784. panelbody.empty();
  785. input.val('');
  786. if(value==null||value==''){
  787. child_obj.value='';
  788. return true;
  789. }
  790. var child_data = $.data(child_obj,'fwcombox').data;
  791. var item = $('<div class="fwcombox-item"></div>').appendTo(panelbody);
  792. item.attr('value', '');
  793. item.html('');
  794. for(var i=0; i<child_data.length; i++){
  795. //需要将查询到的值初始化给原先的下拉框
  796. if(child_data[i]['parentvalue']==value){
  797. var item = $('<div class="fwcombox-item"></div>').appendTo(panelbody);
  798. item.attr('value', child_data[i][opts.valueField]);
  799. item.html(child_data[i][opts.textField]);
  800. }
  801. }
  802. $('.fwcombox-item', fwpanel).hover(
  803. function(){$(this).addClass('fwcombox-item-hover');},
  804. function(){$(this).removeClass('fwcombox-item-hover');}
  805. ).click(function(){
  806. var item = $(this);
  807. select(child_obj,item.attr('value'));
  808. });
  809. }//!= undefined
  810. }
  811. var methods = {
  812. /**设置或者获取控件是否只读。
  813. * 参数flag可不传,不传表示获取控件的只读属性。
  814. * @param flag 只读标志,true为设置只读,false为取消只读。
  815. * @return 获取只读属性时为true和false,true表示控件只读,false表示控件;
  816. * 设置控件只读属性时返回jquery,当前jquery集合。
  817. */
  818. disabled : function(flag){
  819. if(arguments.length==0){
  820. //如果没有入参,那么属于要返回当前是否只读的状态
  821. if(this.length==0){return null;}
  822. var opts = $.data(this[0], 'fwcombox').options;
  823. return opts.disabled;
  824. }else{
  825. //有入参处理设置是否只读的情况
  826. return this.each(function(){
  827. if(flag){
  828. //设置为只读
  829. var opts = $.data(this, 'fwcombox').options;
  830. var combo = $.data(this, 'fwcombox').fwcombox;
  831. var arrow = combo.find('.fwcombox-arrow');
  832. var input = combo.find('.fwcombox-text');
  833. arrow.unbind('.fwcombox');
  834. input.unbind('.fwcombox');
  835. opts.disabled = true;
  836. $(this).removeAttr('disabled');
  837. disablePrimitiveInput(input[0]);
  838. }else{
  839. //设置为非只读
  840. var opts = $.data(this, 'fwcombox').options;
  841. if(opts.disabled){
  842. var span = jQuery.data(this, 'fwcombox').fwcombox;
  843. var input = jQuery('.fwcombox-text',span);
  844. enablePrimitiveInput(input[0]);
  845. opts.disabled = false;
  846. opts.bindEvents(this);
  847. }
  848. }
  849. });
  850. }
  851. },
  852. /**
  853. * 返回控件是否可见。
  854. * 返回值:true表示可见,false表示不可见。
  855. */
  856. visible : function(){
  857. if(this.length==0){return null;}
  858. var span = $.data(this[0],'fwcombox').fwcombox;
  859. return span.is(":visible");
  860. },
  861. /**
  862. * 获取静态字典的中文名称
  863. */
  864. text :function(){
  865. return this.map(function(){
  866. return $.trim($.data(this, 'fwcombox').fwcombox.find('input.fwcombox-text').val());
  867. }).get(0);
  868. },
  869. /**
  870. * 持久过滤控件中的字典项。
  871. * @param values 要过滤的值,可以是数组。可空,空表示取消过滤
  872. * @param revert 反向过滤,boolean类型,为true时保留values指定的值,过滤没指定的值。可空
  873. * @return jQuery jquery原集合
  874. */
  875. filter:function(values,revert){
  876. var vals = [].concat(values);
  877. return this.each(function(){
  878. var opts = $.data(this, 'fwcombox').options;
  879. if(!opts.dataLoad){
  880. loadData(this, transformData(this));
  881. opts.dataLoad = true;
  882. }
  883. if(opts.dataLoad){
  884. //先处理模型
  885. var tvalsDiv = [].concat(vals);
  886. var data = $.data(this, 'fwcombox').data;
  887. for(var i=0; i<data.length; i++){
  888. var pos = $.inArray(data[i][opts.valueField],vals);
  889. //根据是否在过滤选项中设置过滤标志
  890. data[i].disabled = (pos != -1);
  891. if(revert){data[i].disabled=!data[i].disabled;}
  892. //删除当前值
  893. if(pos!=-1){
  894. vals.splice(pos,1);
  895. }
  896. }
  897. //后处理UI,如果UI还没初始化,正好略过
  898. var fwpanel = $.data(this, 'fwcombox').fwpanel;
  899. var panelbody = $('div.fwcombox-panel-body',fwpanel);
  900. panelbody.children().each(function(){
  901. var pos = $.inArray(this.value,tvalsDiv);
  902. //根据是否在过滤选项中设置过滤标志
  903. this.disabled = (pos != -1);
  904. if(revert){this.disabled=!this.disabled;}
  905. //删除当前值
  906. if(pos!=-1){
  907. tvalsDiv.splice(pos,1);
  908. }
  909. if(this.disabled){
  910. $(this).hide();
  911. }else{
  912. $(this).show();
  913. }
  914. });
  915. }else{
  916. //还没初始化就直接处理select
  917. for(var index=0;index<this.length;index++){
  918. var pos = $.inArray(this.options[index].value,vals);
  919. //根据是否在过滤选项中设置过滤标志
  920. this.options[index].disabled = (pos != -1);
  921. if(revert){this.options[index].disabled=!this.options[index].disabled;}
  922. //删除当前值
  923. if(pos!=-1){
  924. vals.splice(pos,1);
  925. }
  926. }
  927. }
  928. });
  929. },
  930. /**
  931. * 静态字典的构造函数
  932. */
  933. init :function(options){
  934. return this.each(function(){
  935. options = options || {};
  936. var state = $.data(this, 'fwcombox');
  937. if (state){
  938. $.extend(state.options, options, {
  939. 'displayCol' : this.displayCol,
  940. 'fwpanelWidth' : this.fwpanelWidth,
  941. 'fwpanelHeight' : this.fwpanelHeight
  942. });
  943. } else {
  944. state = $.data(this, 'fwcombox', {
  945. options : $.extend({
  946. }, $.fn.fwcombox.defaults, options,{
  947. 'displayCol' : this.displayCol,
  948. 'fwpanelWidth' : this.fwpanelWidth,
  949. 'fwpanelHeight' : this.fwpanelHeight
  950. }),
  951. fwcombox:null,
  952. fwpanel:null
  953. });
  954. create(this);
  955. if(this.className=='dbcombox'){
  956. state.options.remotedb = true;
  957. state.options.url = this.url;
  958. state.options.dname = this.dname;
  959. }
  960. //不能一开始就初始化,影响性能
  961. //if(!state.options.remotedb){
  962. // loadData(this, transformData(this));
  963. //}
  964. }
  965. //不能一开始就初始化,影响性能
  966. //if (state.options.data){
  967. // loadData(this, state.options.data);
  968. //}
  969. setValue(this, this.value,true,true);
  970. });
  971. }
  972. };
  973. $.fn.fwcombox = function(options){
  974. if (methods[options]) {
  975. return methods[options].apply(this, Array.prototype.slice.call(
  976. arguments, 1));
  977. } else if (typeof options === 'object' || !options) {
  978. return methods.init.apply(this, arguments);
  979. } else {
  980. $.error('Method ' + options + ' does not exist on fwcombox');
  981. }
  982. };
  983. $.fn.fwcombox.defaults = {
  984. valueField: 'value',
  985. textField: 'text',
  986. dataLoad:false,
  987. url: null,
  988. dname:null,
  989. data: null,
  990. total:null,
  991. width: 'auto',
  992. fwpanelWidth: null,
  993. fwpanelHeight: 200,
  994. separator: ',',
  995. editable: true,
  996. disabled: false,
  997. ldcombox:false,//是否属于联动下拉框
  998. ldparent:null, //联动下拉框父的名字
  999. ldchild:null,//联动下拉框子的名字
  1000. sqlid:null,//数据库查询对应的配置ID
  1001. param:null,
  1002. search:false,
  1003. remotedb:false,//远程查询时为true
  1004. selectPrev: function(){},
  1005. selectNext: function(){},
  1006. selectCurr: function(){},
  1007. filter: function(query){},
  1008. selectPrev: function(){selectPrev(this);},
  1009. selectNext: function(){selectNext(this);},
  1010. selectCurr: function(){selectCurr(this);},
  1011. filter: function(query){filter(this, query);},
  1012. setSize:function(target){
  1013. setSize(target);
  1014. },
  1015. setValue:function(target,val){
  1016. var opts = $.data(target, 'fwcombox').options;
  1017. if(val==''&&!opts.dataLoad){
  1018. loadData(target, transformData(target));
  1019. }else{
  1020. setValue(target,val,true,true);
  1021. }
  1022. },
  1023. removeItem:function(target,val){
  1024. removeItem(target,val);
  1025. },
  1026. bindEvents:function(target){
  1027. bindEvents(target);
  1028. },
  1029. onLoadSuccess: function(){},
  1030. onLoadError: function(){},
  1031. onSelect: function(record){},
  1032. onUnselect: function(record){},
  1033. onChange: function(newValue, oldValue){}
  1034. };
  1035. })(jQuery);