本文总结了EasyUI开发过程中遇到的常见问题和解决方案,包括数据表格、表单验证、对话框、树形控件等组件的使用技巧和注意事项。通过实际项目经验,整理了EasyUI开发中的最佳实践和常见坑点,帮助开发者快速解决开发中遇到的问题,提升开发效率。
一、输入框处理 EasyUI的输入框组件在实际开发中经常会遇到精度丢失、科学计数法显示等问题,本节将详细介绍这些问题的解决方案。
1.1 四舍五入精度丢失问题 在使用EasyUI的NumberBox组件时,当指定小数位数后,有时候无法正常进行四舍五入,导致精度丢失。这是因为JavaScript的浮点数运算精度问题导致的。
1 2 解决方案: 通过重写Number.prototype.toFixed()方法,使用自定义的精度计算逻辑来解决这个问题。
1 2 3 4 5 6 7 8 <div class ="query_ipt font_sz12 font_clr66 mg_r10" > <span > 调账金额</span > <input type ="text" class ="easyui-numberbox" data-options ="max:999999999" id ="adjustAmountJs" name ="adjustAmount" > </div > ```javascript
/**
页面JS1 2 3 */ ```javascript $(document).ready(function() {
1 2 3 4 //重写Number.toFixed()方法 //NumberBox指定小数位数有时候不能正常的四舍五入解决办法 $("#adjustAmountJs").numberbox({ precision: 2
})
1 2 3 4 5 6 7 8 9 10 Number .prototype .toFixed = function (s ) { var Dight = Math .pow (10 ,s); if (Number (this )>0 ){ return Math .round (numMulti (this , Dight ))/Dight ; }else { var num = Math .round (numMulti (Math .abs (this ), Dight ))/Dight ; return -num;
}
};
1 2 /** * 乘法运算,避免数据相乘小数点后产生多位数和计算精度损失。
*
1 * @param num1被乘数 | num2乘数
*/
1 2 3 4 5 function numMulti (num1, num2 ) { var baseNum = 0 ; try { baseNum += num1.toString ().split ("." )[1 ].length ; } catch (e) {
}
1 2 try { baseNum += num2.toString().split(".")[1].length;
}
1 return Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", "")) / Math.pow(10, baseNum);
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #### 1.2 科学计数法转换问题 在EasyUI的输入框中,当输入或计算大数值时,可能会显示为科学计数法格式(如1.23e+10),影响用户体验。需要将科学计数法转换为普通数字格式显示。 通过自定义计算函数,使用parseFloat和toLocaleString方法将科学计数法转换为普通数字格式,并处理千分位分隔符。 <span class="font_clred font_sz14">*</span> <span>价格/天</span> <input type="text" class="easyui-validatebox" id="npriceUpd" name="nprice" maxlength="12" onchange="calculateNyingshoumny()"/> <span>天数</span> <input type="text" class="easyui-validatebox" id="idaynumUpd" name="idaynum" maxlength="28" onchange="calculateNyingshoumny()"/> <span>应收金额</span> <input type="text" class="easyui-validatebox" id="nyingshoumnyUpd" name="nyingshoumny" disabled="true"/> <span>备注</span> <input class="easyui-validatebox" id="vremarkUpd" name="vremark" maxlength="20"/>
*/
*/
1 function calculateNyingshoumny ( ){
1 2 3 4 var nprice = $('#npriceUpd' ).val ();var idaynum = $("#idaynumUpd" ).val ();
1 2 3 4 var npriceFlag = validateNprice (npriceStr);if (!npriceFlag) { return false ;
}
1 2 var idaynumFlag = validateIdaynum (idaynum);
1 2 //验证是否通过 if (!(npriceFlag&&idaynumFlag)) {
}
1 2 //应收金额计算并赋值显示 nyingshoumny = (parseFloat(npriceStr) * parseInt(idaynum)).toLocaleString();
1 2 3 if (nyingshoumny.indexOf(",") != -1 ) { $("#nyingshoumnyUpd").val(nyingshoumny.replaceAll(/,/,"")); $("#nyingshoumnyUpd").val(nyingshoumny);
}
}
*/
1 function validateNprice (nprice ){
1 2 3 //1。验证为空字符串 if ("" == npriceStr) { $.messager.alert('提示',"价格/天不可为空,请输入!");
}
1 2 3 4 5 var npriceReg = /^\d+(\.\d+)?$/ ; if (nprice.match (null == npriceReg)){ $.messager.alert ('提示' ,"价格/天必须为数字,请重新输入!" ); $('#npriceUpd' ).val ("" );
}
1 2 var npriceStr = eval (nprice).toFixed (2 );
1 $("#npriceUpd").val(npriceStr);
1 2 var reg = /(?!0+$)^[+-]?\d{0,9}(.\d{1,2})?$/ ;
1 2 if(null == npriceStr.match(reg)){ $.messager.alert('提示',"价格/天必须为正负数且两位小数,整数位不能大于9位,请重新输入!");
}
}
*/
1 function validateIdaynum (idaynum ){
1 2 if ("" == idaynum) { $.messager.alert('提示',"天数不可为空,请输入!");
}
1 2 3 4 var idaynumReg = /^\d+$/g ; if (null == idaynum.match (idaynumReg)){ $.messager.alert ('提示' ,"天数必须为正整数,请重新输入!" ); $('#idaynumUpd' ).val ("" );
}
1 2 var reg = /^[1-9]\d{0,28}?$/ ;
1 2 if(null == idaynum.match(reg)){ $.messager.alert('提示',"天数必须为正整数且长度不能大于28位,请重新输入!");
}
}
*/
1 2 var nyingshoumny = $("#nyingshoumnyUpd" ).val ();
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 @Service public class AccountCoachServiceImpl implements AccountCoachService { private Json verifyAccountCoach (FmAccountCoachDto dto) throws Exception{ Json json = new Json (); String idaynum = dto.getIdaynum(); String nprice = dto.getNprice(); String vremark = dto.getVremark(); BigDecimal bigDecimal = new BigDecimal (nprice); BigDecimal npriceDou = bigDecimal.setScale(2 , BigDecimal.ROUND_HALF_UP); BigDecimal nyingshoumny = (new BigDecimal (nprice)).multiply(new BigDecimal (idaynum)); DecimalFormat myformat=new java .text.DecimalFormat("0.00" ); String nyingshoumnyStr = myformat.format(nyingshoumny); accountCoach.setNyingshoumny(new BigDecimal (nyingshoumnyStr)); if ("" .equals(vremark) && vremark.trim().getBytes("GBK" ).length > 20 ) { json.fail(); json.setInfo("备注的长度不可超过20位,请重新输入!" ); return json; } }
二、分页方法重写 EasyUI的DataGrid组件默认的分页功能在某些场景下可能无法满足需求,比如需要在前端进行分页处理、自定义分页逻辑等。本节介绍如何重写分页方法,实现自定义分页功能。
数据量较小,需要在前端进行分页 需要自定义分页显示逻辑 需要动态调整分页参数 1 2 3 /** * 加载列表数据 * @param data
*/
1 function loadDatagrid (data ){
1 2 3 4 5 6 7 8 9 10 11 12 13 $("#list_datagrid").datagrid({ fitColumns:false, striped:true, rownumbers:true, nowrap:true, singleSelect:false, serialCtrl:true, pagination:true, pageSize:10, pageList:[10,20,30], onClickCell: onClickCell, data:data.slice(0,10) });
1 2 //分页处理 pagerFilter(data);
}
*/
1 function pagerFilter (data ){
1 2 3 4 5 6 7 var pager = $("#list_datagrid" ).datagrid ("getPager" ); pager.pagination ({ total :data.length , onSelectPage :function (pageNo, pageSize ) { var start = (pageNo - 1 ) * pageSize; var end = start + pageSize; $("#list_datagrid" ).datagrid ("loadData" , data.slice (start, end));
1 2 3 4 5 6 var rowNumbers = $('.datagrid-cell-rownumber' );$(rowNumbers).each (function (index ){ var row = parseInt ($(rowNumbers[index]).html ()) + parseInt (start); $(rowNumbers[index]).html ("" ); $(rowNumbers[index]).html (row); });
1 2 3 4 pager.pagination('refresh', { pageNumber:pageNo }); });
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ### 三、日历框方法重写 EasyUI的DateBox和DateTimeBox组件提供了丰富的日期选择功能,但在实际项目中,我们经常需要自定义日期格式、限制日期范围、只显示年月等特殊需求。本节介绍如何重写日历框方法,实现这些自定义功能。 常见需求: - 只显示年月,不显示日期 - 自定义日期时间格式 - 设置默认时间范围 - 限制可选日期范围 <div class="query_ipt font_sz12 font_clr66"> <span class=" " >运费月份</span> <input class="easyui-datebox" id="month" name="month" data-options="editable:false"> <span class="autoStyle"><span class="font_clred font_sz14">*</span>创建时间从</span> <input class="easyui-datetimebox start" id="startDate" data-options="formatter:ww3,parser:w3,editable:false,required:true" > <span class="autoStyle"><span class="font_clred font_sz14">*</span>创建时间到</span> <input class="easyui-datetimebox end" id="endDate" data-options="formatter:ww3,parser:w3,editable:false,required:true" >
*/
1 2 //加载日历-年月 doDatebox("month");
1 2 //初始化默认时间 getDateForMat('startDate','endDate');
1 2 //初始化日历框内时间 InitiTime('startDate','endDate');
1 2 3 4 /** * 日历控件修改-只显示年月 * @param dateboxId 日历控件id * @param callBack 回调函数,参数为选中的日期,可以做后期处理,可以不传
*/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function doDatebox (dateboxId,callBack ){ $('#' +dateboxId).datebox ({ onShowPanel : function ( ){ span.trigger ('click' ); if (!tds) setTimeout (function ( ) { tds = p.find ('div.calendar-menu-month-inner td' ); tds.click (function (e ) { e.stopPropagation (); var year = /\d{4}/ .exec (span.html ())[0 ] , month = parseInt ($(this ).attr ('abbr' ), 10 ); $('#' +dateboxId).datebox ('hidePanel' ) .datebox ('setValue' , year + '-' + month); if (undefined != callBack){ callBack (new Date (year + '-' + month));
}
1 2 3 }); }, 0); yearIpt.unbind();//解绑年份输入框中任何事件
},
1 2 3 4 parser : function (s ) { if (!s) return new Date (); var arr = s.split ('-' ); return new Date (parseInt (arr[0 ], 10 ), parseInt (arr[1 ], 10 ) - 1 , 1 );
},
1 2 formatter : function (d ) { return d.getFullYear () + '-' + (d.getMonth () + 1 ); } });
1 2 3 4 var p = $('#' +dateboxId).datebox ('panel' ), tds = false , yearIpt = p.find ('input.calendar-menu-year' ), span = p.find ('span.calendar-text' );
}
1 2 3 4 /** * 初始化默认时间 * @param startTime * @param endTime
*/
1 2 3 4 5 6 7 8 9 function getDateForMat (startTime , endTime ){ function getNowFormatDate ( ) { var date = new Date (); var seperator1 = "/" ; var seperator2 = ":" ; var month = date.getMonth () + 1 ; var strDate = date.getDate (); if (month >= 1 && month <= 9 ) { month = "0" + month;
}
1 2 if (strDate >= 0 && strDate <= 9) { strDate = "0" + strDate;
}
1 var currentdate = date.getFullYear () + seperator1 + month + seperator1 + strDate
+ "/ " + "00" + seperator2 +"00"
1 2 + seperator2 + "00"; return currentdate;
}
1 function getNowFormatDate2 ( ) {
}
}
+ "/ " + "23" + seperator2 +"59"
}
1 2 3 4 5 6 function time ( ){ var h = date.getHours (); var min = date.getMinutes (); var sec = date.getSeconds (); var str = (h<10 ?('0' +h):h)+':' +(min<10 ?('0' +min):min)+':' +(sec<10 ?('0' +sec):sec); return str;
}
1 2 3 4 $('#' +startTime).datetimebox ({ value :getNowFormatDate (), onShowPanel :function ( ){ $(this ).datetimebox ("spinner" ).timespinner ("setValue" ,time ());
}
1 2 $('#'+endTime).datetimebox({ value : getNowFormatDate2(),
}
*/
1 function InitiTime (startTime,endTime ){
1 2 required : false, $(this).datetimebox("spinner").timespinner("setValue","00:00:00");
}
1 2 }); $(this).datetimebox("spinner").timespinner("setValue","23:59:59");
}
}
1 2 3 /** * 加载格式化日历当前2018/01/05/ 00:00:00 - 2018/01/05/ 23:59:59 * @param date
*/
1 2 3 4 5 function ww3 (date ){ var y = date.getFullYear (); var m = date.getMonth ()+1 ; var d = date.getDate (); var str = y+'/' +(m<10 ?('0' +m):m)+'/' +(d<10 ?('0' +d):d)+'/' +' ' +(h<10 ?('0' +h):h)+':' +(min<10 ?('0' +min):min)+':' +(sec<10 ?('0' +sec):sec);
}
*/
1 2 3 4 5 6 7 8 9 10 11 function w3 (s ){ var y = s.substring (0 ,4 ); var m =s.substring (5 ,7 ); var d = s.substring (8 ,10 ); var h = s.substring (11 ,14 ); var min = s.substring (15 ,17 ); var sec = s.substring (18 ,20 ); if (!isNaN (y) && !isNaN (m) && !isNaN (d) && !isNaN (h) && !isNaN (min) && !isNaN (sec)){ return new Date (y,m-1 ,d,h,min,sec); } else { return new Date ();
}
本文标题: EasyUI部分问题总结技
发布时间: 2023年01月10日 00:00
最后更新: 2025年12月30日 08:54
原始链接: https://haoxiang.eu.org/e6460db3/
版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0 许可协议,转载请注明出处!