(function($){ function selectPrev(target){ var fwpanel = $.data(target, 'fwcombox').fwpanel; var panelbody = $('.fwcombox-panel-body',fwpanel); var item = fwpanel.find('div.fwcombox-item-selected'); var opts = $.data(target, 'fwcombox').options; 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'); if(!opts.multiple){ 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'); var opts = $.data(target, 'fwcombox').options; 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'); if(!opts.multiple){ setValue(target, value); } } function selectCurr(target){ var fwpanel = $.data(target, 'fwcombox').fwpanel; var item = fwpanel.find('div.fwcombox-item-selected'); var opts = $.data(target, 'fwcombox').options; var value = item.attr('value'); if(!opts.multiple){ setValue(target, value, true); hidePanel(target); } } /** * select the specified value */ function select(target, value){ var opts = $.data(target, 'fwcombox').options; var data = $.data(target, 'fwcombox').data; if(opts.multiple){ if(value==''){ return; } var values = getValues(target); for(var i=0; i0)?'firefox': (UA.indexOf("chrome")>0)?'chrome': window.opera?'opera': window.openDatabase?'safari': 'unkonw'; }catch(e){}; try { NV.version=(NV.name=='ie')?UA.match(/msie ([\d.]+)/)[1]: (NV.name=='firefox')?UA.match(/firefox\/([\d.]+)/)[1]: (NV.name=='chrome')?UA.match(/chrome\/([\d.]+)/)[1]: (NV.name=='opera')?UA.match(/opera.([\d.]+)/)[1]: (NV.name=='safari')?UA.match(/version\/([\d.]+)/)[1]: '0'; }catch(e){}; return NV; } /** * 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; joption', 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的配置显示具体的值 目前有AAA102(只显示代码),AAA103(只显示中文),BOTH(都显示)三种 var dictType =$(target).attr('dictType'); var displayCol =$(target).attr('displayCol'); if(confirm){ if(dictType == "default"){ // displayCol 目前有AAA102(只显示代码),AAA103(只显示中文),BOTH(都显示)三种 if ('AAA102' == displayCol) { setText(target, value); } else if ('AAA103' == displayCol) { setText(target, s); } else { var text=s.substr(s.indexOf("-")+1,s.length); setText(target, text); } }else if(dictType == "s"){ setText(target, s); } setComValue(target,value,isInit); if(!isInit) opts.onSelect.call(target, selectedRecord); } } /** * set values */ function setValues(target,values,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 selectedRecords = []; var vv = [], ss = []; values = values || []; panelbody.find('div.fwcombox-item-selected').removeClass('fwcombox-item-selected'); 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; } }); } if(value==''&&values.length>1){ }else{ vv.push(value); ss.push(s); selectedRecords.push(selectedRecord); panelbody.find('div.fwcombox-item[value="' + value + '"]').addClass('fwcombox-item-selected'); } } //按displayCol的配置显示具体的值 目前有AAA102(只显示代码),AAA103(只显示中文),BOTH(都显示)三种 if(confirm){ if ('AAA102' == opts.displayCol) { setText(target, vv.join(opts.separator)); } else if ('AAA103' == opts.displayCol) { setText(target, vv.join(opts.separator)); } else { var textFields=[]; for(var i=0; i1){ }else{ var input = $('').appendTo(combo); //if (name) input.attr('name', name); input.val(values[i]); } } var tmp = []; 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][opts.valueField]==''){ itemHtml+='
'+' '+'
'; }else{ itemHtml+='
'+data[i][opts.textField]+'
'; } if (data[i]['selected']){ if(values==null){//初始化如果有选中值 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.length当作变量,重复遍历影响性能 //target.options[target.options.length] = no; target.options[cnt] = no; cnt++; //} isRefresh=true; } panelbody.html(itemHtml); if(isRefresh){ target.value=''; } if(!opts.remotedb){ if (opts.multiple){ if(values!=null){//初始化如果有值 }else{ setValues(target, selected,false,true); } } else { 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); if (opts.multiple){ if (item.hasClass('fwcombox-item-selected')){ unselect(target, item.attr('value')); } else { select(target, item.attr('value')); } } else { 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!=null && data[headtoken]!=null){ token=data[headtoken];//更新全局变量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(headtoken) || token;XMLHttpRequest.setRequestHeader(headtoken,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){ if(opts.multiple){ var qq = opts.multiple ? query.split(opts.separator) : [query]; var vv = []; var hasSelect = false;//集合中是否有符合要求的记录 panelbody.find('div.fwcombox-item').each(function(){ var item = $(this); var itemText = item.text(); var v=item.attr('value')+''; for(var i=0;i 0 && !hasSelect){ if(query!=''){//无任何输入选中空值 //showItems.first().addClass('fwcombox-item-selected'); setValue(target, showItems.first().attr('value')); }else{ setValue(target, ''); } }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){ CFW.oGt._disablePrimitiveInput(input[0]); } } else { opts.disabled = false; $(target).removeAttr('disabled'); combo.find('.fwcombox-text').removeAttr('disabled') .click(function(){ this.select(); }); } } function setSize(target,targetWidth){ var opts = $.data(target, 'fwcombox').options; var combo = $.data(target, 'fwcombox').fwcombox; var panel = $.data(target, 'fwcombox').fwpanel; //combo.width(opts.width); var objWidth; if(targetWidth==null){ if($.browser.msie){ if(document.documentMode==null||document.documentMode=='5'){ objWidth=$(target).outerWidth(); }else{ objWidth=$(target).parent().width()-2; } }else{ objWidth=$(target).parent().width()-2; } }else{ objWidth=targetWidth; } var arrowWidth = 18; var textwidth = objWidth - arrowWidth-2; if($.browser.msie && opts.width=='auto'){ if(document.documentMode!=null && (document.documentMode=='7'||document.documentMode=='8'||document.documentMode=='9')){ combo.css({width:'100%',margin:'1px'}); objWidth=combo.width(); textwidth = objWidth - arrowWidth-2; combo.find('input.fwcombox-text').css({width:(textwidth/objWidth)*100+'%'}); }else{ combo.width(objWidth); combo.find('input.fwcombox-text').width(textwidth); } }else{ combo.width(objWidth); combo.find('input.fwcombox-text').width(textwidth); } //var arrowWidth = combo.find('.fwcombox-arrow').outerWidth(); //如果手动设置了宽度,那么用手动设置的 panel.css({ width:opts.fwpanelWidth=='auto'?objWidth: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); if(opts.multiple){ hidePanel(target); }else{ 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')){ if(opts.multiple){ hidePanel(target); }else{ 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){ if(opts.multiple){ hidePanel(target); }else{ opts.selectCurr.call(target); } } } }); //鼠标移动到上面屏蔽掉 panel.bind('mousedown', function(e){ var element = e.target || 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); //如果参数输入值为空 var queryText = $(this).val(); if (opts.editable){ if(!opts.remotedb&&queryText==''){ opts.filter.call(target, queryText); } } })/*.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 break; 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); var queryText = $(this).val(); if (opts.editable&&!opts.multiple){ if(!opts.remotedb&&queryText==''){ opts.filter.call(target, queryText); } } }).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); var opts = $.data(target, 'fwcombox').options; if(opts.multiple){ setValues(target, [],true); }else{ 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,objWidth){ init(target,objWidth); 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,objWidth); bindEvents(target); } /** * 创建下拉框的输入框已经下拉DIV */ function init(target,objWidth){ var obj=$(target); var iWidth; if(objWidth==null){ if($.browser.msie){ if(document.documentMode==null||document.documentMode=='5'){ iWidth=obj.outerWidth(); }else{ iWidth=obj.parent().width()-2; } }else{ iWidth=obj.parent().width()-2; } }else{ iWidth=objWidth; } //var iHeight = obj.outerHeight(); var iHeight = 20; var iTop = obj.offset().top + iHeight; var iLeft = obj.offset().left; //$(target).hide(); var opts = $.data(target, 'fwcombox').options; var vldStr = $(target).attr('vldStr'); //取原来下拉框的长度,因为IE自带的下拉框所获取的自动宽度比较正确 //if(opts.width=='auto'){ // opts.width= iWidth;//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); // } fwpanel.css({ 'top':iTop, 'left':iLeft, 'width':iWidth, '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; } 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'); CFW.oGt._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); CFW.oGt._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"); }, /** * 获取静态字典的中文名称 */ getValues :function(target){ return getValues(target); }, clearInputValue :function(target){ return clearInput(target); }, /** * 获取静态字典的中文名称 */ 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