![]() |
| extension | mime-type |
| xpi | application/x-xpinstall |
| crx | application/x-chrome-extension |
如果服务器是JBoss,虚拟目录名的后缀须为".war";
在Win2000的IIS下,需要将文件index.htm改名为default.htm| 文件名 | 用途 | 文件尺寸 | |
| 核心包 | supcan.xpi | 用于 浏览器的Plug-in插件 | 110k |
| supcan.crx | 用于 浏览器的Plug-in插件 | 120k | |
| supcan2.cab | 用于 浏览器的加载项 | 120k | |
| supcan2.x64.cab | 用于64位 浏览器的加载项 | 140k | |
| BCV1.bin | 硕正树列表、自由表头等基础功能组件 (7z压缩包) | 680k | |
| LuxForm.bin | 硕正报表组件 (7z压缩包) | 420k | |
| License.bin | 授权证书包 | 1k | |
| 可选包 | BCV4.bin | 硕正Freeform设计器 (7z压缩包) | 60k |
| gzip.bin | 让硕正套件能读取后端gzip压缩后的数据 注:首次使用时能自动下载 | 16k | |
| msoffice.bin | 用于读写Excel 2007 注:首次使用时能自动下载 | 50k | |
| LuxFormC.bin | 用于Report的申报模式 注:首次使用时能自动下载 | 30k | |
| WebFile.bin | 用于文件的上传下载 注:首次使用时能自动下载 | 20k | |
| barcode.cab | 用于显示条形码 注1:首次使用时能自动下载; 注2:该文件不在zip包中, 需要您单独到 www.supcan.cn 下载区的 "其它第三方功能组件" 中去下载, 再将其部署到binary目录; 注3.条形码功能不支持64位浏览器; | 1.1M | |
| 64位包 | 同名的 *.x64.bin | 用于64位IE浏览器 | 约1.7M |
doc 须整个子目录拷贝走,相对目录须 bin 文件所在的子目录并列;
部署到其它服务器时,别忘了配置 MIME 类型.
、
浏览器,将会自动分别下载 supcan.xpi、supcan.crx插件,该插件的type为:
浏览器,下载的是 supcan2.cab 加载项(即ActiveX),其CLSID为:
浏览器,下载的是 supcan2.x64.cab 加载项(即ActiveX),其CLSID为:

<Object id=? width=? height=? type="application/supcan-plugin" Codebase="supcan.xpi">
<Object id=? width=? height=? type="application/supcan-plugin" Codebase="supcan.crx">
<Object id=? width=? height=? CLASSID="clsid:619F1AC0-2644-40D3-9EB1-22F81C5FE097" Codebase="supcan2.cab#Version=1,0,0,3">
(64位)<Object id=? width=? height=? CLASSID="clsid:11249C26-4BCD-4A74-B4D9-068936D77EFE" Codebase="supcan2.x64.cab#Version=1,0,0,3"> <Param name="CtlName" value="?"> <Param name="CtlVersion" value="?"> <Param name="ZipUrl" value="?"> <Param name="CtlPara" value="?"> <Param name="DownloadOnly" value="?"> <Param name="Cookie" value="?"> //for
、
Only <Param name="id" value="?"> //for
Only </Object>
第1、2、3、4行中的 Codebase 是 xpi包 / crx包 / cab包的URL,可以是绝对URL,也可以是当前页面的相对URL;| 参数名 | 含义 | 可用值 | 默认值 |
| CtlName | 功能组件名 | 取决于具体组件的规范 | |
| CtlVersion | 组件版本号。版本号很重要,决定了功能组件的自动升级更新。 | 诸如“1.0.1.0”等,以“.”分隔 | |
| ZipUrl | 组件所在的压缩包的URL,多个URL之间以逗号分隔。 即告诉插件/加载项,到哪里去下载组件包 | 可以是绝对URL,也可以是相对URL | |
| CtlPara | 初始参数。即告诉插件/加载项,如何创建功能组件实例。 | 取决于具体组件的规范 | |
| DownloadOnly | 是否仅仅下载组件。如果仅是下载,那么将不创建组件实例。 该参数不太常用. | 1/0 - 是/否 | 0 |
| Cookie | 用于 、 ,使得插件和功能组件向服务器发送的Http请求能和页面共享同一个Session,保证了数据传输的安全。备注:IE浏览器中的加载项和组件肯定能和页面共享Session,故不需要此参数 | 通常为document.cookie | |
| id | 用于 ,告诉加载项当前实例的id.备注:FireFox、Chrome插件能通过NPAPI取得<object id=...>中的id,故不需要此参数 | 必须和<object id=? ...>一致 |
//区分浏览器(Firefox / Chrome / IEx86 / IEx64)
var $agnt=navigator.userAgent.toLowerCase();
var $isChrome = false, $is64 = false;
var $isIE = ($agnt.indexOf("msie")>0) ? true : false;
if($isIE) {
if($agnt.indexOf("win64")>=0 || $agnt.indexOf("x64")>=0) $is64 = true;
}
else {
if($agnt.indexOf("chrome")>0) $isChrome = true;
}
//private:
function bldStr(ctlType, id, para)
{
//!!!!组件版本号,升级后须修改!!!
var ctlver = '1.0.75.0';
//取得组件包的绝对路径(假设和dynaload.js部署在同一个目录)
var SupcanPath="", arrScript = document.getElementsByTagName("script");
for(var i=0; i= 0) {
SupcanPath = src.substring(0, index);
if(SupcanPath.charAt(0) == '/') {
src = location.href;
index = src.indexOf('//');
if(index != -1) {
index = src.indexOf('/', index+2);
if(index != -1) src = src.substring(0, index);
SupcanPath = src + SupcanPath;
}
}
break;
}
}
var typeid;
if($isIE) {
if($is64)
typeid = 'CLASSID="clsid:11249C26-4BCD-4A74-B4D9-068936D77EFE" Codebase="' +SupcanPath+ 'supcan2.x64.cab#Version=1,0,0,3"';
else
typeid = 'CLASSID="clsid:619F1AC0-2644-40D3-9EB1-22F81C5FE097" Codebase="' +SupcanPath+ 'supcan2.cab#Version=1,0,0,3"';
}
else {
typeid = 'type="application/supcan-plugin"';
if($isChrome==false) typeid += ' Codebase="' +SupcanPath+ 'supcan.xpi"';
}
//组件包URL
var zipurl = SupcanPath + ($is64 ? "BCV1.x64.bin" : "BCV1.bin");
if(ctlType=="LuxForm")
zipurl += "," +SupcanPath+ ($is64 ? "LuxForm.x64.bin" : "LuxForm.bin");
else if(ctlType.indexOf("BCV4")>=0)
zipurl += "," +SupcanPath+ ($is64 ? "BCV4.x64.bin" : "BCV4.bin");
var str = '<Object id=' +id+ ' Width=100% height=100% ' +typeid+ '>';
str += '<param Name="CtlName" Value="' +ctlType+ '">';
str += '<param Name="CtlVersion" Value="' +ctlver+ '">';
str += '<param Name="ZipUrl" Value="' +zipurl+ '">';
str += '<param Name="id" Value="' +id+ '">';
str += '<param Name="Cookie" Value="' +document.cookie+ '">';
str += '<param Name="CtlPara" Value="' +para+ '"></Object>';
return str;
}
//public:
function insertTreeList(id, para) { document.write( bldStr("BCV1.TreeList",id, para) ) }
function insertEdit(id, para) { document.write( bldStr("BCV1.Edit", id, para) ) }
function insertReport(id, para) { document.write( bldStr("LuxForm", id, para) ) }
function insertTree(id, para) { document.write( bldStr("BCV1.Tree", id, para) ) }
function insertFreeForm(id, para) { document.write( bldStr("BCV1.FreeForm",id, para) ) }
function insertChart(id, para) { document.write( bldStr("BCV1.Chart", id, para) ) }
function insertUpload(id, para) { document.write( bldStr("BCV1.Upload", id, para) ) }
function insertFormDesigner(id, para) { document.write( bldStr("BCV4.FormDesigner",id, para) ) }
//必需的函数(控件会反向调用,用途:切换焦点)
function focusIE(obj_or_id)
{
if($isIE==false) {
document.activeElement.blur();
return;
}
try {
if(typeof(obj_or_id)=='object') {
if(document.activeElement != obj_or_id) obj_or_id.focus();
}
else {
if(document.activeElement.id == obj_or_id) return;
var o = document.getElementById(obj_or_id);
if(o != null) o.focus();
}
}
catch(e) {
}
}
相信您一看就能明白,在页面中只要调用从65到72行之间的任一函数就行,这几个函数都只有2个参数:id、para,参数id就是<object id=...>中的id值,参数para就是名为CtlPara的<Param>的值。
第16行中的版本号,该版本号是自动升级的关键.
其中的 focusIE( ) 是必需的,你可能永远不会去调用它,但是组件会去反向调用它的.
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=GB2312">
<!--引用dynaload.js。后面的"?20"是让浏览器及时刷新的时间戳,请参见“常见问题解答”-->
<script type='text/javascript' src='binary/dynaload.js?20'></script>
</head>
<body>
<script>insertReport('AF', '')</script> //AF是Object的id号、第二个参数为空表示没有初始参数
</body>
</html>
你将在页面上看到一个空的硕正报表,一切就那么简单!
如果您是用Java EE、ASP.Net开发的,把上面的 html 文件修改成 jsp 或 aspx 应该是轻而易举的事.
...
<tr height="400">
<td height="400">
<script>insertReport('AF', '')</script>
</td>
</tr>
...
1.要求显式定义<tr>的 height 高度,如同上例.
2.在IE 10浏览器中,<td>都需要显式定义 height 高度.
<div style="position:relative;width:96%;height:400px">
<script>insertReport('AF', '')</script>
</div>
<div>的 width 可以用px单位,也可以用百分比;
<div>的 height高度必须用px单位,如同上例, 千万不要用百分比, 否则会出现奇怪的现象,比如控件经常会显示不出来.
如果您把 插件/加载项 安置在<Form>中,在IE下可能会遇到问题,请参见底下的“9.不同浏览器之间的一些差别”.|
string func(string funcname, string para); 参数funcname:字符串,是组件的真正的函数名,请参见具体组件的规范; 参数para:字符串,参数,如果组件需要传入多个参数,那么以回车符(\r\n)分隔,请参见具体组件的规范; 返回值:字符串,具体含义请参见组件的规范; |
//要求组件执行print('A', 'B', 'C')函数,并将返回值赋给变量 s
var s=AF.func("print", "A\r\nB\r\nC");
//注1: AF为组件的id(<Object id=? ...>),在Firefox/Chrome中没有必要采用document.getElementById('AF');
//注2: para参数中A、B、C以回车分隔,表示实际传递了3个参数;
功能组件的函数是很丰富的,在各自的文档中有详细的介绍,在此不作叙述。
<script>
//OnReady 事件
//id参数说明:如果页面中有多个插件/加载项,那么OnReady事件会被触发多次,id就是插件/加载项的id
function OnReady( id )
{
//假如执行如下js
if(id=='AF') AF.func('ReadXML', 'index.XML');
}
//OnEvent 事件
//OnEvent参数说明: “Event”为事件名,p1,p2,p3,p4参数有特定的含义,由具体的功能组件规定.
function OnEvent(id, Event, p1, p2, p3, p4)
{
//假如执行如下js
if(id=='AF' && Event == "SelChanged") document.getElementById('Page1').src=p2;
}
</script>
对上例稍加分析,你会发现所谓“事件”只是普通的页面 js 函数,只不过这二个函数名被硕正插件/加载项占用了,当组件触发事件时,实际上就是由插件/加载项反向调用页面的 js 函数而已!
、
和
是没有差别的。
<meta http-equiv="content-type" content="text/html; charset=gb2312"> //或 <meta http-equiv="content-type" content="text/html; charset=utf-8">否则页面调用插件的函数时,参数中的中文很可能会变成乱码.
...
function OnReady(id)
{
AF.func("Build", "g1.xml");
}
...
<form name="form1">
<script>insertReport('AF', '')</script>
</form>
...
IE执行到第4行会抛出 'AF'未定义的错误,此时改成如下写法就能成功:
...
function OnReady(id)
{
form1.AF.func("Build", "g1.xml");
}
...
当然,您也可以把 上面insertReport( )的语句移出form,这样就不会有这个问题了。