EasyUI 數(shù)據(jù)表格datagrid列自適應(yīng)內(nèi)容寬度的實(shí)現(xiàn)
項(xiàng)目初期在加載數(shù)據(jù)表格的時(shí)候?yàn)榱颂岣弑砀駭?shù)據(jù)渲染速度,設(shè)置了默認(rèn)寬度。
現(xiàn)需求需要加一個(gè)表格自適應(yīng)的功能,觸發(fā)改功能,改變列寬度,但是不重新渲染表格,不發(fā)生數(shù)據(jù)請(qǐng)求。
設(shè)計(jì)思路,遍歷每項(xiàng)的所有數(shù)據(jù),比較字節(jié)符串長(zhǎng)度,取最大長(zhǎng)度。再用最大長(zhǎng)度和標(biāo)題長(zhǎng)度比較,如果標(biāo)題長(zhǎng)就去標(biāo)題長(zhǎng)度,如果字符串長(zhǎng),就取字符串的。
js
//表格自適應(yīng)方法
function changeWidth(agstr){
var dg = $('#'+agstr);
dg.datagrid("loading");//顯示加載狀態(tài)$$$
var fn=function(){
var opts = dg.datagrid('getColumnFields'); //獲取表頭所有field
var data=dg.datagrid('getData');//獲取數(shù)據(jù)表格請(qǐng)求的數(shù)據(jù)
var role = data.rows;//數(shù)據(jù)表格請(qǐng)求的數(shù)據(jù),即每行的數(shù)據(jù)
for (var i = 0; i <opts.length ;i++) { //循環(huán)每一列的數(shù)據(jù)內(nèi)容
var field=opts[i];
var ro_width = 0;
if(field != ''){
var col = dg.datagrid('getColumnOption', field);
var col_title = col.title;
for(j=0;j<role.length;j++){
if(StringTolog(role[j][field])>ro_width){
ro_width = StringTolog(role[j][field]);//比較當(dāng)前field列的每條數(shù)據(jù)長(zhǎng)度,取最大值
}
}
if(ro_width<StringTolog(col_title)){//如果當(dāng)前列數(shù)據(jù)長(zhǎng)度小于當(dāng)前列表頭長(zhǎng)度則取表頭長(zhǎng)度
ro_width =StringTolog(col_title);
}
var ro_length=ro_width*14+10;//14是頁(yè)面字體像素大小 10是單元格左右內(nèi)邊距大小
$("td[field='"+field+"'] div").width(ro_length);//設(shè)置列寬樣式
dg.datagrid('lockColumn',field);//禁止數(shù)據(jù)表格改變列寬※※※
}
}
dg.datagrid("loaded");//隱藏加載狀態(tài)$$$
}
setTimeout(fn,0);
}
//字符串的粗略換算
function StringTolog(Str){
if(Str==null){
return 0;
}
Str = Str.toString();//該方法將取到的數(shù)據(jù)轉(zhuǎn)為String類型
Str = Str.replace(/\s+/g,'');//替換空格
//兩個(gè)字節(jié)為長(zhǎng)度1,一個(gè)字節(jié)為長(zhǎng)度0.5,計(jì)算字符串總長(zhǎng)度
var newStr = (Str.length-Str.replace(/[\x00-\xff]+/g,'').length)/2
+Str.replace(/[\x00-\xff]+/g,'').length;
return newStr;
}
調(diào)用以上兩個(gè)方法就可以實(shí)現(xiàn)列寬自適應(yīng)。
但是發(fā)現(xiàn)執(zhí)行此方法之后,表頭和表身的單元格寬度都已經(jīng)固定寫死,如果此時(shí)觸發(fā)調(diào)整列寬大小事件,只能改變表頭寬度,不會(huì)改變表身列寬,所以自適應(yīng)列寬后可以取消改變列寬大小的功能
封裝凍結(jié)列方法:
//凍結(jié)列,禁止調(diào)節(jié)列尺寸$("#id").datagrid('lockColumn',field值);
$.extend($.fn.datagrid.methods, {
lockColumn: function(jq, field){
return jq.each(function(){
var p = $(this).datagrid('getPanel'); // 獲取數(shù)據(jù)表格面板
var cell = p.find('div.datagrid-header td[field=' + field + '] > div.datagrid-cell'); // 獲取數(shù)據(jù)表格監(jiān)聽改變列寬事件的節(jié)點(diǎn)
cell.resizable({disabled:true}); // 禁止改變列寬
});
}
});
在給每列設(shè)置寬度的時(shí)候調(diào)用該方法
dg.datagrid('lockColumn',field);
changeWidth 方法中的※※※位置
在重新定義列寬的時(shí)候如果數(shù)據(jù)量過大會(huì)導(dǎo)致頁(yè)面卡頓,可以再觸發(fā)該方法的開始位置調(diào)用datagrid的loading方法,結(jié)束時(shí)調(diào)用loaded方法,changeWidth 方法中的$$$位置

因?yàn)樵谟|發(fā)表格自適應(yīng)方法后調(diào)用了datagrid的凍結(jié)列方法,所以再重新查詢數(shù)據(jù)的時(shí)候表頭不會(huì)重新渲染,只有表身會(huì),,表身就會(huì)恢復(fù)默認(rèn)寬度,就會(huì)出現(xiàn)表頭和表身對(duì)不齊的問題,表頭也不能改變寬度。
解決辦法,在數(shù)據(jù)表格數(shù)據(jù)加載成功時(shí)取消凍結(jié)列,清空之前計(jì)算的列寬

封裝取消凍結(jié)列方法
//取消凍結(jié)列,允許調(diào)節(jié)列尺寸$("#id").datagrid('unlockColumn',field值);
$.extend($.fn.datagrid.methods, {
unlockColumn: function(jq, field){
return jq.each(function(){
var p = $(this).datagrid('getPanel'); // 獲取數(shù)據(jù)表格面板
var cell = p.find('div.datagrid-header td[field=' + field + '] > div.datagrid-cell'); // 獲取數(shù)據(jù)表格監(jiān)聽改變列寬事件的節(jié)點(diǎn)
cell.resizable({disabled:false}); // 允許改變列寬
});
}
});
數(shù)據(jù)加載成功觸發(fā)
onLoadSuccess: function (data) {
var opts = $(this).datagrid('getColumnFields'); //獲取表頭所有field
for(var i=0;i<opts.length;i++){
$(this).datagrid('unlockColumn',opts[i]);//允許調(diào)整列尺寸
$("tr.datagrid-header-row td[field='"+opts[i]+"'] div").width('');//清空表格自適應(yīng)時(shí)計(jì)算的表頭寬度
}
},

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- jQuery EasyUI中DataGird動(dòng)態(tài)生成列的方法
- EasyUI學(xué)習(xí)之Combobox下拉列表(1)
- Easyui Datagrid自定義按鈕列(最后面的操作列)
- easyUI下拉列表點(diǎn)擊事件使用方法
- easyui combogrid實(shí)現(xiàn)本地模糊搜索過濾多列
- EasyUI學(xué)習(xí)之Combobox級(jí)聯(lián)下拉列表(2)
- EasyUI使用DataGrid實(shí)現(xiàn)動(dòng)態(tài)列數(shù)據(jù)綁定
- jquery easyui如何實(shí)現(xiàn)格式化列
- jEasyUI 設(shè)置凍結(jié)列的實(shí)現(xiàn)示例
相關(guān)文章
jQuery hover事件簡(jiǎn)單實(shí)現(xiàn)同時(shí)綁定2個(gè)方法
這篇文章主要介紹了jQuery hover事件簡(jiǎn)單實(shí)現(xiàn)同時(shí)綁定2個(gè)方法,可實(shí)現(xiàn)同時(shí)綁定懸停與離開事件的功能,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2016-06-06
JQuery AJAX實(shí)現(xiàn)目錄瀏覽與編輯的代碼
這部分作為后臺(tái)的一部分實(shí)現(xiàn),目的是實(shí)現(xiàn)某個(gè)指定目錄下所有文件夾和文件的瀏覽,同時(shí)不顯示不允許的格式,對(duì)于文本格式和代碼文件可以進(jìn)行編輯2008-10-10
jQuery UI庫(kù)中dialog對(duì)話框功能使用全解析
這篇文章主要介紹了jQuery UI庫(kù)中dialog對(duì)話框功能使用全解析,文中列舉了各種常用的dialog屬性,整理得很全面,需要的朋友可以參考下2016-04-04
jQuery可見性過濾器:hidden和:visibility用法實(shí)例
這篇文章主要介紹了jQuery可見性過濾器:hidden和:visibility用法,實(shí)例分析了:hidden和:visibility的功能及相關(guān)使用技巧,需要的朋友可以參考下2015-06-06

