fwcombox.js 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491
  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. var opts = $.data(target, 'fwcombox').options;
  7. if (item.length){
  8. //找到匹配的项
  9. var prev = item.prevAll(':visible');
  10. if (prev.length){
  11. //如果有上方还有选项
  12. item = prev.eq(0);
  13. }else{
  14. //如果已经是第一项,那么光标定位到最后一项
  15. item = panelbody.find('div.fwcombox-item:visible:last');
  16. }
  17. }
  18. //没有任何项就直接退出
  19. if(item.length==0)return;
  20. if (item.position().top <= 0){
  21. var h = panelbody.scrollTop() + item.position().top;
  22. panelbody.scrollTop(h);
  23. } else if (item.position().top + item.outerHeight() > panelbody.height()){
  24. var h = panelbody.scrollTop() + item.position().top + item.outerHeight() - panelbody.height();
  25. panelbody.scrollTop(h);
  26. }
  27. var value = item.attr('value');
  28. if(!opts.multiple){
  29. setValue(target, value);
  30. }
  31. }
  32. /**
  33. * select next item
  34. */
  35. function selectNext(target){
  36. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  37. var panelbody = $('.fwcombox-panel-body',fwpanel);
  38. var item = fwpanel.find('div.fwcombox-item-selected');
  39. var opts = $.data(target, 'fwcombox').options;
  40. if (item.length){
  41. //找到匹配的项
  42. var next = item.nextAll(':visible');
  43. if (next.length){
  44. //如果有下方还有选项
  45. item = next.eq(0);
  46. }else{
  47. //如果已经是第一项,那么光标定位到最后一项
  48. item = panelbody.find('div.fwcombox-item:visible:first');
  49. }
  50. }
  51. //没有任何项就直接退出
  52. if(item.length==0)return;
  53. if (item.position().top <= 0){
  54. var h = fwpanel.scrollTop() + item.position().top;
  55. panelbody.scrollTop(h);
  56. } else if (item.position().top + item.outerHeight() > panelbody.height()){
  57. var h = panelbody.scrollTop() + item.position().top + item.outerHeight() - panelbody.height();
  58. panelbody.scrollTop(h);
  59. }
  60. var value = item.attr('value');
  61. if(!opts.multiple){
  62. setValue(target, value);
  63. }
  64. }
  65. function selectCurr(target){
  66. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  67. var item = fwpanel.find('div.fwcombox-item-selected');
  68. var opts = $.data(target, 'fwcombox').options;
  69. var value = item.attr('value');
  70. if(!opts.multiple){
  71. setValue(target, value, true);
  72. hidePanel(target);
  73. }
  74. }
  75. /**
  76. * select the specified value
  77. */
  78. function select(target, value){
  79. var opts = $.data(target, 'fwcombox').options;
  80. var data = $.data(target, 'fwcombox').data;
  81. if(opts.multiple){
  82. if(value==''){
  83. return;
  84. }
  85. var values = getValues(target);
  86. for(var i=0; i<values.length; i++){
  87. if (values[i] == value) return;
  88. }
  89. values.push(value);
  90. setValues(target,values,true);
  91. }else{
  92. setValue(target, value,true);
  93. hidePanel(target);
  94. }
  95. /*
  96. var combo = $.data(target, 'fwcombox').fwcombox;
  97. var input = combo.find('.fwcombox-text');
  98. for(var i=0; i<data.length; i++){
  99. if (data[i][opts.valueField] == value){
  100. //opts.onSelect.call(target, data[i]);
  101. return;
  102. }
  103. }*/
  104. }
  105. /**
  106. * unselect the specified value
  107. */
  108. function unselect(target, value){
  109. var opts = $.data(target, 'fwcombox').options;
  110. var data = $.data(target, 'fwcombox').data;
  111. if(opts.multiple){
  112. var values =getValues(target);
  113. for(var i=0; i<values.length; i++){
  114. if (values[i] == value){
  115. values.splice(i, 1);
  116. setValues(target, values,true);
  117. break;
  118. }
  119. }
  120. }else{
  121. setValue(target, '',true);
  122. }
  123. for(var i=0; i<data.length; i++){
  124. if (data[i][opts.valueField] == value){
  125. opts.onUnselect.call(target, data[i]);
  126. return;
  127. }
  128. }
  129. }
  130. /**
  131. * 获取浏览器信息
  132. */
  133. function getBrowserInfo(){
  134. var NV = {};
  135. var UA = navigator.userAgent.toLowerCase();
  136. try
  137. {
  138. NV.name=UA.match(/msie ([\d.]+)/)[1]?'ie':
  139. (UA.indexOf("firefox")>0)?'firefox':
  140. (UA.indexOf("chrome")>0)?'chrome':
  141. window.opera?'opera':
  142. window.openDatabase?'safari':
  143. 'unkonw';
  144. }catch(e){};
  145. try
  146. {
  147. NV.version=(NV.name=='ie')?UA.match(/msie ([\d.]+)/)[1]:
  148. (NV.name=='firefox')?UA.match(/firefox\/([\d.]+)/)[1]:
  149. (NV.name=='chrome')?UA.match(/chrome\/([\d.]+)/)[1]:
  150. (NV.name=='opera')?UA.match(/opera.([\d.]+)/)[1]:
  151. (NV.name=='safari')?UA.match(/version\/([\d.]+)/)[1]:
  152. '0';
  153. }catch(e){};
  154. return NV;
  155. }
  156. /**
  157. * set values
  158. */
  159. function setValue(target,value,confirm,isInit){
  160. var opts = $.data(target, 'fwcombox').options;
  161. var data = $.data(target, 'fwcombox').data;
  162. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  163. var panelbody = $('.fwcombox-panel-body',fwpanel);
  164. var s='';
  165. var b=false;
  166. var selectedRecord = {};
  167. value = value || "";
  168. if(data!=null){
  169. for(var j=0; j<data.length; j++){
  170. if (data[j][opts.valueField] == value){
  171. s = data[j][opts.textField];
  172. selectedRecord = data[j];
  173. b = true;
  174. break;
  175. }
  176. }
  177. } else if(!opts.dataLoad && !CFW.oValid.fnIsNull(value)) {
  178. loadData(target, transformData(target));
  179. opts.dataLoad = true;
  180. }
  181. //若是data 还未初始化则从IE默认的下拉框内取
  182. if(!b){
  183. $('>option', target).each(function(){
  184. var v = $(this).attr('value');
  185. if(v == value){
  186. s = $(this).text();
  187. selectedRecord[opts.textField] = s;
  188. selectedRecord[opts.valueField] = value;
  189. return false;
  190. }
  191. });
  192. }
  193. panelbody.find('div.fwcombox-item-selected').removeClass('fwcombox-item-selected');
  194. panelbody.find('div.fwcombox-item[value="' + value + '"]').addClass('fwcombox-item-selected');
  195. //按displayCol的配置显示具体的值 目前有AAA102(只显示代码),AAA103(只显示中文),BOTH(都显示)三种
  196. var dictType =$(target).attr('dictType');
  197. var displayCol =$(target).attr('displayCol');
  198. if(confirm){
  199. if(dictType == "default"){
  200. // displayCol 目前有AAA102(只显示代码),AAA103(只显示中文),BOTH(都显示)三种
  201. if ('AAA102' == displayCol) {
  202. setText(target, value);
  203. } else if ('AAA103' == displayCol) {
  204. setText(target, s);
  205. } else {
  206. var text=s.substr(s.indexOf("-")+1,s.length);
  207. setText(target, text);
  208. }
  209. }else if(dictType == "s"){
  210. setText(target, s);
  211. }
  212. setComValue(target,value,isInit);
  213. if(!isInit)
  214. opts.onSelect.call(target, selectedRecord);
  215. }
  216. }
  217. /**
  218. * set values
  219. */
  220. function setValues(target,values,confirm,isInit){
  221. var opts = $.data(target, 'fwcombox').options;
  222. var data = $.data(target, 'fwcombox').data;
  223. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  224. var panelbody = $('.fwcombox-panel-body',fwpanel);
  225. var selectedRecords = [];
  226. var vv = [], ss = [];
  227. values = values || [];
  228. panelbody.find('div.fwcombox-item-selected').removeClass('fwcombox-item-selected');
  229. for(var i=0; i<values.length; i++){
  230. var value=values[i];
  231. var s='';
  232. var b=false;
  233. var selectedRecord = {};
  234. if(data!=null){
  235. for(var j=0; j<data.length; j++){
  236. if (data[j][opts.valueField] == value){
  237. s = data[j][opts.textField];
  238. selectedRecord = data[j];
  239. b = true;
  240. break;
  241. }
  242. }
  243. } else if(!opts.dataLoad && !CFW.oValid.fnIsNull(value)) {
  244. loadData(target, transformData(target),values);
  245. opts.dataLoad = true;
  246. }
  247. //若是data 还未初始化则从IE默认的下拉框内取
  248. if(!b){
  249. $('>option', target).each(function(){
  250. var v = $(this).attr('value');
  251. if(v == value){
  252. s = $(this).text();
  253. selectedRecord[opts.textField] = s;
  254. selectedRecord[opts.valueField] = value;
  255. return false;
  256. }
  257. });
  258. }
  259. if(value==''&&values.length>1){
  260. }else{
  261. vv.push(value);
  262. ss.push(s);
  263. selectedRecords.push(selectedRecord);
  264. panelbody.find('div.fwcombox-item[value="' + value + '"]').addClass('fwcombox-item-selected');
  265. }
  266. }
  267. //按displayCol的配置显示具体的值 目前有AAA102(只显示代码),AAA103(只显示中文),BOTH(都显示)三种
  268. if(confirm){
  269. if ('AAA102' == opts.displayCol) {
  270. setText(target, vv.join(opts.separator));
  271. } else if ('AAA103' == opts.displayCol) {
  272. setText(target, vv.join(opts.separator));
  273. } else {
  274. var textFields=[];
  275. for(var i=0; i<ss.length; i++){
  276. var s=ss[i];
  277. var v=vv[i];
  278. textFields.push(s.substr(v.length + 1));
  279. }
  280. setText(target, textFields.join(opts.separator));
  281. }
  282. setComValues(target,values,isInit);
  283. if(!isInit)
  284. opts.onSelect.call(target, selectedRecords);
  285. }
  286. }
  287. function setComValue(target, value,isInit){
  288. var opts = $.data(target, 'fwcombox').options;
  289. var oldValue = getValue(target);
  290. var combo = $.data(target, 'fwcombox').fwcombox;
  291. target.value = value+"";
  292. if(!isInit && oldValue!=target.value){
  293. $(target).trigger('change');
  294. }
  295. opts.onChange.call(target, value, oldValue);
  296. }
  297. function setComValues(target, values,isInit){
  298. var opts = $.data(target, 'fwcombox').options;
  299. var oldValues = getValues(target);
  300. var combo = $.data(target, 'fwcombox').fwcombox;
  301. combo.find('input.fwcombo-value').remove();
  302. //var name = $(target).attr('comboName');
  303. for(var i=0; i<values.length; i++){
  304. if(values[i]==''&&values.length>1){
  305. }else{
  306. var input = $('<input type="hidden" class="fwcombo-value">').appendTo(combo);
  307. //if (name) input.attr('name', name);
  308. input.val(values[i]);
  309. }
  310. }
  311. var tmp = [];
  312. for(var i=0; i<oldValues.length; i++){
  313. tmp[i] = oldValues[i];
  314. }
  315. var aa = [];
  316. for(var i=0; i<values.length; i++){
  317. for(var j=0; j<tmp.length; j++){
  318. if (values[i] == tmp[j]){
  319. aa.push(values[i]);
  320. tmp.splice(j, 1);
  321. break;
  322. }
  323. }
  324. }
  325. if (!isInit &&(aa.length != values.length || values.length != oldValues.length)){
  326. if (opts.multiple){
  327. $(target).trigger('change');
  328. opts.onChange.call(target, values, oldValues);
  329. } else {
  330. opts.onChange.call(target, values[0], oldValues[0]);
  331. }
  332. }
  333. }
  334. function getValues(target){
  335. var values = [];
  336. var combo = $.data(target, 'fwcombox').fwcombox;
  337. combo.find('input.fwcombo-value').each(function(){
  338. values.push($(this).val());
  339. });
  340. return values;
  341. }
  342. function transformData(target){
  343. var opts = $.data(target, 'fwcombox').options;
  344. var data = [];
  345. var dname = $(target).attr('dname');
  346. var whereCls = $(target).attr('whereCls');
  347. var dictType =$(target).attr('dictType');
  348. var displayCol =$(target).attr('displayCol');
  349. var dictArray = null;
  350. if (!CFW.oValid.fnIsNull(dname) && (dictType == "default" || dictType == "s")){
  351. try {
  352. if (FW.getDictMode() == FW.DICTMODES.LOCAL ) {
  353. var localDictObj = FWGetDictApplet();
  354. if(_ENCRYPT_WHERE){
  355. if(whereCls!=null&&whereCls!='null'&&whereCls!=''&&whereCls!='undefined'){
  356. whereCls=stringToHex(encrypt(WHEREKEY,whereCls));
  357. }
  358. }
  359. var dictStr = localDictObj.getDict(dname,whereCls,opts.dsId);
  360. dictArray = JSON.parse(dictStr);
  361. }else if(FW.getDictMode() == FW.DICTMODES.LOCALSTORAGE ){
  362. dictArray = FW.getDictByLocalStorage(dname,whereCls);
  363. }else{
  364. dictArray = FW.getDict(dname,whereCls);
  365. }
  366. } catch(e) {
  367. }
  368. if (!CFW.oValid.fnIsNull(dictArray)) {
  369. for(var i=0;i<dictArray.length;i++) {
  370. var item = {};
  371. item[opts.valueField] = dictArray[i][0];
  372. if(dictType == "default"){
  373. // displayCol 目前有AAA102(只显示代码),AAA103(只显示中文),BOTH(都显示)三种
  374. if ('AAA102' == displayCol) {
  375. item[opts.textField] = dictArray[i][0];
  376. } else if ('AAA103' == displayCol) {
  377. item[opts.textField] = dictArray[i][2];
  378. } else {
  379. item[opts.textField] = dictArray[i][0]+"-"+dictArray[i][2];
  380. }
  381. }else if(dictType == "s"){
  382. item[opts.textField] = dictArray[i][2];
  383. }
  384. data.push(item);
  385. }
  386. var item = {};
  387. item[opts.valueField] = '';
  388. item[opts.textField]= "";
  389. item['selected'] = 'selected';
  390. data.push(item);
  391. }
  392. } else {
  393. $('>option', target).each(function(){
  394. var item = {};
  395. item[opts.valueField] = $(this).attr('value');
  396. //为联动下拉框
  397. //生成下拉框是现实的文本格式为 荔湾区|401 401表示父的值
  398. if(opts.ldcombox&&comtype=="child"){
  399. comtext = $(this).html();
  400. var sp = comtext.split('|');
  401. item[opts.textField] = sp[0];
  402. item['parentvalue'] = sp[1];
  403. }else{
  404. item[opts.textField] = $(this).text();
  405. }
  406. item['selected'] = $(this).attr('selected');
  407. item['disabled'] = this.disabled;/*标志是否被过滤的对象*/
  408. data.push(item);
  409. });
  410. }
  411. return data;
  412. }
  413. /**
  414. * load data, the old list items will be removed.
  415. */
  416. function removeItem(target,value){
  417. var opts = $.data(target, 'fwcombox').options;
  418. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  419. var panelbody = $('.fwcombox-panel-body',fwpanel);
  420. //若还没有初始化列表,先初始化
  421. if(!opts.dataLoad){
  422. if(!opts.remotedb){
  423. loadData(target, transformData(target));
  424. }
  425. if (opts.data){
  426. loadData(target, opts.data);
  427. }
  428. opts.dataLoad = true;
  429. }
  430. var data = $.data(target, 'fwcombox').data;
  431. for(var i=0; i<data.length; i++){
  432. if(data[i][opts.valueField] == value){
  433. data.splice(i,1);
  434. var item = panelbody.find('div.fwcombox-item[value="' + value + '"]');
  435. item.remove();
  436. break;
  437. }
  438. }
  439. $.data(target, 'fwcombox').data = data;
  440. }
  441. function initOptions(target,data) {
  442. //target.options.length=0;
  443. for(var i=0; i<data.length; i++){
  444. no = new Option();
  445. no.value = data[i][opts.valueField];
  446. no.text = data[i][opts.textField];
  447. target.options[i] = no;
  448. //target.options[target.options.length] = no;
  449. }
  450. }
  451. /**
  452. * load data, the old list items will be removed.
  453. */
  454. function loadData(target, data,values){
  455. var opts = $.data(target, 'fwcombox').options;
  456. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  457. var panelbody = $('.fwcombox-panel-body',fwpanel);
  458. var selected = [];
  459. $.data(target, 'fwcombox').data = data;
  460. panelbody.empty(); // clear old data
  461. var isRefresh = opts.remotedb || FW.getDictMode() == FW.DICTMODES.LOCAL;
  462. //实现远程数据库的录入查询
  463. //清空原来的值
  464. if(isRefresh){target.options.length=0;}
  465. var cnt=target.options.length;
  466. var itemHtml='';
  467. for(var i=0; i<data.length; i++){
  468. //var item = $('<div class="fwcombox-item"></div>').appendTo(panelbody);
  469. //item.attr({'value': data[i][opts.valueField],'disabled':data[i].disabled});
  470. //if(data[i].disabled){
  471. //item.hide();
  472. //}
  473. //item.html(data[i][opts.textField]);
  474. if(data[i][opts.valueField]==''){
  475. itemHtml+='<div class="fwcombox-item" value="'+data[i][opts.valueField]+'" >'+'&nbsp'+'</div>';
  476. }else{
  477. itemHtml+='<div class="fwcombox-item" value="'+data[i][opts.valueField]+'" >'+data[i][opts.textField]+'</div>';
  478. }
  479. if (data[i]['selected']){
  480. if(values==null){//初始化如果有选中值
  481. selected.push(data[i][opts.valueField]);
  482. }
  483. }
  484. //需要将查询到的值初始化给原先的下拉框
  485. //if(isRefresh){
  486. no = new Option();
  487. no.value = data[i][opts.valueField];
  488. no.text = data[i][opts.textField];
  489. //不要用target.options.length当作变量,重复遍历影响性能
  490. //target.options[target.options.length] = no;
  491. target.options[cnt] = no;
  492. cnt++;
  493. //}
  494. isRefresh=true;
  495. }
  496. panelbody.html(itemHtml);
  497. if(isRefresh){
  498. target.value='';
  499. }
  500. if(!opts.remotedb){
  501. if (opts.multiple){
  502. if(values!=null){//初始化如果有值
  503. }else{
  504. setValues(target, selected,false,true);
  505. }
  506. } else {
  507. if (selected.length){
  508. setValue(target,selected[0],false,true);
  509. } else {
  510. setValue(target,'',false,true);
  511. }
  512. }
  513. }
  514. opts.onLoadSuccess.call(target, data);
  515. $('.fwcombox-item', fwpanel).hover(
  516. function(){$(this).addClass('fwcombox-item-hover');},
  517. function(){$(this).removeClass('fwcombox-item-hover');}
  518. ).click(function(){
  519. var item = $(this);
  520. if (opts.multiple){
  521. if (item.hasClass('fwcombox-item-selected')){
  522. unselect(target, item.attr('value'));
  523. } else {
  524. select(target, item.attr('value'));
  525. }
  526. } else {
  527. select(target, item.attr('value'));
  528. }
  529. });
  530. }
  531. /**
  532. * request remote data if the url property is setted.
  533. */
  534. function request(target, query){
  535. var opts = $.data(target, 'fwcombox').options;
  536. if (!opts.url) return;
  537. var param = $.extend({}, {"configid":opts.dname,"query":query});
  538. $.ajax({
  539. url:opts.url,
  540. data: param,
  541. dataType:'json',
  542. cache:false,
  543. success:function(data){
  544. if(data!=null && data[headtoken]!=null){
  545. token=data[headtoken];//更新全局变量token标志
  546. }
  547. if("1"!=data.FHZ){//出错了,弹出错误提醒
  548. if("CSRF" == data.FHZ){
  549. showMsg(data.MSG||'',3);
  550. return;
  551. }
  552. }
  553. var da=getData(target,data);
  554. loadData(target, da);
  555. },
  556. error:function(){
  557. opts.onLoadError.apply(this, arguments);
  558. },
  559. beforeSend:function(XMLHttpRequest ){
  560. var cToken = $.cookie(headtoken) || token;XMLHttpRequest.setRequestHeader(headtoken,cToken);
  561. }
  562. });
  563. }
  564. function getData(target,data){
  565. var opts = $.data(target, 'fwcombox').options;
  566. var rows = data.rows;
  567. var total = data.total;
  568. var iC=0;
  569. var data = [];
  570. if(rows&&rows.length>0){
  571. iC = total - rows.length;
  572. }else{
  573. return data;
  574. }
  575. for(var i=0; i<rows.length; i++) {
  576. var item = {};
  577. item[opts.valueField] = rows[i][0];
  578. item[opts.textField] = rows[i][1];
  579. data.push(item);
  580. }
  581. if(iC>0){
  582. var item = {};
  583. item[opts.valueField] = " ";
  584. item[opts.textField] = "剩余 "+iC+" 记录未显示";
  585. data.push(item);
  586. }
  587. return data;
  588. };
  589. function filter(target, query){
  590. var data = $.data(target, 'fwcombox').data;
  591. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  592. var panelbody = $('.fwcombox-panel-body',fwpanel);
  593. var opts = $.data(target, 'fwcombox').options;
  594. var bEnter = false;
  595. opts.search = false;
  596. //去掉之前的选中状态
  597. panelbody.find('div.fwcombox-item-selected').removeClass('fwcombox-item-selected');
  598. showPanel(target);
  599. if(!opts.remotedb){
  600. if(opts.multiple){
  601. var qq = opts.multiple ? query.split(opts.separator) : [query];
  602. var vv = [];
  603. var hasSelect = false;//集合中是否有符合要求的记录
  604. panelbody.find('div.fwcombox-item').each(function(){
  605. var item = $(this);
  606. var itemText = item.text();
  607. var v=item.attr('value')+'';
  608. for(var i=0;i<qq.length;i++){
  609. var q=qq[i];
  610. if(q==''){
  611. continue;
  612. }
  613. if ((!this.disabled)&&itemText.indexOf(q) != -1){
  614. item.show();
  615. var itemText1=itemText.substr(v.length + 1);
  616. if (itemText1 == q){
  617. vv.push(v);
  618. hasSelect = true;
  619. }
  620. bEnter =true;
  621. }else {
  622. item.show();
  623. bEnter =true;
  624. }
  625. }
  626. }).filter(':visible');
  627. setValues(target,vv,true);
  628. }else{
  629. target.value='';
  630. var hasSelect = false;//集合中是否有符合要求的记录
  631. var showItems = panelbody.find('div.fwcombox-item').each(function(){
  632. var item = $(this);
  633. var itemText = item.text();
  634. if ((!this.disabled)&&itemText.indexOf(query) != -1){
  635. item.show();
  636. if (itemText == query){
  637. setValue(target, item.attr('value'));
  638. hasSelect = true;
  639. }
  640. bEnter =true;
  641. }else if((!this.disabled)&&CFW.oValid._fnIsPinyinMatch(itemText,query)){
  642. item.show();
  643. bEnter =true;
  644. } else {
  645. item.hide();
  646. }
  647. }).filter(':visible');
  648. //如果没有完全匹配的,那么默认选中第一个
  649. if(showItems.length > 0 && !hasSelect){
  650. if(query!=''){//无任何输入选中空值
  651. //showItems.first().addClass('fwcombox-item-selected');
  652. setValue(target, showItems.first().attr('value'));
  653. }else{
  654. setValue(target, '');
  655. }
  656. }else if (showItems.length==0){
  657. setValue(target, '');
  658. }
  659. }
  660. }
  661. if(opts.remotedb){
  662. request(target,query);
  663. }
  664. }
  665. //设置不可编辑属性
  666. function setDisabled(target, disabled){
  667. var opts = $.data(target, 'fwcombox').options;
  668. var combo = $.data(target, 'fwcombox').fwcombox;
  669. if (disabled){
  670. opts.disabled = true;
  671. //$(target).attr('disabled', true);
  672. $(target).removeAttr('disabled');
  673. var input = combo.find('.fwcombox-text');
  674. if(input.length>0){
  675. CFW.oGt._disablePrimitiveInput(input[0]);
  676. }
  677. } else {
  678. opts.disabled = false;
  679. $(target).removeAttr('disabled');
  680. combo.find('.fwcombox-text').removeAttr('disabled')
  681. .click(function(){
  682. this.select();
  683. });
  684. }
  685. }
  686. function setSize(target,targetWidth){
  687. var opts = $.data(target, 'fwcombox').options;
  688. var combo = $.data(target, 'fwcombox').fwcombox;
  689. var panel = $.data(target, 'fwcombox').fwpanel;
  690. //combo.width(opts.width);
  691. var objWidth;
  692. if(targetWidth==null){
  693. if($.browser.msie){
  694. if(document.documentMode==null||document.documentMode=='5'){
  695. objWidth=$(target).outerWidth();
  696. }else{
  697. objWidth=$(target).parent().width()-2;
  698. }
  699. }else{
  700. objWidth=$(target).parent().width()-2;
  701. }
  702. }else{
  703. objWidth=targetWidth;
  704. }
  705. var arrowWidth = 18;
  706. var textwidth = objWidth - arrowWidth-2;
  707. if($.browser.msie && opts.width=='auto'){
  708. if(document.documentMode!=null && (document.documentMode=='7'||document.documentMode=='8'||document.documentMode=='9')){
  709. combo.css({width:'100%',margin:'1px'});
  710. objWidth=combo.width();
  711. textwidth = objWidth - arrowWidth-2;
  712. combo.find('input.fwcombox-text').css({width:(textwidth/objWidth)*100+'%'});
  713. }else{
  714. combo.width(objWidth);
  715. combo.find('input.fwcombox-text').width(textwidth);
  716. }
  717. }else{
  718. combo.width(objWidth);
  719. combo.find('input.fwcombox-text').width(textwidth);
  720. }
  721. //var arrowWidth = combo.find('.fwcombox-arrow').outerWidth();
  722. //如果手动设置了宽度,那么用手动设置的
  723. panel.css({
  724. width:opts.fwpanelWidth=='auto'?objWidth:opts.fwpanelWidth
  725. }).find('.fwcombox-panel-body').css({
  726. height:opts.fwpanelHeight=='auto'?'200': opts.fwpanelHeight
  727. });
  728. }
  729. /**
  730. * hide the drop down panel.
  731. */
  732. function hidePanel(target){
  733. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  734. fwpanel.hide();
  735. }
  736. /**
  737. * show the drop down panel.
  738. */
  739. function showPanel(target){
  740. var combo = $.data(target, 'fwcombox').fwcombox;
  741. var panel = $.data(target, 'fwcombox').fwpanel;
  742. var opts = $.data(target, 'fwcombox').options;
  743. var items = panel.find('div');
  744. /* for(var i=1, len=items.length;i<len;i++){
  745. if(!items[i].disabled){
  746. items[i].style.display="block";
  747. }
  748. }
  749. */
  750. //第一次显示时创建下拉列表的数据
  751. //这样处理的目的是加快控制第一次初始化时的速度
  752. if(!opts.dataLoad){
  753. if(!opts.remotedb){
  754. loadData(target, transformData(target));
  755. } else {
  756. if (opts.data){
  757. loadData(target, opts.data);
  758. }
  759. }
  760. opts.dataLoad = true;
  761. }
  762. //重新计算panel的zindex
  763. var zindex = 0;
  764. $(combo).parents().each(function(){
  765. //判断是否为数字 不为数字跨浏览器会报错
  766. if(!isNaN($(this).css('z-index'))){
  767. zindex+=parseInt($(this).css('z-index'));
  768. }
  769. //alert($(this).css('z-index'));
  770. });
  771. $.data(target, 'fwcombox').fwpanel.css('z-index',zindex+1001);
  772. //每次调整只计算一次,免得重复计算
  773. panel.removeAttr('hasResize');
  774. panel.show();
  775. if (panel.is(':visible')){
  776. //下拉框放到DIV内并且初始化时DIV是不可见的,设置DIV可见时
  777. //下拉列表无法显示,需要修改宽度和高度
  778. if(panel.width()<5){
  779. setSize(target);
  780. }
  781. var top = combo.offset().top + combo.outerHeight();
  782. if (top + panel.outerHeight() > $(window).height() + $(document).scrollTop()){
  783. top = combo.offset().top - panel.outerHeight();
  784. }
  785. if (top < $(document).scrollTop()){
  786. top = combo.offset().top + combo.outerHeight();
  787. }
  788. panel.css({
  789. left:combo.offset().left,
  790. top:top
  791. });
  792. //设置左上角位置(考虑屏幕边界截屏的问题)
  793. if(combo.offset().left+panel.width()>$(window).width()){
  794. panel.css({
  795. left:$(window).width()-panel.width()-3,/*加3预防window出现水平滚动栏*/
  796. top:top
  797. });
  798. }else{
  799. panel.css({
  800. left:combo.offset().left,
  801. top:top
  802. });
  803. }
  804. //setTimeout(arguments.callee, 200);
  805. }
  806. }
  807. function setText(target, text){
  808. var combo = $.data(target, 'fwcombox').fwcombox;
  809. combo.find('input.fwcombox-text').val(text);
  810. }
  811. function getValue(target){
  812. var combo = $.data(target, 'fwcombox').fwcombox;
  813. return target.value;
  814. }
  815. function destroy(target){
  816. $.data(target, 'fwcombox').fwpanel.remove();
  817. $.data(target, 'fwcombox').fwcombox.remove();
  818. $(target).remove();
  819. }
  820. function bindEvents(target){
  821. var opts = $.data(target, 'fwcombox').options;
  822. var combo = $.data(target, 'fwcombox').fwcombox;
  823. var panel = $.data(target, 'fwcombox').fwpanel;
  824. var input = combo.find('.fwcombox-text');
  825. var arrow = combo.find('.fwcombox-arrow');
  826. //$(document).unbind('.fwcombox');
  827. combo.unbind('.fwcombox');
  828. panel.unbind('.fwcombox');
  829. input.unbind('.fwcombox');
  830. arrow.unbind('.fwcombox');
  831. $(target).addClass('fwresize').bind('fwresize',function(){
  832. var comopts = $.data(this, 'fwcombox').options;
  833. comopts.setSize(target);
  834. });
  835. if (!opts.disabled){
  836. /*
  837. $(document).bind('mousedown.fwcombox', function(e){
  838. hidePanel(target);
  839. });
  840. panel.bind('mousedown.fwcombox', function(e){
  841. return false;
  842. });
  843. */
  844. //zzy add 2010-10-08 begin 失去焦点时关闭下拉项
  845. input.bind('keydown',function(e){
  846. if(e.keyCode==13 ||e.keyCode==9){
  847. //hidePanel(target);
  848. if(opts.multiple){
  849. hidePanel(target);
  850. }else{
  851. opts.selectCurr.call(target);
  852. }
  853. }
  854. });
  855. //end
  856. //鼠标点击其他地方就隐藏列表
  857. $(document).bind({
  858. 'mousedown':function(e){
  859. if(e.target != input[0] &&e.target != arrow[0]
  860. &&e.target != panel[0] && panel.is(':visible')){
  861. if(opts.multiple){
  862. hidePanel(target);
  863. }else{
  864. opts.selectCurr.call(target);
  865. }
  866. }
  867. },
  868. 'focus':function(e){
  869. if(e.target != input[0] &&e.target != arrow[0]
  870. &&e.target != panel[0]&& panel.is(':visible')&&e.target!=target){
  871. if(opts.multiple){
  872. hidePanel(target);
  873. }else{
  874. opts.selectCurr.call(target);
  875. }
  876. }
  877. }
  878. });
  879. //鼠标移动到上面屏蔽掉
  880. panel.bind('mousedown', function(e){
  881. var element = e.target || e.srcElement;
  882. //存在滚动条的情况下单击滚动条有效
  883. if(e.offsetX>130){
  884. return false;
  885. }
  886. var iLen = 0;
  887. try{
  888. iLen = target.options.length;
  889. }catch(e){}
  890. //有可能存在滚动条
  891. if(iLen>8){
  892. return false;
  893. }
  894. if(-1 != (element.className).indexOf("fwcombox-item")){
  895. return false;//线程堵塞等待ONCLICK执行
  896. }
  897. return true;//直接返回
  898. });
  899. panel.bind('mouseenter', function(e){
  900. var ee = this;
  901. var e2 = e;
  902. if (this == e.currentTarget) {
  903. jQuery(target).data('_hide',true);
  904. //showErrMsg(jQuery(target).data('_hide'),2);
  905. }
  906. });
  907. panel.bind('mouseout', function(e){
  908. if (this != e.currentTarget) {
  909. jQuery(target).data('_hide',false);
  910. //showErrMsg(jQuery(target).data('_hide'),2);
  911. }
  912. });
  913. jQuery(target).bind('mousedown', function(e){
  914. return false;
  915. });
  916. //将hidden控件的onfocus事件专递到外部可见的input来
  917. $(target).focus(function(){
  918. input[0].select();
  919. });
  920. //回传外部的blur事件
  921. input.blur(function(e){
  922. $(target).blur();
  923. if(!jQuery(target).data('_hide')){
  924. hidePanel(target);
  925. }
  926. });
  927. input.unbind('focus.fwcombox').bind('focus.fwcombox', function(event){
  928. input[0].select();
  929. $.data(target, 'fwcombox').fwpanel.hide();
  930. showPanel(target);
  931. //如果参数输入值为空
  932. var queryText = $(this).val();
  933. if (opts.editable){
  934. if(!opts.remotedb&&queryText==''){
  935. opts.filter.call(target, queryText);
  936. }
  937. }
  938. })/*.bind('mousedown.fwcombox', function(e){
  939. e.stopPropagation();
  940. })*/.bind('keyup.fwcombox', function(e){
  941. switch(e.keyCode){
  942. case 37: // left
  943. case 38: // up
  944. opts.selectPrev.call(target);
  945. jQuery(target).data('_hide',false);
  946. //showErrMsg(jQuery(target).data('_hide'),2);
  947. break;
  948. case 39: // right
  949. case 40: // down
  950. opts.selectNext.call(target);
  951. jQuery(target).data('_hide',false);
  952. //showErrMsg(jQuery(target).data('_hide'),2);
  953. break;
  954. case 16: //shift
  955. break;
  956. case 9: //tab
  957. break;
  958. case 13: // enter zzy 2010-10-08 注销防止按回车键代替TAB进入时,下拉框消失
  959. //opts.selectCurr.call(target);
  960. break;
  961. case 27: // esc
  962. hidePanel(target);
  963. break;
  964. case 46://delete
  965. clearInput(target);
  966. break;
  967. default:
  968. if (opts.editable){
  969. var queryText = $(this).val();
  970. if(!opts.remotedb){
  971. opts.filter.call(target, queryText);
  972. }else{
  973. var input = $(this);
  974. if(!opts.search){ //为了避免频繁的查询过滤
  975. opts.search = true;
  976. setTimeout(function(){
  977. filter(target,queryText);
  978. },1000*0.3); //延迟两秒处理
  979. }
  980. }
  981. }
  982. }
  983. return false;
  984. });
  985. arrow.bind('click.fwcombox', function(){
  986. input[0].select(); //hr 20111010
  987. $.data(target, 'fwcombox').fwpanel.hide();
  988. //alert("click.fwcombox");
  989. showPanel(target);
  990. var queryText = $(this).val();
  991. if (opts.editable&&!opts.multiple){
  992. if(!opts.remotedb&&queryText==''){
  993. opts.filter.call(target, queryText);
  994. }
  995. }
  996. }).bind('mouseenter.fwcombox', function(){
  997. $(this).addClass('fwcombox-arrow-hover');
  998. }).bind('mouseleave.fwcombox', function(){
  999. $(this).removeClass('fwcombox-arrow-hover');
  1000. });
  1001. }
  1002. //如果target声明了onselect函数,那么绑定它
  1003. if(target.onselect && window[target.onselect]){
  1004. opts.onSelect = window[target.onselect];
  1005. }
  1006. }
  1007. //单击delete键去掉选中
  1008. function clearInput(target){
  1009. var combo = $.data(target, 'fwcombox').fwcombox;
  1010. var input = combo.find('.fwcombox-text');
  1011. var fwpanel = $.data(target, 'fwcombox').fwpanel;
  1012. var panelbody = $('.fwcombox-panel-body',fwpanel);
  1013. var opts = $.data(target, 'fwcombox').options;
  1014. if(opts.multiple){
  1015. setValues(target, [],true);
  1016. }else{
  1017. input.val('');
  1018. target.value='';
  1019. }
  1020. panelbody.find('div.fwcombox-item-selected').removeClass('fwcombox-item-selected');
  1021. panelbody.find('div.fwcombox-item[value=""]').addClass('fwcombox-item-selected');
  1022. input.focus();
  1023. }
  1024. //创建下拉框
  1025. function create(target,objWidth){
  1026. init(target,objWidth);
  1027. var opts = $.data(target, 'fwcombox').options;
  1028. var fwcombox = $.data(target, 'fwcombox').fwcombox;
  1029. opts.disabled = $(target).attr('disabled');
  1030. $(target).removeAttr('disabled');
  1031. $('input.fwcombox-text', fwcombox).attr('readonly', !opts.editable);
  1032. setDisabled(target, opts.disabled);
  1033. setSize(target,objWidth);
  1034. bindEvents(target);
  1035. }
  1036. /**
  1037. * 创建下拉框的输入框已经下拉DIV
  1038. */
  1039. function init(target,objWidth){
  1040. var obj=$(target);
  1041. var iWidth;
  1042. if(objWidth==null){
  1043. if($.browser.msie){
  1044. if(document.documentMode==null||document.documentMode=='5'){
  1045. iWidth=obj.outerWidth();
  1046. }else{
  1047. iWidth=obj.parent().width()-2;
  1048. }
  1049. }else{
  1050. iWidth=obj.parent().width()-2;
  1051. }
  1052. }else{
  1053. iWidth=objWidth;
  1054. }
  1055. //var iHeight = obj.outerHeight();
  1056. var iHeight = 20;
  1057. var iTop = obj.offset().top + iHeight;
  1058. var iLeft = obj.offset().left;
  1059. //$(target).hide();
  1060. var opts = $.data(target, 'fwcombox').options;
  1061. var vldStr = $(target).attr('vldStr');
  1062. //取原来下拉框的长度,因为IE自带的下拉框所获取的自动宽度比较正确
  1063. //if(opts.width=='auto'){
  1064. // opts.width= iWidth;//iWidth;
  1065. //}
  1066. /*var span = $('<span class="fwcombox"></span>').insertAfter(target);
  1067. var input = $('<input type="text" class="fwcombox-text">').appendTo(span);
  1068. $('<span class="fwcombox-arrow"></span>').appendTo(span);*/
  1069. var span = $(target).next(".fwcombox");
  1070. var fwpanel = $('<div class="fwcombox-panel"></div>').appendTo('body');
  1071. //if(vldStr){
  1072. // span.find('input.fwcombox-text').attr('vldStr', vldStr);
  1073. // }
  1074. fwpanel.css({
  1075. 'top':iTop,
  1076. 'left':iLeft,
  1077. 'width':iWidth,
  1078. 'display':'none'
  1079. });
  1080. var panelbody = $('<div class="fwcombox-panel-body"></div>').appendTo(fwpanel);
  1081. /* panelbody.css({
  1082. 'width':iWidth+10,
  1083. 'height':'200px'
  1084. });*/
  1085. //input.attr('autocomplete', 'off');
  1086. $.data(target, 'fwcombox').fwcombox = span;
  1087. $.data(target, 'fwcombox').fwpanel = fwpanel;
  1088. }
  1089. var methods = {
  1090. /**设置或者获取控件是否只读。
  1091. * 参数flag可不传,不传表示获取控件的只读属性。
  1092. * @param flag 只读标志,true为设置只读,false为取消只读。
  1093. * @return 获取只读属性时为true和false,true表示控件只读,false表示控件;
  1094. * 设置控件只读属性时返回jquery,当前jquery集合。
  1095. */
  1096. disabled : function(flag){
  1097. if(arguments.length==0){
  1098. //如果没有入参,那么属于要返回当前是否只读的状态
  1099. if(this.length==0){return null;}
  1100. var opts = $.data(this[0], 'fwcombox').options;
  1101. return opts.disabled;
  1102. }else{
  1103. //有入参处理设置是否只读的情况
  1104. return this.each(function(){
  1105. if(flag){
  1106. //设置为只读
  1107. var opts = $.data(this, 'fwcombox').options;
  1108. var combo = $.data(this, 'fwcombox').fwcombox;
  1109. var arrow = combo.find('.fwcombox-arrow');
  1110. var input = combo.find('.fwcombox-text');
  1111. arrow.unbind('.fwcombox');
  1112. input.unbind('.fwcombox');
  1113. opts.disabled = true;
  1114. $(this).removeAttr('disabled');
  1115. CFW.oGt._disablePrimitiveInput(input[0]);
  1116. }else{
  1117. //设置为非只读
  1118. var opts = $.data(this, 'fwcombox').options;
  1119. if(opts.disabled){
  1120. var span = jQuery.data(this, 'fwcombox').fwcombox;
  1121. var input = jQuery('.fwcombox-text',span);
  1122. CFW.oGt._enablePrimitiveInput(input[0]);
  1123. opts.disabled = false;
  1124. opts.bindEvents(this);
  1125. }
  1126. }
  1127. });
  1128. }
  1129. },
  1130. /**
  1131. * 返回控件是否可见。
  1132. * 返回值:true表示可见,false表示不可见。
  1133. */
  1134. visible : function(){
  1135. if(this.length==0){return null;}
  1136. var span = $.data(this[0],'fwcombox').fwcombox;
  1137. return span.is(":visible");
  1138. },
  1139. /**
  1140. * 获取静态字典的中文名称
  1141. */
  1142. getValues :function(target){
  1143. return getValues(target);
  1144. },
  1145. clearInputValue :function(target){
  1146. return clearInput(target);
  1147. },
  1148. /**
  1149. * 获取静态字典的中文名称
  1150. */
  1151. text :function(){
  1152. return this.map(function(){
  1153. return $.trim($.data(this, 'fwcombox').fwcombox.find('input.fwcombox-text').val());
  1154. }).get(0);
  1155. },
  1156. /**
  1157. * 持久过滤控件中的字典项。
  1158. * @param values 要过滤的值,可以是数组。可空,空表示取消过滤
  1159. * @param revert 反向过滤,boolean类型,为true时保留values指定的值,过滤没指定的值。可空
  1160. * @return jQuery jquery原集合
  1161. */
  1162. filter:function(values,revert){
  1163. var vals = [].concat(values);
  1164. return this.each(function(){
  1165. var opts = $.data(this, 'fwcombox').options;
  1166. if(!opts.dataLoad){
  1167. loadData(this, transformData(this));
  1168. opts.dataLoad = true;
  1169. }
  1170. if(opts.dataLoad){
  1171. //先处理模型
  1172. var tvalsDiv = [].concat(vals);
  1173. var data = $.data(this, 'fwcombox').data;
  1174. for(var i=0; i<data.length; i++){
  1175. var pos = $.inArray(data[i][opts.valueField],vals);
  1176. //根据是否在过滤选项中设置过滤标志
  1177. data[i].disabled = (pos != -1);
  1178. if(revert){data[i].disabled=!data[i].disabled;}
  1179. //删除当前值
  1180. if(pos!=-1){
  1181. vals.splice(pos,1);
  1182. }
  1183. }
  1184. //后处理UI,如果UI还没初始化,正好略过
  1185. var fwpanel = $.data(this, 'fwcombox').fwpanel;
  1186. var panelbody = $('div.fwcombox-panel-body',fwpanel);
  1187. panelbody.children().each(function(){
  1188. var value=$(this).attr("value");
  1189. var pos = $.inArray(value,tvalsDiv);
  1190. //根据是否在过滤选项中设置过滤标志
  1191. this.disabled = (pos != -1);
  1192. if(revert){this.disabled=!this.disabled;}
  1193. //删除当前值
  1194. if(pos!=-1){
  1195. tvalsDiv.splice(pos,1);
  1196. }
  1197. if(this.disabled){
  1198. $(this).hide();
  1199. }else{
  1200. $(this).show();
  1201. }
  1202. });
  1203. }else{
  1204. //还没初始化就直接处理select
  1205. for(var index=0;index<this.length;index++){
  1206. var pos = $.inArray(this.options[index].value,vals);
  1207. //根据是否在过滤选项中设置过滤标志
  1208. this.options[index].disabled = (pos != -1);
  1209. if(revert){this.options[index].disabled=!this.options[index].disabled;}
  1210. //删除当前值
  1211. if(pos!=-1){
  1212. vals.splice(pos,1);
  1213. }
  1214. }
  1215. }
  1216. });
  1217. },
  1218. /**
  1219. * 静态字典的构造函数
  1220. */
  1221. init :function(options){
  1222. return this.each(function(){
  1223. options = options || {};
  1224. var state = $.data(this, 'fwcombox');
  1225. if (state){
  1226. $.extend(state.options, options, {
  1227. 'displayCol' : $(this).attr('displayCol'),
  1228. 'fwpanelWidth' : $(this).attr('fwpanelWidth'),
  1229. 'fwpanelHeight' : $(this).attr('fwpanelHeight'),
  1230. 'dsId' : $(this).attr('dsId')
  1231. });
  1232. } else {
  1233. state = $.data(this, 'fwcombox', {
  1234. options : $.extend({
  1235. }, $.fn.fwcombox.defaults, options,{
  1236. 'displayCol' : $(this).attr('displayCol'),
  1237. 'fwpanelWidth' : $(this).attr('fwpanelWidth'),
  1238. 'fwpanelHeight' : $(this).attr('fwpanelHeight'),
  1239. 'dsId' : $(this).attr('dsId')
  1240. }),
  1241. fwcombox:null,
  1242. fwpanel:null
  1243. });
  1244. var objWidth;
  1245. if($.browser.msie){
  1246. if(document.documentMode==null||document.documentMode=='5'){
  1247. objWidth=$(this).outerWidth();
  1248. }else{
  1249. objWidth=$(this).parent().width()-2;
  1250. }
  1251. }else{
  1252. objWidth=$(this).parent().width();
  1253. }
  1254. create(this,objWidth);
  1255. if(this.className=='dbcombox'){
  1256. state.options.remotedb = true;
  1257. state.options.url = this.url;
  1258. state.options.dname = this.dname;
  1259. }
  1260. //不能一开始就初始化,影响性能
  1261. //if(!state.options.remotedb){
  1262. // loadData(this, transformData(this));
  1263. //}
  1264. }
  1265. //不能一开始就初始化,影响性能
  1266. //if (state.options.data){
  1267. // loadData(this, state.options.data);
  1268. //}
  1269. if(options.multiple){
  1270. var values= $(this).val();
  1271. setValues(this, values,true,true);
  1272. }else{
  1273. setValue(this, this.value,true,true);
  1274. }
  1275. });
  1276. }
  1277. };
  1278. $.fn.fwcombox = function(options){
  1279. if (methods[options]) {
  1280. return methods[options].apply(this, Array.prototype.slice.call(
  1281. arguments, 1));
  1282. } else if (typeof options === 'object' || !options) {
  1283. return methods.init.apply(this, arguments);
  1284. } else {
  1285. $.error('Method ' + options + ' does not exist on fwcombox');
  1286. }
  1287. };
  1288. $.fn.fwcombox.defaults = {
  1289. valueField: 'value',
  1290. textField: 'text',
  1291. dataLoad:false,
  1292. multiple:false,
  1293. url: null,
  1294. dname:null,
  1295. data: null,
  1296. total:null,
  1297. width: 'auto',
  1298. fwpanelWidth: null,
  1299. fwpanelHeight: 200,
  1300. separator: ',',
  1301. editable: true,
  1302. disabled: false,
  1303. ldcombox:false,//是否属于联动下拉框
  1304. ldparent:null, //联动下拉框父的名字
  1305. ldchild:null,//联动下拉框子的名字
  1306. sqlid:null,//数据库查询对应的配置ID
  1307. param:null,
  1308. search:false,
  1309. remotedb:false,//远程查询时为true
  1310. dsId:null,
  1311. selectPrev: function(){selectPrev(this);},
  1312. selectNext: function(){selectNext(this);},
  1313. selectCurr: function(){selectCurr(this);},
  1314. filter: function(query){
  1315. filter(this, query);
  1316. },
  1317. setSize:function(target){
  1318. setSize(target);
  1319. },
  1320. setValue:function(target,val){
  1321. var opts = $.data(target, 'fwcombox').options;
  1322. if(opts.multiple){
  1323. if(val==[]&&!opts.dataLoad){
  1324. loadData(target, transformData(target));
  1325. }else{
  1326. setValues(target,val,true,true);
  1327. }
  1328. }else{
  1329. if(val==''&&!opts.dataLoad){
  1330. loadData(target, transformData(target));
  1331. }else{
  1332. setValue(target,val,true,true);
  1333. }
  1334. }
  1335. },
  1336. removeItem:function(target,val){
  1337. removeItem(target,val);
  1338. },
  1339. bindEvents:function(target){
  1340. bindEvents(target);
  1341. },
  1342. onLoadSuccess: function(){},
  1343. onLoadError: function(){},
  1344. onSelect: function(record){},
  1345. onUnselect: function(record){},
  1346. onChange: function(newValue, oldValue){}
  1347. };
  1348. })(jQuery);