(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; ioption', 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;ioption', 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').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; i0){ 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 $(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 = $('').insertAfter(target); var input = $('').appendTo(span); $('').appendTo(span);*/ var span = $(target).next(".fwcombox"); var fwpanel = $('
').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 = $('
').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 = $('
').appendTo(panelbody); item.attr('value', ''); item.html(''); for(var i=0; i').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