ExtJS 4.2含反斜杠实体编码前端正确显示方法求助
解决ExtJS Panel中"\1014"被解析为"A4"的前端处理方案
这个问题的核心原因是JavaScript会自动解析字符串中的八进制转义序列:\101是八进制表示的ASCII字符(对应十进制65,也就是大写字母A),所以"\1014"会被直接解析成"A4"。要在前端正确显示原始的\1014,可以从数据获取和编码处理两个层面入手,下面是具体的解决方法:
一、确保拿到原始未解析的字符串
首先要避免JavaScript提前解析转义序列,这取决于你的数据获取方式:
1. AJAX请求获取纯文本
如果后端返回的是纯文本(而非JSON),直接设置responseType: 'text'获取原始内容,这样拿到的就是包含\1014的完整字符串,不会被提前解析:
Ext.Ajax.request({ url: '你的接口地址', responseType: 'text', // 关键:获取原始文本 success: function(response) { var rawValue = response.responseText.trim(); // 后续处理... } });
2. 处理未正确转义的JSON
如果后端返回的是JSON,但没有对反斜杠做转义(导致JSON解析后直接变成A4),可以在解析JSON前手动修复响应文本,把单个反斜杠替换为双重反斜杠(避免JSON解析器处理转义序列):
Ext.Ajax.request({ url: '你的接口地址', success: function(response) { // 替换所有未被转义的单个反斜杠 var fixedResponse = response.responseText.replace(/\\(?!\\)/g, '\\\\'); var data = JSON.parse(fixedResponse); var rawValue = data.targetField; // 现在拿到的是原始的"\1014" // 后续处理... } });
注意:这个方法是临时hack,只适用于确定没有其他合法转义序列(比如
\n、\t)需要保留的场景,否则会破坏原有格式。
二、用ExtJS工具类编码后渲染
拿到原始字符串后,使用Ext.util.Format.htmlEncode()对其进行HTML编码,这样反斜杠会被转换成HTML实体\,在Panel中就能正确显示为\1014:
// 假设已经拿到原始的"\1014"字符串 var encodedStr = Ext.util.Format.htmlEncode(rawValue); // 创建Panel并渲染 Ext.create('Ext.panel.Panel', { renderTo: Ext.getBody(), width: 200, height: 100, html: encodedStr // 这里会显示\1014而不是A4 });
关键提醒
最稳妥的方案其实是后端对字符串进行正确转义(在JSON中用\\1014代替\1014),因为前端的hack方法可能存在兼容性或副作用问题。但如果后端无法修改,上述前端方案可以解决你的问题。
内容的提问来源于stack exchange,提问作者Black
相关产品推荐
相关产品推荐

