昨天碰到一个问题,公司前端使用的是easyui和jquery,页面textarea编写了html代码,传入后台变成了<>类型代码,这样保存到数据库是没有问题的,但是在页面显示的时候需要显示原来用户输入的<>这样的字符,当然前端获取到数据的时候是<>这样的字符的时候会自动解析成我们想要的格式,但是当进入编辑textarea的时候数据会变成数据库中存储的<>形式的字符串,则需在easyui进入编辑------$(’#dataGrid’).datagrid(‘beginEdit’,index);----之前将显示的字段转移成html类型的字符串。方法如下:
// 转意符换成普通字符
function escape2Html(str) {
var arrEntities={'lt':'<','gt':'>','nbsp':' ','amp':'&','quot':'"'};
return str.replace(/&(lt|gt|nbsp|amp|quot);/ig,function(all,t){return arrEntities[t];});
}
当鼠标失去焦点的时候会触发保存事件,以及onDblClickCell(index,field)事件,在$(’#dataGrid’).datagrid(‘acceptChanges’);执行之后在textarea中边将原来转换成html代码解析成html则不会显示类似于字符串的html标签。而是将该字符串当成代码解析完成。所以此时需要将上次点击行中的数据转义成普通字符。
// 转意符换成普通字符
function escape2Html(str) {
var arrEntities={'lt':'<','gt':'>','nbsp':' ','amp':'&','quot':'"'};
return str.replace(/&(lt|gt|nbsp|amp|quot);/ig,function(all,t){return arrEntities[t];});
}
但是仅仅这样并不能解决问题,我使用的是这个来替代上一次点击行中的文本,如下:
$("[field='字段值']").eq(protoIndex).find("div").eq(0).text(escape2Html(字段值));
类似于后台html之间的转换可以使用org.apache.commons.lang.StringEscapeUtils类来进行转换。
// 去掉html标签
function removeHtmlTab(tab) {
return tab.replace(/<[^<>]+?>/g,'');//删除所有HTML标签
}
// 转成空格
function nbsp2Space(str) {
var arrEntities = {'nbsp' : ' '};
return str.replace(/&(nbsp);/ig, function(all, t){return arrEntities[t]})
}
// 回车转为br标签
function return2Br(str) {
return str.replace(/\r?\n/g,"<br />");
}
// 去除开头结尾换行,并将连续3次以上换行转换成2次换行
function trimBr(str) {
str=str.replace(/((\s| )*\r?\n){3,}/g,"\r\n\r\n");//限制最多2次换行
str=str.replace(/^((\s| )*\r?\n)+/g,'');//清除开头换行
str=str.replace(/((\s| )*\r?\n)+$/g,'');//清除结尾换行
return str;
}
// 将多个连续空格合并成一个空格
function mergeSpace(str) {
str=str.replace(/(\s| )+/g,' ');
return str;
}