| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148 |
-
- (function($){
-
- function selectPrev(target){
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
- var item = fwpanel.find('div.fwcombox-item-selected');
- if (item.length){
- //找到匹配的项
- var prev = item.prevAll(':visible');
- if (prev.length){
- //如果有上方还有选项
- item = prev.eq(0);
- }else{
- //如果已经是第一项,那么光标定位到最后一项
- item = panelbody.find('div.fwcombox-item:visible:last');
- }
- }
- //没有任何项就直接退出
- if(item.length==0)return;
- if (item.position().top <= 0){
- var h = panelbody.scrollTop() + item.position().top;
- panelbody.scrollTop(h);
- } else if (item.position().top + item.outerHeight() > panelbody.height()){
- var h = panelbody.scrollTop() + item.position().top + item.outerHeight() - panelbody.height();
- panelbody.scrollTop(h);
- }
- var value = item.attr('value');
- setValue(target, value);
- }
-
- /**
- * select next item
- */
- function selectNext(target){
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
- var item = fwpanel.find('div.fwcombox-item-selected');
- if (item.length){
- //找到匹配的项
- var next = item.nextAll(':visible');
- if (next.length){
- //如果有下方还有选项
- item = next.eq(0);
- }else{
- //如果已经是第一项,那么光标定位到最后一项
- item = panelbody.find('div.fwcombox-item:visible:first');
- }
- }
- //没有任何项就直接退出
- if(item.length==0)return;
- if (item.position().top <= 0){
- var h = fwpanel.scrollTop() + item.position().top;
- panelbody.scrollTop(h);
- } else if (item.position().top + item.outerHeight() > panelbody.height()){
- var h = panelbody.scrollTop() + item.position().top + item.outerHeight() - panelbody.height();
- panelbody.scrollTop(h);
- }
- var value = item.attr('value');
- setValue(target, value);
- }
-
- function selectCurr(target){
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var item = fwpanel.find('div.fwcombox-item-selected');
- select(target, item.attr('value'));
- }
-
- /**
- * select the specified value
- */
- function select(target, value){
- var opts = $.data(target, 'fwcombox').options;
- var data = $.data(target, 'fwcombox').data;
- hidePanel(target);
- setValue(target, value,true);
- /*
- var combo = $.data(target, 'fwcombox').fwcombox;
- var input = combo.find('.fwcombox-text');
- for(var i=0; i<data.length; i++){
- if (data[i][opts.valueField] == value){
- //opts.onSelect.call(target, data[i]);
- return;
- }
- }*/
- }
-
- /**
- * unselect the specified value
- */
- function unselect(target, value){
- var opts = $.data(target, 'fwcombox').options;
- var data = $.data(target, 'fwcombox').data;
- var value = getValue(target);
-
- setValue(target, '',true);
- for(var i=0; i<data.length; i++){
- if (data[i][opts.valueField] == value){
- opts.onUnselect.call(target, data[i]);
- return;
- }
- }
- }
-
- /**
- * set values
- */
- function setValue(target,value,confirm,isInit){
- var opts = $.data(target, 'fwcombox').options;
- var data = $.data(target, 'fwcombox').data;
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
- var s='';
- var b=false;
- var selectedRecord = {};
- value = value || "";
- if(data!=null){
- for(var j=0; j<data.length; j++){
- if (data[j][opts.valueField] == value){
- s = data[j][opts.textField];
- selectedRecord = data[j];
- b = true;
- break;
- }
- }
- } else if(!opts.dataLoad && !isNull(value)) {
- loadData(target, transformData(target));
- opts.dataLoad = true;
- }
-
- //若是data 还未初始化则从IE默认的下拉框内取
- if(!b){
- $('>option', target).each(function(){
- var v = $(this).attr('value');
- if(v == value){
- s = $(this).text();
- selectedRecord[opts.textField] = s;
- selectedRecord[opts.valueField] = value;
- return false;
- }
- });
- }
- panelbody.find('div.fwcombox-item-selected').removeClass('fwcombox-item-selected');
- panelbody.find('div.fwcombox-item[value=' + value + ']').addClass('fwcombox-item-selected');
- //按displayCol的配置显示具体的值
- if(confirm){
- if ('AAA102' == opts.displayCol) {
- setText(target, value);
- } else if ('AAA103' == opts.displayCol) {
- setText(target, s.substr(value.length + 1));
- } else {
- setText(target, s);
- }
- setComValue(target,value,isInit);
- if(!isInit)
- opts.onSelect.call(target, selectedRecord);
- }
- }
-
- function setComValue(target, value,isInit){
- var opts = $.data(target, 'fwcombox').options;
- var oldValue = getValue(target);
-
- var combo = $.data(target, 'fwcombox').fwcombox;
- target.value = value+"";
-
- if(!isInit && oldValue!=target.value){
- $(target).trigger('change');
- }
-
- opts.onChange.call(target, value, oldValue);
-
- //联动的时候生成子的下拉内容
- if(opts.ldcombox){
- var comtype = target.comtype;
- if(comtype=='child'){return true;}
- LDsetChildValue(target,value);
- return true;
- }
-
- }
-
-
- function transformData(target){
- var opts = $.data(target, 'fwcombox').options;
- var data = [];
- var dname = target.dname;
- var whereCls = target.whereCls;
- var dictType = target.dictType;
- var dictArray = null;
- if (!isNull(dname) && dictType === "default"){
- try {
- if (FW.getDictMode() == FW.DICTMODES.LOCAL ) {
- var localDictObj = FWGetDictApplet();
- var dictStr = localDictObj.getDict(dname,whereCls);
- dictArray = JSON.parse(dictStr);
- } else {
- dictArray = FW.getDict(dname,whereCls);
- }
- } catch(e) {
-
- }
- if (!isNull(dictArray)) {
- for(var i=0;i<dictArray.length;i++) {
- var item = {};
- item[opts.valueField] = dictArray[i][0];
- item[opts.textField] = dictArray[i][0]+"-"+dictArray[i][2];
- data.push(item);
- }
- var item = {};
- item[opts.valueField] = '';
- item[opts.textField]= "";
- item['selected'] = 'selected';
- data.push(item);
- }
- } else {
- $('>option', target).each(function(){
- var item = {};
- item[opts.valueField] = $(this).attr('value');
- //为联动下拉框
- //生成下拉框是现实的文本格式为 荔湾区|401 401表示父的值
- if(opts.ldcombox&&comtype=="child"){
- comtext = $(this).html();
- var sp = comtext.split('|');
- item[opts.textField] = sp[0];
- item['parentvalue'] = sp[1];
- }else{
- item[opts.textField] = $(this).text();
- }
- item['selected'] = $(this).attr('selected');
- item['disabled'] = this.disabled;/*标志是否被过滤的对象*/
- data.push(item);
- });
- }
-
- return data;
- }
-
- /**
- * load data, the old list items will be removed.
- */
- function removeItem(target,value){
- var opts = $.data(target, 'fwcombox').options;
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
-
- //若还没有初始化列表,先初始化
- if(!opts.dataLoad){
- if(!opts.remotedb){
- loadData(target, transformData(target));
- }
- if (opts.data){
- loadData(target, opts.data);
- }
- opts.dataLoad = true;
- }
- var data = $.data(target, 'fwcombox').data;
-
- for(var i=0; i<data.length; i++){
- if(data[i][opts.valueField] == value){
- data.splice(i,1);
- var item = panelbody.find('div.fwcombox-item[value=' + value + ']');
- item.remove();
- break;
- }
- }
-
- $.data(target, 'fwcombox').data = data;
-
- }
-
- function initOptions(target,data) {
- target.options.length=0;
- for(var i=0; i<data.length; i++){
- no = new Option();
- no.value = data[i][opts.valueField];
- no.text = data[i][opts.textField];
- target.options[target.options.length] = no;
- }
- }
-
- /**
- * load data, the old list items will be removed.
- */
- function loadData(target, data){
- var opts = $.data(target, 'fwcombox').options;
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
- var selected = [];
- $.data(target, 'fwcombox').data = data;
- panelbody.empty(); // clear old data
- var isRefresh = opts.remotedb || FW.getDictMode() == FW.DICTMODES.LOCAL;
- //实现远程数据库的录入查询
- //清空原来的值
- if(isRefresh){target.options.length=0;}
-
- for(var i=0; i<data.length; i++){
- var item = $('<div class="fwcombox-item"></div>').appendTo(panelbody);
- item.attr({'value': data[i][opts.valueField],'disabled':data[i].disabled});
- if(data[i].disabled){
- item.hide();
- }
- item.html(data[i][opts.textField]);
- if (data[i]['selected']){
- selected.push(data[i][opts.valueField]);
- }
- //需要将查询到的值初始化给原先的下拉框
- //if(isRefresh){
- no = new Option();
- no.value = data[i][opts.valueField];
- no.text = data[i][opts.textField];
- target.options[target.options.length] = no;
- //}
- isRefresh=true;
- }
- if(isRefresh){
- target.value='';
- }
- if(!opts.remotedb){
- if (selected.length){
- setValue(target,selected[0],false,true);
- } else {
- setValue(target,'',false,true);
- }
- }
-
- opts.onLoadSuccess.call(target, data);
-
- $('.fwcombox-item', fwpanel).hover(
- function(){$(this).addClass('fwcombox-item-hover');},
- function(){$(this).removeClass('fwcombox-item-hover');}
- ).click(function(){
- var item = $(this);
- select(target,item.attr('value'));
-
- });
- }
-
- /**
- * request remote data if the url property is setted.
- */
- function request(target, query){
- var opts = $.data(target, 'fwcombox').options;
-
- if (!opts.url) return;
-
- var param = $.extend({}, {"configid":opts.dname,"query":query});
-
- $.ajax({
- url:opts.url,
- data: param,
- dataType:'json',
- cache:false,
- success:function(data){
- if(data.Token!=null){
- token=data.Token;//更新全局变量token标志
- }
- if("1"!=data.FHZ){//出错了,弹出错误提醒
- if("CSRF" == data.FHZ){
- showMsg(data.MSG||'',3);
- return;
- }
- }
- var da=getData(target,data);
- loadData(target, da);
- },
- error:function(){
- opts.onLoadError.apply(this, arguments);
- },
- beforeSend:function(XMLHttpRequest ){
- var cToken = $.cookie("Token") || token;XMLHttpRequest.setRequestHeader('Token',cToken);
- }
- });
- }
-
- function getData(target,data){
- var opts = $.data(target, 'fwcombox').options;
- var rows = data.rows;
- var total = data.total;
- var iC=0;
- var data = [];
-
- if(rows&&rows.length>0){
- iC = total - rows.length;
- }else{
- return data;
- }
-
- for(var i=0; i<rows.length; i++) {
- var item = {};
- item[opts.valueField] = rows[i][0];
- item[opts.textField] = rows[i][1];
- data.push(item);
- }
-
- if(iC>0){
- var item = {};
- item[opts.valueField] = " ";
- item[opts.textField] = "剩余 "+iC+" 记录未显示";
- data.push(item);
- }
-
- return data;
-
- };
-
-
- function filter(target, query){
- var data = $.data(target, 'fwcombox').data;
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
- var opts = $.data(target, 'fwcombox').options;
- var bEnter = false;
- opts.search = false;
- //去掉之前的选中状态
- panelbody.find('div.fwcombox-item-selected').removeClass('fwcombox-item-selected');
- showPanel(target);
- if(!opts.remotedb){
- target.value='';
- var hasSelect = false;//集合中是否有符合要求的记录
- var showItems = panelbody.find('div.fwcombox-item').each(function(){
- var item = $(this);
- var itemText = item.text();
- if ((!this.disabled)&&itemText.indexOf(query) != -1){
- item.show();
- if (itemText == query){
- setValue(target, item.attr('value'));
- hasSelect = true;
- }
- bEnter =true;
- }else if((!this.disabled)&&isPinyinMatch(itemText,query)){
- item.show();
- bEnter =true;
- } else {
- item.hide();
- }
- }).filter(':visible');
- //如果没有完全匹配的,那么默认选中第一个
- if(showItems.length > 0 && !hasSelect){
- //showItems.first().addClass('fwcombox-item-selected');
- setValue(target, showItems.first().attr('value'));
- }else if (showItems.length==0){
- setValue(target, '');
- }
- }
- if(opts.remotedb){
- request(target,query);
- }
- }
-
- //设置不可编辑属性
- function setDisabled(target, disabled){
- var opts = $.data(target, 'fwcombox').options;
- var combo = $.data(target, 'fwcombox').fwcombox;
-
- if (disabled){
- opts.disabled = true;
- //$(target).attr('disabled', true);
- $(target).removeAttr('disabled');
- var input = combo.find('.fwcombox-text');
- if(input.length>0){
- disablePrimitiveInput(input[0]);
- }
- } else {
- opts.disabled = false;
- $(target).removeAttr('disabled');
- combo.find('.fwcombox-text').removeAttr('disabled')
- .click(function(){
- this.select();
- });
- }
- }
-
-
-
- function setSize(target){
- var opts = $.data(target, 'fwcombox').options;
- var combo = $.data(target, 'fwcombox').fwcombox;
- var panel = $.data(target, 'fwcombox').fwpanel;
-
- //combo.width(opts.width);
- combo.width($(target).outerWidth());
- var arrowWidth = combo.find('.fwcombox-arrow').outerWidth();
- var width = $(target).outerWidth() - arrowWidth-2;
- combo.find('input.fwcombox-text').width(width);
- //如果手动设置了宽度,那么用手动设置的
- panel.css({
- width:opts.fwpanelWidth=='auto'?combo.outerWidth():opts.fwpanelWidth
- }).find('.fwcombox-panel-body').css({
- height:opts.fwpanelHeight=='auto'?'200': opts.fwpanelHeight
- });
- }
-
- /**
- * hide the drop down panel.
- */
- function hidePanel(target){
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- fwpanel.hide();
- }
- /**
- * show the drop down panel.
- */
- function showPanel(target){
- var combo = $.data(target, 'fwcombox').fwcombox;
- var panel = $.data(target, 'fwcombox').fwpanel;
- var opts = $.data(target, 'fwcombox').options;
- var items = panel.find('div');
- /* for(var i=1, len=items.length;i<len;i++){
- if(!items[i].disabled){
- items[i].style.display="block";
- }
- }
- */
-
- //第一次显示时创建下拉列表的数据
- //这样处理的目的是加快控制第一次初始化时的速度
- if(!opts.dataLoad){
- if(!opts.remotedb){
- loadData(target, transformData(target));
- } else {
- if (opts.data){
- loadData(target, opts.data);
- }
- }
- opts.dataLoad = true;
- }
- //重新计算panel的zindex
- var zindex = 0;
- $(combo).parents().each(function(){
- zindex+=parseInt($(this).css('z-index'));
- });
- $.data(target, 'fwcombox').fwpanel.css('z-index',zindex);
- //每次调整只计算一次,免得重复计算
- panel.removeAttr('hasResize');
-
- panel.show();
- if (panel.is(':visible')){
- //下拉框放到DIV内并且初始化时DIV是不可见的,设置DIV可见时
- //下拉列表无法显示,需要修改宽度和高度
- if(panel.width()<5){
- setSize(target);
- }
- var top = combo.offset().top + combo.outerHeight();
- if (top + panel.outerHeight() > $(window).height() + $(document).scrollTop()){
- top = combo.offset().top - panel.outerHeight();
- }
- if (top < $(document).scrollTop()){
- top = combo.offset().top + combo.outerHeight();
- }
- panel.css({
- left:combo.offset().left,
- top:top
- });
- //设置左上角位置(考虑屏幕边界截屏的问题)
- if(combo.offset().left+panel.width()>$(window).width()){
- panel.css({
- left:$(window).width()-panel.width()-3,/*加3预防window出现水平滚动栏*/
- top:top
- });
- }else{
- panel.css({
- left:combo.offset().left,
- top:top
- });
- }
- //setTimeout(arguments.callee, 200);
- }
- }
-
- function setText(target, text){
- var combo = $.data(target, 'fwcombox').fwcombox;
- combo.find('input.fwcombox-text').val(text);
- }
-
- function getValue(target){
- var combo = $.data(target, 'fwcombox').fwcombox;
- return target.value;
- }
-
-
- function destroy(target){
- $.data(target, 'fwcombox').fwpanel.remove();
- $.data(target, 'fwcombox').fwcombox.remove();
- $(target).remove();
- }
-
- function bindEvents(target){
- var opts = $.data(target, 'fwcombox').options;
- var combo = $.data(target, 'fwcombox').fwcombox;
- var panel = $.data(target, 'fwcombox').fwpanel;
- var input = combo.find('.fwcombox-text');
- var arrow = combo.find('.fwcombox-arrow');
-
- //$(document).unbind('.fwcombox');
- combo.unbind('.fwcombox');
- panel.unbind('.fwcombox');
- input.unbind('.fwcombox');
- arrow.unbind('.fwcombox');
-
- $(target).addClass('fwresize').bind('fwresize',function(){
- var comopts = $.data(this, 'fwcombox').options;
- comopts.setSize(target);
- });
-
- if (!opts.disabled){
- /*
- $(document).bind('mousedown.fwcombox', function(e){
- hidePanel(target);
- });
- panel.bind('mousedown.fwcombox', function(e){
- return false;
- });
- */
- //zzy add 2010-10-08 begin 失去焦点时关闭下拉项
- input.bind('keydown',function(e){
- if(e.keyCode==13 ||e.keyCode==9){
- //hidePanel(target);
- opts.selectCurr.call(target);
- }
- });
- //end
-
- //鼠标点击其他地方就隐藏列表
- $(document).bind({
- 'mousedown':function(e){
- if(e.target != input[0] &&e.target != arrow[0]
- &&e.target != panel[0] && panel.is(':visible')){
- opts.selectCurr.call(target);
- }
- },
- 'focus':function(e){
- if(e.target != input[0] &&e.target != arrow[0]
- &&e.target != panel[0]&& panel.is(':visible')&&e.target!=target){
- opts.selectCurr.call(target);
- }
- }
- });
-
- //鼠标移动到上面屏蔽掉
- panel.bind('mousedown', function(e){
- var element = e.srcElement;
-
- //存在滚动条的情况下单击滚动条有效
- if(e.offsetX>130){
- return false;
- }
-
- var iLen = 0;
- try{
- iLen = target.options.length;
- }catch(e){}
- //有可能存在滚动条
- if(iLen>8){
- return false;
- }
-
- if(-1 != (element.className).indexOf("fwcombox-item")){
- return false;//线程堵塞等待ONCLICK执行
- }
-
- return true;//直接返回
-
- });
- panel.bind('mouseenter', function(e){
- var ee = this;
- var e2 = e;
- if (this == e.currentTarget) {
- jQuery(target).data('_hide',true);
- //showErrMsg(jQuery(target).data('_hide'),2);
- }
- });
- panel.bind('mouseout', function(e){
- if (this != e.currentTarget) {
- jQuery(target).data('_hide',false);
- //showErrMsg(jQuery(target).data('_hide'),2);
- }
- });
- jQuery(target).bind('mousedown', function(e){
- return false;
- });
-
- //将hidden控件的onfocus事件专递到外部可见的input来
- $(target).focus(function(){
- input[0].select();
- });
- //回传外部的blur事件
- input.blur(function(e){
- $(target).blur();
- if(!jQuery(target).data('_hide')){
- hidePanel(target);
- }
- });
-
- input.unbind('focus.fwcombox').bind('focus.fwcombox', function(event){
- input[0].select();
- $.data(target, 'fwcombox').fwpanel.hide();
- showPanel(target);
- })/*.bind('mousedown.fwcombox', function(e){
- e.stopPropagation();
- })*/.bind('keyup.fwcombox', function(e){
- switch(e.keyCode){
- case 37: // left
- case 38: // up
- opts.selectPrev.call(target);
- jQuery(target).data('_hide',false);
- //showErrMsg(jQuery(target).data('_hide'),2);
- break;
- case 39: // right
- case 40: // down
- opts.selectNext.call(target);
- jQuery(target).data('_hide',false);
- //showErrMsg(jQuery(target).data('_hide'),2);
- break;
- case 16: //shift
- break;
- case 9: //tab
- case 13: // enter zzy 2010-10-08 注销防止按回车键代替TAB进入时,下拉框消失
- //opts.selectCurr.call(target);
- break;
- case 27: // esc
- hidePanel(target);
- break;
- case 46://delete
- clearInput(target);
- break;
- default:
- if (opts.editable){
- var queryText = $(this).val();
- if(!opts.remotedb){
- opts.filter.call(target, queryText);
- }else{
-
- var input = $(this);
- if(!opts.search){ //为了避免频繁的查询过滤
- opts.search = true;
- setTimeout(function(){
- filter(target,queryText);
- },1000*0.3); //延迟两秒处理
- }
-
-
- }
-
- }
- }
- return false;
- });
-
- arrow.bind('click.fwcombox', function(){
- input[0].select(); //hr 20111010
- $.data(target, 'fwcombox').fwpanel.hide();
- //alert("click.fwcombox");
- showPanel(target);
- }).bind('mouseenter.fwcombox', function(){
- $(this).addClass('fwcombox-arrow-hover');
- }).bind('mouseleave.fwcombox', function(){
- $(this).removeClass('fwcombox-arrow-hover');
- });
- }
- //如果target声明了onselect函数,那么绑定它
- if(target.onselect && window[target.onselect]){
- opts.onSelect = window[target.onselect];
- }
-
- }
- //单击delete键去掉选中
- function clearInput(target){
- var combo = $.data(target, 'fwcombox').fwcombox;
- var input = combo.find('.fwcombox-text');
- var fwpanel = $.data(target, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
- input.val('');
- target.value='';
- panelbody.find('div.fwcombox-item-selected').removeClass('fwcombox-item-selected');
- panelbody.find('div.fwcombox-item[value=]').addClass('fwcombox-item-selected');
- input.focus();
- }
- //创建下拉框
- function create(target){
- init(target);
-
- var opts = $.data(target, 'fwcombox').options;
- var fwcombox = $.data(target, 'fwcombox').fwcombox;
-
- opts.disabled = $(target).attr('disabled');
- $(target).removeAttr('disabled');
- $('input.fwcombox-text', fwcombox).attr('readonly', !opts.editable);
- setDisabled(target, opts.disabled);
- setSize(target);
- bindEvents(target);
-
- }
-
- /**
- * 创建下拉框的输入框已经下拉DIV
- */
- function init(target){
- var iWidth = $(target).outerWidth();
- var iHeight = $(target).outerHeight();
- var iTop = $(target).offset().top + iHeight;
- var iLeft = $(target).offset().left;
- //$(target).hide();
- var opts = $.data(target, 'fwcombox').options;
- var vldStr = $(target).attr('vldStr');
-
- //取原来下拉框的长度,因为IE自带的下拉框所获取的自动宽度比较正确
- if(opts.width=='auto'){
- opts.width= $(target).attr('mw');//iWidth;
- }
-
- /*var span = $('<span class="fwcombox"></span>').insertAfter(target);
- var input = $('<input type="text" class="fwcombox-text">').appendTo(span);
- $('<span class="fwcombox-arrow"></span>').appendTo(span);*/
-
- var span = $(target).next(".fwcombox");
- var fwpanel = $('<div class="fwcombox-panel"></div>').appendTo('body');
- //if(vldStr){
- // span.find('input.fwcombox-text').attr('vldStr', vldStr);
- // }
- //联动下拉框
- if(opts.ldcombox){
- var comtype = $(target).attr('comtype');
- if(comtype=='parent'){
- opts.ldchild = $(target).attr('childname');
- }else{
- opts.ldparent = $(target).attr('parentname');
- }
- }
- fwpanel.css({
- 'top':iTop,
- 'left':iLeft,
- 'display':'none'
- });
-
- var panelbody = $('<div class="fwcombox-panel-body"></div>').appendTo(fwpanel);
-
- /* panelbody.css({
- 'width':iWidth+10,
- 'height':'200px'
- });*/
- //input.attr('autocomplete', 'off');
- $.data(target, 'fwcombox').fwcombox = span;
- $.data(target, 'fwcombox').fwpanel = fwpanel;
- }
-
- /**
- * 联动下拉框 过滤子下拉框的下拉选项
- */
- function LDsetChildValue(target,value){
- var opts = $.data(target,'fwcombox').options;
- var child_obj;
-
- //直接找到此控件所在的TABLE 这样的目的是为了减少搜索范围
- var table = $(target).parent().parent().parent();
- $('.ldcombox',table).each(function(){
- if(this.name==opts.ldchild){
- child_obj = this;
- return false;
- }
- });
-
- if(child_obj != 'undefined'){
- //尚未初始化
- if($.data(child_obj, 'fwcombox')==null){return true;}
-
- var fwpanel = $.data(child_obj, 'fwcombox').fwpanel;
- var panelbody = $('.fwcombox-panel-body',fwpanel);
- var combo = $.data(child_obj,'fwcombox').fwcombox;
- var input = combo.find('input.fwcombox-text');
-
- panelbody.empty();
- input.val('');
-
- if(value==null||value==''){
- child_obj.value='';
- return true;
- }
-
- var child_data = $.data(child_obj,'fwcombox').data;
- var item = $('<div class="fwcombox-item"></div>').appendTo(panelbody);
- item.attr('value', '');
- item.html('');
-
- for(var i=0; i<child_data.length; i++){
- //需要将查询到的值初始化给原先的下拉框
- if(child_data[i]['parentvalue']==value){
- var item = $('<div class="fwcombox-item"></div>').appendTo(panelbody);
- item.attr('value', child_data[i][opts.valueField]);
- item.html(child_data[i][opts.textField]);
- }
- }
-
- $('.fwcombox-item', fwpanel).hover(
- function(){$(this).addClass('fwcombox-item-hover');},
- function(){$(this).removeClass('fwcombox-item-hover');}
- ).click(function(){
- var item = $(this);
- select(child_obj,item.attr('value'));
- });
-
- }//!= undefined
- }
-
- var methods = {
- /**设置或者获取控件是否只读。
- * 参数flag可不传,不传表示获取控件的只读属性。
- * @param flag 只读标志,true为设置只读,false为取消只读。
- * @return 获取只读属性时为true和false,true表示控件只读,false表示控件;
- * 设置控件只读属性时返回jquery,当前jquery集合。
- */
- disabled : function(flag){
- if(arguments.length==0){
- //如果没有入参,那么属于要返回当前是否只读的状态
- if(this.length==0){return null;}
- var opts = $.data(this[0], 'fwcombox').options;
- return opts.disabled;
- }else{
- //有入参处理设置是否只读的情况
- return this.each(function(){
- if(flag){
- //设置为只读
- var opts = $.data(this, 'fwcombox').options;
- var combo = $.data(this, 'fwcombox').fwcombox;
- var arrow = combo.find('.fwcombox-arrow');
- var input = combo.find('.fwcombox-text');
- arrow.unbind('.fwcombox');
- input.unbind('.fwcombox');
-
- opts.disabled = true;
- $(this).removeAttr('disabled');
- disablePrimitiveInput(input[0]);
- }else{
- //设置为非只读
- var opts = $.data(this, 'fwcombox').options;
- if(opts.disabled){
- var span = jQuery.data(this, 'fwcombox').fwcombox;
- var input = jQuery('.fwcombox-text',span);
- enablePrimitiveInput(input[0]);
- opts.disabled = false;
- opts.bindEvents(this);
- }
- }
- });
- }
- },
- /**
- * 返回控件是否可见。
- * 返回值:true表示可见,false表示不可见。
- */
- visible : function(){
- if(this.length==0){return null;}
- var span = $.data(this[0],'fwcombox').fwcombox;
- return span.is(":visible");
- },
- /**
- * 获取静态字典的中文名称
- */
- text :function(){
- return this.map(function(){
- return $.trim($.data(this, 'fwcombox').fwcombox.find('input.fwcombox-text').val());
- }).get(0);
- },
- /**
- * 持久过滤控件中的字典项。
- * @param values 要过滤的值,可以是数组。可空,空表示取消过滤
- * @param revert 反向过滤,boolean类型,为true时保留values指定的值,过滤没指定的值。可空
- * @return jQuery jquery原集合
- */
- filter:function(values,revert){
- var vals = [].concat(values);
- return this.each(function(){
- var opts = $.data(this, 'fwcombox').options;
- if(!opts.dataLoad){
- loadData(this, transformData(this));
- opts.dataLoad = true;
- }
- if(opts.dataLoad){
- //先处理模型
- var tvalsDiv = [].concat(vals);
- var data = $.data(this, 'fwcombox').data;
- for(var i=0; i<data.length; i++){
- var pos = $.inArray(data[i][opts.valueField],vals);
- //根据是否在过滤选项中设置过滤标志
- data[i].disabled = (pos != -1);
- if(revert){data[i].disabled=!data[i].disabled;}
- //删除当前值
- if(pos!=-1){
- vals.splice(pos,1);
- }
- }
- //后处理UI,如果UI还没初始化,正好略过
- var fwpanel = $.data(this, 'fwcombox').fwpanel;
- var panelbody = $('div.fwcombox-panel-body',fwpanel);
- panelbody.children().each(function(){
- var pos = $.inArray(this.value,tvalsDiv);
- //根据是否在过滤选项中设置过滤标志
- this.disabled = (pos != -1);
- if(revert){this.disabled=!this.disabled;}
- //删除当前值
- if(pos!=-1){
- tvalsDiv.splice(pos,1);
- }
- if(this.disabled){
- $(this).hide();
- }else{
- $(this).show();
- }
- });
- }else{
- //还没初始化就直接处理select
- for(var index=0;index<this.length;index++){
- var pos = $.inArray(this.options[index].value,vals);
- //根据是否在过滤选项中设置过滤标志
- this.options[index].disabled = (pos != -1);
- if(revert){this.options[index].disabled=!this.options[index].disabled;}
- //删除当前值
- if(pos!=-1){
- vals.splice(pos,1);
- }
- }
- }
- });
- },
- /**
- * 静态字典的构造函数
- */
- init :function(options){
- return this.each(function(){
- options = options || {};
- var state = $.data(this, 'fwcombox');
- if (state){
- $.extend(state.options, options, {
- 'displayCol' : this.displayCol,
- 'fwpanelWidth' : this.fwpanelWidth,
- 'fwpanelHeight' : this.fwpanelHeight
- });
- } else {
- state = $.data(this, 'fwcombox', {
- options : $.extend({
- }, $.fn.fwcombox.defaults, options,{
- 'displayCol' : this.displayCol,
- 'fwpanelWidth' : this.fwpanelWidth,
- 'fwpanelHeight' : this.fwpanelHeight
- }),
- fwcombox:null,
- fwpanel:null
- });
- create(this);
- if(this.className=='dbcombox'){
- state.options.remotedb = true;
- state.options.url = this.url;
- state.options.dname = this.dname;
- }
- //不能一开始就初始化,影响性能
- //if(!state.options.remotedb){
- // loadData(this, transformData(this));
- //}
- }
- //不能一开始就初始化,影响性能
- //if (state.options.data){
- // loadData(this, state.options.data);
- //}
- setValue(this, this.value,true,true);
- });
- }
- };
- $.fn.fwcombox = function(options){
- if (methods[options]) {
- return methods[options].apply(this, Array.prototype.slice.call(
- arguments, 1));
- } else if (typeof options === 'object' || !options) {
- return methods.init.apply(this, arguments);
- } else {
- $.error('Method ' + options + ' does not exist on fwcombox');
- }
- };
-
- $.fn.fwcombox.defaults = {
- valueField: 'value',
- textField: 'text',
- dataLoad:false,
- url: null,
- dname:null,
- data: null,
- total:null,
- width: 'auto',
- fwpanelWidth: null,
- fwpanelHeight: 200,
- separator: ',',
- editable: true,
- disabled: false,
- ldcombox:false,//是否属于联动下拉框
- ldparent:null, //联动下拉框父的名字
- ldchild:null,//联动下拉框子的名字
- sqlid:null,//数据库查询对应的配置ID
- param:null,
- search:false,
- remotedb:false,//远程查询时为true
- selectPrev: function(){},
- selectNext: function(){},
- selectCurr: function(){},
- filter: function(query){},
-
- selectPrev: function(){selectPrev(this);},
- selectNext: function(){selectNext(this);},
- selectCurr: function(){selectCurr(this);},
- filter: function(query){filter(this, query);},
- setSize:function(target){
- setSize(target);
- },
- setValue:function(target,val){
- var opts = $.data(target, 'fwcombox').options;
- if(val==''&&!opts.dataLoad){
- loadData(target, transformData(target));
- }else{
- setValue(target,val,true,true);
- }
- },
- removeItem:function(target,val){
- removeItem(target,val);
- },
- bindEvents:function(target){
- bindEvents(target);
- },
- onLoadSuccess: function(){},
- onLoadError: function(){},
- onSelect: function(record){},
- onUnselect: function(record){},
- onChange: function(newValue, oldValue){}
- };
-
- })(jQuery);
|