历史版本13 :Web传递中文参数 返回文档
编辑时间:
内容长度:图片数:目录数:
修改原因:
1. 问题描述编辑
给iframe设置src嵌入某个报表时,往往会给报表传递初始的参数值,例如:
<iframe id="reportFrame" width="900" height="400" src="/webroot/decision/view/report?viewlet=/report.cpt&参数1=参数值&参数2=参数值..."></iframe>
若参数名称、参数值甚至报表名称中包含中文或者特殊字符时,如果不进行编码转换,可能会出现一系列问题,如找不到模板文件等,如下。
那么如何实现带中文的报表正确传参呢
2. 实现思路编辑
使用cjkEncode对调用报表的路径或参数进行编码,报表获取到参数后会自动进行解码,保证不会出现乱码等一系列情况。
cjkEncode是FR内部封装好的编码方法,在js中使用cjkEncode有两种方式,一种是引用finereport.js,一种是直接定义cjkEncode方法,该节我们举例介绍。
3. 实现方法编辑
3.1 方法一
在页面中引入finereport.js文件,引入方式如下
<script type="text/javascript" src="/webroot/decision/view/report?op=emb&resource=finereport.js"></script>
encodeURI可以对中日韩文字符进行编码,如下对调用报表的url进行encodeURI,html代码如下
<html>
<head>
<title>FineReport Demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<script type="text/javascript" src="/webroot/decision/view/report?op=emb&resource=finereport.js"></script>
<script language="javascript">
function autoLoad(){
var addr = encodeURI("/webroot/decision/view/report?viewlet=GettingStarted.cpt&地区=华北");
document.getElementById("reportFrame").src = addr;
}
window.onload = autoLoad;
</script>
</head>
<body>
<iframe id="reportFrame" width="900" height="400" ></iframe>
</body>
</html>
已完成示例请参照%FR_HOME%/webapps/webroot/help/page_demo/parameter_ch.html
在线查看示例效果请点击parameter_ch.html
finereport.js使用的是jquery框架,若用户也使用了jquery,可能会造成冲突,这时建议不要引入finereport.js,而是将encodeURI方法拷贝到页面中直接使用,详见下面的方法。
在线查看示例效果请点击parameter_ch.html
finereport.js使用的是jquery框架,若用户也使用了jquery,可能会造成冲突,这时建议不要引入finereport.js,而是将encodeURI方法拷贝到页面中直接使用,详见下面的方法。
3.2 方法二
加载finereport.js再引用encodeURI,一方面可能会引起js冲突,另一方面也加载了很多不必要的方法。
若用户只需要使用该方法,可以将encodeURI实现的代码复制到网页中或者用户自己的js文件中,然后再引用encodeURI。
<html>
<head>
<title>FineReport Demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<script type="text/javascript">
//encodeURI方法的实现代码,放在网页head中或者用户自己的js文件中
function encodeURI(text) {
if (text == null) {
return "";
}
var newText = "";
for (var i = 0; i < text.length; i++) {
var code = text.charCodeAt (i);
if (code >= 128 || code == 91 || code == 93) { //91 is "[", 93 is "]".
newText += "[" + code.toString(16) + "]";
} else {
newText += text.charAt(i);
}
}
return newText;
}
function autoLoad() {
var addr = encodeURI("/webroot/decision/view/report?viewlet=GettingStarted.cpt&地区=华北");
document.getElementById("reportFrame").src = addr;
}
window.onload = autoLoad; //加载网页时调用autoLoad方法
</script>
</head>
<body>
<iframe id="reportFrame" width="900" height="400" ></iframe>
</body>
</html>
注:不支持【UTF-8无BOM】的编码格式。