easyui前後臺轉義字符和普通字符的相互轉換問題
昨天碰到一個問題,公司前端使用的是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;
}
easyui前後臺轉義字符和普通字符的相互轉換問題